Accessing overridden __builtin__s?

bruno at modulix onurb at xiludom.gro
Tue Mar 14 08:37:39 EST 2006


Steven D'Aprano wrote:
> On Mon, 13 Mar 2006 21:28:06 -0800, garyjefferson123 wrote:
> 
> 
>>I'm having a scoping problem.  I have a module called SpecialFile,
>>which defines:
>>
(snip code)

>>The problem, if it isn't obvioius, is that the open() call in __init__
>>no longer refers to the builtin open(), but to the module open().
> 
> 
> In your code, open() is not a module, it is a function.

Steven, it seems clear that the OP knows that already. Try reading the
previous sentence as:
"""
The problem, if it isn't obvioius, is that the open() call in __init__
no longer refers to the builtin's open(), but to the module's open().
"""

Does it make more sens ?-)

> A better technique will be to turn open into a method of the class
> SpecialFile, rather than a bare function. That way you keep open() the
> built-in function separate from SpecialFile.open().
> 
> 
>>So, if I do:
>>
>>f = SpecialFile.open(name, mode)
>>
>>I get infinite recursion.
> 
> 
> I see you are already using an open method. 

There again, you may want to read more carefully: SpecialFile is *also*
the module's name - which, I agree, is not pythonic.

(snip)

> 
> I would handle it like this:
> 
> class SpecialFile(object):
>     def __init__(self, fname, mode='r'):
>         self.fname = fname
>         self.mode = mode
>     def open(self):
>         self.f = open(self.fname, self.mode)
>     def close(self):
>         self.f.close()
>     def read(self):
>         return self.f.read()
>     def write(self, data):
>         self.f.write(data)
> 
> You use it like so:
> 
> sf = SpecialFile("hello.txt")
> sf.open()
> data = sf.read()
> sf.close()

Small variant, more builtins-open-like, and taking full advantage of
Python's delegation mechanism:

class SpecialFile(object):
    def __init__(self, fname, mode='r'):
        self.fname = fname
        self.mode = mode
        self._file = open(self.fname, self.mode)

    def __getattr__(self, name):
	return getattr(self._file)

which allows:

sf = SpecialFile("hello.txt")
# then use it just like any other file object

My 2 cents
-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list