2013-08-30 84 views
1

有人能解释我为什么在下面的例子中,print a 引发异常,而a.__str__()不是?Python unicode错误

>>> 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'