2013-08-30 2 views
1

Может кто-нибудь объяснить мне, почему в примере ниже, print a вызывает исключение, а a.__str__() - нет?Python unicode error

>>> class A: 
... def __init__(self): 
...  self.t1 = "čakovec".decode("utf-8") 
...  self.t2 = "tg" 
... def __str__(self): 
...  return self.t1 + self.t2 
... 
>>> a = A() 
>>> print a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u010d' in position 0: ordinal not in range(128) 
>>> a.__str__() 
u'\u010dakovectg' 
>>> print a.__str__() 
čakovectg 

ответ

6

В Python 2 str должен возвращать строку ASCII. Когда вы вызываете __str__ прямо, вы пропускаете шаг Python, преобразовывая вывод __str__ в строку ASCII (вы действительно можете вернуть все, что хотите, от __str__, но не должны). __str__ не должен возвращать объект unicode, он должен вернуть объект str.

Вот что вы можете сделать вместо этого:

In [29]: class A(object): 
    ...:  def __init__(self): 
    ...:   self.t1 = u"c∃".encode('utf8') 
    ...:  def __str__(self): 
    ...:   return self.t1 
    ...:  

In [30]: a = A() 

In [31]: print a 
c∃ 

In [32]: str(a) 
Out[32]: 'c\xe2\x88\x83' 

In [33]: a.__str__() 
Out[33]: 'c\xe2\x88\x83' 
Смежные вопросы