python - 常用或 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__
,如果没有,是否有建议的选项/最佳实践来说明如何编写,或者它完全是主观的?
解决方案
一般规则是,如果可能的话,产生可以被键入以重新创建对象的输出;来自文档:
如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这不可能,则应返回 <...一些有用的描述...> 形式的字符串。
该规则的第二部分主要是为了确保您不会做出看起来像规范的重新创建 repr 的东西。在实践中,我没有看到它虔诚地遵循。
对于您的具体情况,我建议仅进行两项调整:
- 如果 a
Component
可能包含另一个Component
作为 astart
或end
值,则用 with 装饰__repr__
以reprlib.recursive_repr
避免在Component
包含自身的情况下无限递归的可能性(对于库很重要,无论库作者的意图如何,这种情况都可能发生) 显式使用
repr
带有修饰符的属性!r
(您不想要“人类友好”字符串,您想要一个表示形式),将字符串更改为:return f'{self.__class__.__name__}(start={self.start!r}, end={self.end!r})'
推荐阅读
- swift - Swift:与对象遵循相同协议的对象数组
- jpa - 从多对多关系的反面编辑关系时未写入数据库
- javascript - 如何将 JSON 对象从 spring 控制器发送到 javascript?
- node.js - 我如何修复“npm init”并且无法升级它
- javascript - Vue.js - 动态创建的复选框的问题:选中一个检查所有并且不能传递动态数据的值
- apache-spark - Pyspark:遍历多行嵌套 json 以构建数据框
- c++ - 如何在 getline() 中使用多个分隔符 (',' , '/n')?
- python - 如何通过附加值产生多个列表对象?
- django - 将带有外键的自定义标签呈现到模板问题中
- javascript - 收到错误“MongooseServerSelectionError:服务器选择在 30000 毫秒后超时”