如果可能的话, this (ie
__repr__
) 应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。
那么为什么内置__repr__
的类不符合该准则呢?
例子
>>> class A(object):
... pass
>>> repr(A)
"<class 'A'>"
为了符合准则,默认__repr__
应该返回"A"
,即一般A.__name__
。为什么表现不一样?我相信这将非常容易实施。
编辑:“复制”的范围
我可以在答案中看到,在讨论中不清楚repr
应该返回什么。在我看来,该repr
函数应该返回一个允许您重现对象的字符串:
- 在任意上下文和
- 自动(即不是手动)。
广告1。看看一个内置的类案例(取自这个 SO question):
>>> from datetime import date
>>>
>>> repr(date.today()) # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
显然,假设的上下文就好像您使用导入的基本形式,即import datetime
,因为如果您尝试eval(repr(date.today()))
,datetime
将不会被识别。所以重点是__repr__
不需要从头开始表示对象。如果它在社区同意的上下文中是明确的就足够了,例如使用直接模块的类型和功能。听起来很合理,对吧?
广告 2。repr
我相信,仅仅给出一个物体如何被重建的印象是不够的。有助于调试是str
.
结论
所以我期望的repr
是允许我对eval
结果做些什么。对于一个类,我不想获得从头开始重建类的整个代码。相反,我希望明确引用在我的范围内可见的类。"Module.Class"
就足够了。没有冒犯,Python,但"<class 'Module.Class'>"
不只是削减它。