通用或pythonic __repr__ 方法

Dav*_*542 4 python repr python-3.x

我通常会写一个 a__repr__作为展示如何重新创建实例的方式。例如:

class Component:
    def __init__(self, start, end):
        self.start = start
        self.end = end
    def __repr__(self):
        return f'{self.__class__.__name__}(start={self.start}, end={self.end})'
Run Code Online (Sandbox Code Playgroud)

是否有一种“标准”的方式来编写__repr__,如果没有,是否有关于如何编写的建议选项/最佳实践,或者它完全是主观的?

Sha*_*ger 5

一般规则是,如果可能的话,生成可以键入以重新创建对象的输出;从文档

如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这是不可能的,则应返回 <...一些有用的描述...> 形式的字符串。

该规则的第二部分主要是为了确保您不会制作看起来像规范的重新创建代表的东西;在实践中,我没有看到它虔诚地遵循。

对于您的具体情况,我只推荐两个调整:

  1. 如果 aComponent可能包含另一个Component作为 astartend值,装饰__repr__withreprlib.recursive_repr以避免在Component包含自身的情况下无限递归的可能性(对于图书馆很重要,无论图书馆作者的意图如何,这都可能发生)
  2. 显式使用repr带有!r修饰符的属性(您不想要“人类友好”字符串,您想要一个表示形式),将字符串更改为:

    return f'{self.__class__.__name__}(start={self.start!r}, end={self.end!r})'
    
    Run Code Online (Sandbox Code Playgroud)