Short confusing example with unicode, print, and __str__
Gary Herron
gherron at islandtraining.com
Wed Mar 5 13:52:44 EST 2008
Gerard Brunick wrote:
> I really don't understand the following behavior:
>
> >>> class C(object):
> ... def __init__(self, s): self.s = s
> ... def __str__(self): return self.s
> ...
> >>> cafe = unicode("Caf\xe9", "Latin-1")
> >>> c = C(cafe)
> >>> print "Print using c.s:", c.s
> Print using c.s: Café
> >>> print "Print using just c:", c
> Print using just c: 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)
> >>> str(c)
> 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 would "print c.s" work but the other two cases throw an exception?
> Any help understanding this would be greatly appreciated.
>
> Thanks in advance,
> Gerard
>
It's the difference between how __str__ and __repr__ act on strings.
Here's s simpler example
>>> d=unicode("Caf\xe9", "Latin-1")
>>> repr(d)
"u'Caf\\xe9'"
>>> 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)
Gary Herron
More information about the Python-list
mailing list