Why does Python do this?

Gre7g Luterman gre7g-d-1059579503.1d83b3 at wolfhome.com
Fri Jul 25 17:38:30 CEST 2003


I realize this is a rather queer example, but I would expect the
following two classes to act the same basic way.  Does anyone know why
they do not?

Python 2.2.2 (#3, Jun 16 2003, 19:11:56)
[GCC 2.96 20000731 (Mandrake Linux 8.2 2.96-0.76mdk)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> class a:
...   def __str__(self):
...     sys.stdout.write("written\n")
...     return "returned"
...
>>> class b:
...   def __str__(self):
...     print "printed"
...     return "returned"
...
>>> x=a(); y=b()
>>> print x
written
returned
>>> print y
 printed
returned

Note the extra space printed when I executed the "print y" command.

At first I thought it was just a quirk of the print command being
interrupted by another, but I don't think it is quite that simple.  Note
that:

>>> print str(x)
written
returned
>>> print str(y)
printed
returned
>>> print x.__str__()
written
returned
>>> print y.__str__()
printed
returned

work just as you might expect.

Here's another variation:

>>> import sys
>>> def a():
...   sys.stdout.write("written\n")
...   return "returned"
...
>>> def b():
...   print "printed"
...   return "returned"
...
>>> print a()
written
returned
>>> print b()
printed
returned

which works as expected.

So it only seems to happen when you interrupt a print statement with
another print statement during an implicit string conversion.

Any guesses?

Gre7g.





More information about the Python-list mailing list