gpt4 book ai didi

类的 Python repr

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:49 26 4
gpt4 key购买 nike

作为Python 2 documentation on __repr__ 状态:

If at all possible, this (i.e. __repr__) should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment).

那么内置__repr__怎么来的?对于类 不按照该准则行事?

例子

>>> class A(object):
... pass
>>> repr(A)
"<class 'A'>"

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


编辑:“复制”的范围

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

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

Ad.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__不需要从头开始表示对象。如果它在社区同意的上下文中是明确的就足够了,例如使用直接模块的类型和函数。听起来很合理,对吧?

Ad.2.给出对象如何重建的印象对于 repr 是不够的, 我相信。帮助调试是str的目的.

结论

所以我对 repr 的期望是什么?允许我做 eval在结果上。在类的情况下,我不想获得从头开始重建类的整个代码。相反,我希望对在我的范围内可见的类有一个明确的引用。 "Module.Class"就足够了。没有冒犯,Python,但是 "<class 'Module.Class'>"不只是削减它。

最佳答案

考虑一个稍微复杂一点的类:

class B(object):
def __init__(self):
self.foo=3

repr 需要返回类似的东西

type("B", (object,), { "__init__": lambda self: setattr(self, "foo", 3) })

已经注意到一个困难:并非所有由 def 语句定义的函数都可以转换为单个 lambda 表达式。稍微改变B:

class B(object):
def __init__(self, x=2, y, **kwargs):
print "in B.__init__"

如何编写定义 B.__init__表达式?你不能使用

lambda self: print "in B.__init__"

因为 lambda 表达式不能包含语句。对于这个简单的类,已经不可能编写一个完整定义类的表达式

关于类的 Python repr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15362183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com