print doesn't respect file inheritance?
Ethan Furman
ethan at stoneleaf.us
Fri Sep 5 15:49:49 EDT 2008
bukzor wrote:
> I was trying to change the behaviour of print (tee all output to a
> temp file) by inheriting from file and overwriting sys.stdout, but it
> looks like print uses C-level stuff to do its writes which bypasses
> the python object/inhertiance system. It looks like I need to use
> composition instead of inheritance, but thought this was strange
> enough to note.
>
> $python -V
> Python 2.5
>
> """A short demo script"""
> class notafile(file):
> def __init__(self, *args, **kwargs):
> readonly = ['closed', '__class__', 'encoding', 'mode', 'name',
> 'newlines', 'softspace']
> file.__init__(self, *args, **kwargs)
> for attr in dir(file):
> if attr in readonly: continue
> setattr(self, attr, None)
>
>
> def main():
> n = notafile('/dev/stdout', "w")
> print vars(n)
>
> import sys
> sys.stdout = n
> print "Testing: 1, 2, 3..."
>
>
> output:
> {'__str__': None, 'xreadlines': None, 'readlines': None, 'flush':
> None, 'close': None, 'seek': None, '__init__': None, '__setattr__':
> None, '__reduce_ex__': None, '__new__': None, 'readinto': None,
> 'next': None, 'write': None, '__doc__': None, 'isatty': None,
> 'truncate': None, 'read': None, '__reduce__': None,
> '__getattribute__': None, '__iter__': None, 'readline': None,
> 'fileno': None, 'writelines': None, 'tell': None, '__delattr__': None,
> '__repr__': None, '__hash__': None}
> Testing: 1, 2, 3...
I tried the code (on Windows, so had to change /dev/stdout to
/temp/notafile.txt) and it worked just fine. Perhaps the issue is that
n is being set to /dev/stdout instead of some other file so no
difference is apparent?
In other words, you're assigning stdout to stdout.
~Ethan~
More information about the Python-list
mailing list