作为Python 2对
为了符合指南, 默认的
显然,假定的上下文是你使用基本形式的导入,即
__repr__
文档的解释所述:
那么为什么类的内置如果可能的话,这个(即
__repr__
)应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(在适当的环境下)。
__repr__
没有按照这个准则行事呢?
示例
>>> class A(object):
... pass
>>> repr(A)
"<class 'A'>"
为了符合指南, 默认的
__repr__
应该返回 "A"
,通常是 A.__name__
。为什么它的行为不同?我相信这将非常容易实现。
编辑:'reproduction' 的范围
从回答中我可以看出,在讨论中并不清楚 repr
应该返回什么。在我看来,repr
函数应该返回一个字符串,使你能够复制对象:
- 在任意上下文中且
- 自动地(即非手动地)。
附录1:看一个内置类的情况(摘自 this 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
的目的是帮助调试。
结论
我希望从repr
中得到的结果能够让我在eval
中使用。对于类而言,我不想获取完整的代码以便从头开始重构类。相反,我想要在我的作用域中看到一个明确的类引用。 "Module.Class"
就足够了。不冒犯,Python,但是"<class 'Module.Class'>"
并不太合适。
type("A",(),{})
的东西:能够生成等同于A
的类的代码。正如mgilson所指出的那样,构建一个创建类的表达式(请注意,类通常是由class
语句定义的)是困难的。 - chepner