__repr__ 应该返回字节还是 Unicode?

5
在Python 3和Python 2中,__repr__应该返回字节还是Unicode?最好提供参考资料和引用。
这里有一些关于2-3兼容性的信息,但我没有看到答案。

我的猜测是它不应该返回Unicode,因为repr()应该用于程序员(而不是用户),有些控制台不支持Unicode。 - paper man
2个回答

8

该类型为str(适用于Python 2.x和Python 3.x):

>>> type(repr(object()))
<class 'str'>

这是必须的,因为如果没有__str__,默认会调用__repr__,但__str__必须返回一个str。对于不了解的人来说,在Python3.x中,str是表示Unicode的类型。在Python2.x中,str是表示字节的类型。

7
在Python3中,str是Unicode,而在Python2中,str是字节。我认为OP正在寻找这些细节。 - cowbert
@cowbert -- 不,str在两者中都是str。Python3没有Unicode类型(就像Python2没有字节类型一样)。从语义上讲,如果你想表达的是这个意思,Python3的str是Python2.x的unicode的功能等效物... - mgilson
4
@mgilson,OP 明显在询问 repr 是否返回一个具有字节或 Unicode 表示的对象,并且明显在关注 Py2 与 Py3 的差异。在 Py3 中,str 是一个 Unicode 对象。 - cowbert
5
可以说得更好一些。两者的数据类型都是“str”,但它们表示完全不同的含义...! - wim
1
同样值得注意的是:__str __()__repr __()的访问器要求返回类型设置为str。在Py3k中,我尝试覆盖__str __()__repr __()以返回b'',并且所有的print()(调用__str __()),str()repr()(调用__repr__())都会产生TypeError:... returned non-string (type bytes) - cowbert

1

在两种语言中都是str

Python 3.6.4 (default, Dec 21 2017, 18:54:30) 

>>> type(repr(()))
<class 'str'>

Python 2.7.14 (default, Nov  7 2017, 17:59:11) 
>>> type(repr(()))
<type 'str'>

(里面有一个元组。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接