首页 > 解决方案 > 常用或 Pythonic __repr__ 方法

问题描述

我通常写一个__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})'

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

标签: pythonpython-3.xrepr

解决方案


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

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

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

对于您的具体情况,我建议仅进行两项调整:

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

    return f'{self.__class__.__name__}(start={self.start!r}, end={self.end!r})'
    

推荐阅读