类的 Python repr

Jan*_*nar 8 python

正如Python 2 文档所述__repr__

如果可能的话,这个(即__repr__)应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值的对象(给定适当的环境)。

那么为什么类的内置函数__repr__不按照该准则行事呢?

例子

>>> class A(object):
...   pass
>>> repr(A)
"<class 'A'>"
Run Code Online (Sandbox Code Playgroud)

为了满足准则,默认__repr__应返回"A",即通常为A.__name__。为什么它的行为不同?我相信,这将非常容易实施。


编辑:“复制”的范围

我可以在答案中看到,讨论中并不清楚repr应该返回什么。在我看来,该repr函数应该返回一个允许您重现该对象的字符串:

  1. 在任意上下文中并且
  2. 自动(即非手动)。

广告1。看一下内置的类案例(取自这个SO问题):

>>> from datetime import date
>>>
>>> repr(date.today())        # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
Run Code Online (Sandbox Code Playgroud)

显然,假设的上下文就像您使用 import 的基本形式,即import datetime,因为如果您尝试eval(repr(date.today()))datetime将不会被识别。所以重点是__repr__不需要从头开始表示对象。如果它在社区同意的上下文中是明确的就足够了,例如使用直接模块的类型和函数。听起来很合理,对吧?

广告2。我相信,仅仅给出如何重建物体的印象还不够repr。有助于调试是str.

结论

所以我期望的repr是允许我eval对结果进行处理。对于类,我不希望获得从头开始重建类的整个代码。相反,我希望对我的范围内可见的类有明确的引用。就"Module.Class"足够了。无意冒犯,Python,但"<class 'Module.Class'>"它不仅仅只是削减它。

NPE*_*NPE 0

由于当类的定义不可用时,"<class 'A'>"和 都"A"不能用于重新创建类,所以我认为这个问题没有实际意义。