【问题标题】:Common or pythonic __repr__ methods常用或 Pythonic __repr__ 方法
【发布时间】:2020-05-14 12:07:42
【问题描述】:

我通常写一个__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__ 的“标准”方式,如果没有,是否有建议的选项/最佳实践来说明如何编写,或者这完全是主观的?

【问题讨论】:

标签: python python-3.x repr


【解决方案1】:

一般规则是,如果可能的话,produce output that could be typed to recreate the object; from the docs:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2014-08-04
    • 2015-07-29
    • 2019-06-06
    • 2021-12-18
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    相关资源
    最近更新 更多