Short confusing example with unicode, print, and __str__

Peter Otten __peter__ at web.de
Thu Mar 6 03:13:52 EST 2008


Gerard Brunick wrote:

> It seems the question is more about what does print do.  Lets extend
> your example:
> 
> >>> d=unicode("Caf\xe9", "Latin-1")
> >>> repr(d)
> "u'Caf\\xe9'"
> >>> print d
> Café
> >>> str(d)
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in
> position 3: ordinal not in range(128)
> 
> Why doesn't the print statement that a UnicodeEncodeError?  I assumed
> that print calls str and then prints
> the result, but this doesn't seem to be the case.  What the heck does
> print do?

Something like

d = ...
if type(d) is unicode:
    sys.stdout.write(d.encode(sys.stdout.encoding))
else:
    sys.stdout.write(str(d))

Unfortunately you can't make that work smoothly with arbitrary objects as
you have to throw in an explicit conversion to unicode:

>>> class C(object):
...     def __unicode__(self): return u"Caf\xe9"
...
>>> print C()
<__main__.C object at 0x2b1da33e0bd0>
>>> print unicode(C())
Café

Or, even less intuitive:

>>> class D(object):
...     def __str__(self): return u"Caf\xe9"
...
>>> print unicode(D())
Café
>>> print D()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position
3: ordinal not in range(128)

Peter



More information about the Python-list mailing list