print stream behavior

Peter Otten __peter__ at
Wed May 27 13:52:25 EDT 2009

Andreas Kraemer wrote:

> I don't understand the behavior of the print statement when streaming
> to a "file-like" object. From the documentation at
> I understand that the
> file-like object needs to have a write() method that - I assume - is
> called when the print statement is invoked. However, the piece of code
> below does not behave as I expect.
> F subclasses file and overwrites its write() method (simply printing
> out a message and then calling the superclass's write()). Calling
> write directly works as expected, using print does not.
> Can anybody shed some light on what's happening under the hood (or how
> to make it work with "print")?

This is a longstanding quirk of the CPython implementation. The 
PRINT_ITEM_TO opcode triggers a PyFile_WriteObject() call which in turn does 
the C equivalent of

if isinstance(f, file):
   file.write(f, s)
   write = getattr(f, "write")
Therefore subclasses of file will always use file.write() when invoked via 

You can avoid that by writing a wrapper instead of a subclass:

class File(object):
    def __init__(self, *args):
        self._file = open(*args)
    def write(self, s):
    # add other methods as needed


More information about the Python-list mailing list