当print(inst)因unicode错误而失败时,为什么print(inst .__ repr __())成功?

时间:2016-06-08 02:41:12

标签: python-2.7 unicode

示例类如下所示,在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__())不会。我做错了吗?

2 个答案:

答案 0 :(得分:1)

这是因为repr()函数本身会尝试将Unicode返回值从自定义__repr__()方法转换为str对象,以确保repr()只返回str个值。

不幸的是,我现在无法从文档中找到相关的引用,或者我会链接它。但更确切地说,当调用__repr__()时,Python期望它返回str对象,除unicode外,任何其他类型都会引发异常。 unicode工作的唯一原因是因为Python 2 unicodestr对象之间的标准隐式强制,这种情况是透明的,直到它不是,就像在你的情况下一样

答案 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)