示例类如下所示,在python 2.7中
class Test(object):
def __repr__(self):
return u"Because He Lives 因他活着"
def f(self):
print(self)
如果我创建此类的实例foo
,则print(foo)
会出现unicode错误,但print(foo.__repr__())
或print(foo.__str__())
不会。我做错了吗?
答案 0 :(得分:1)
这是因为repr()
函数本身会尝试将Unicode返回值从自定义__repr__()
方法转换为str
对象,以确保repr()
只返回str
个值。
不幸的是,我现在无法从文档中找到相关的引用,或者我会链接它。但更确切地说,当调用__repr__()
时,Python期望它返回str
对象,除unicode
外,任何其他类型都会引发异常。 unicode
工作的唯一原因是因为Python 2 unicode
和str
对象之间的标准隐式强制,这种情况是透明的,直到它不是,就像在你的情况下一样
答案 1 :(得分:0)
print(obj)
将obj
转换为字符串。在您的情况下调用repr()
(因为未定义__str__
方法)。
repr()
必须返回str
类型。如果您拨打repr()
而不是__repr__()
,则通过使用{2}上应为ASCII的sys.getdefaultencoding()
字符编码自动编码来强制执行约束:
>>> class Test(object):
... def __repr__(self):
... return u"\N{SNOWMAN}" # non-ascii, unicode type
...
>>> Test().__repr__() # no error
u'\u2603'
>>> repr(Test()) # error, the restriction on the return type is enforced
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2603' in position 0:
ordinal not in range(128)