【发布时间】:2019-06-06 13:13:57
【问题描述】:
据我了解,__repr__ 用于表示对象的开发者/解释者友好表示,并且应该是有效的 Python 代码,当传递给 eval() 时会重新创建相同的对象。
来自 Python 文档:
object.repr(自我)
由 repr() 内置函数和字符串转换(反引号)调用,以计算对象的“官方”字符串表示。如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这不可能,则应返回 <...> 形式的字符串。返回值必须是字符串对象。如果一个类定义了 repr() 而不是 str(),那么当实例的“非正式”字符串表示时也使用 repr()该类是必需的。
链接:https://docs.python.org/2/reference/datamodel.html#object.repr
例如:
class tie(object):
def __init__(self, color):
self.color = color
t = tie('green')
repr(t) # prints <tie object at 0x10fdc4c10>
# can the default implementation be improved to tie(color='green')
# based on the parameters passed in the __init__ function
除了向后兼容性/现有行为之外,更改该实施会面临哪些挑战?
【问题讨论】:
-
我不确定这里的问题是什么...你是问是否可以更改类的
__repr__dunder 方法? - 是的,它在调试或读取日志/异常回溯时起到了有用的作用,使用eval()的语句不正确,但如果对象的 repr 具有对象的所有状态信息,它会很有帮助 - 除非它们的状态很大它会淹没日志的任何其他信息,例如 -
@DerteTrdelnik 我也有点困惑......我想他们在问是什么阻止了python开发人员提供
__repr__()的不同默认实现(例如)基于签名班级的__init__()。 -
问题是为什么 python 解释器提供默认实现为
<tie object at 0x10fdc4c10>,而不是更多地工作来生成它可以的tie(color='green')。是否有任何警告,因为通过查看__init__的参数生成表示将是完全错误的? -
@glibdud - 正是我的观点
-
哦,好的,它存在重大问题-我将尝试在答案中总结一些
标签: python