大家好,
我已经累了写和维护手动的__repr__,特别是当构造函数改变时。这就是为什么我创建了[printo]库来自动化这一过程,并避免过时或不一致的__repr__实现。
我的项目功能
printo的主要功能是对类使用@repred装饰器。它自动解析__init__方法的抽象语法树,即使所有对初始化参数的赋值(即self.属性)来识别出对象属性来生成__repr__方法的代码:
from printo import repred
@repred
class SomeClass:
def __init__(self, a, b, c, *args, **kwargs):
self.a = a
self.b = b
self.c = c
self.args = args
self.kwargs = kwargs
print(SomeClass(1, 2, 3))
# > SomeClass(1, 2, 3)
print(SomeClass(1, 2, 3, 4, 5))
# > SomeClass(1, 2, 3, 4, 5)
print(SomeClass(1, 2, 3, 4, 5, d=lambda x: x))
# > SomeClass(1, 2, 3, 4, 5, d=lambda x: x)
它可以简单地处理___init__方法,用户不需要做额外的工作。然而,静态代码分析有一些局限性,因为它不能处理条件语句内的属性赋值。
它保留了像lambda这样的复杂值的可读性。对于复杂的案例,有一个低层次的API。
目标观众
这个库主要用于库的作者,但也适用于值得拥护清晰且低 boilerplate代码的人。有很多项目使用它。
相比之下
如果你已经使用[dataclasses]或[attrs],你可能不需要这个库;这个库更适合于普通类而不是想要一种低 boilerplate的__repr__而不使用数据类。
那么,你通常是如何避免非数据类中的__repr__的boilerplate呢?
评论 (0)