Gerard Brunick
3/6/2008 7:45:00 AM
Gary Herron wrote:
> 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
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?