无模板代码的类
项目描述
attrs 是一个Python包,它将带回来编写类的 乐趣,通过让您从实现对象协议(也称为 dunder方法)的繁琐工作中解脱出来。自2020年以来,它已被NASA 信任 用于火星任务!
attrs 的主要目标是帮助您编写 简洁 和 正确 的软件,同时不会减慢您的代码。
赞助商
attrs 的实现离不开我们 令人惊叹的赞助商。特别是那些慷慨地在 组织 级别和更高级别支持我们的赞助商。
请考虑加入他们,以帮助使 attrs 的维护更具可持续性!
示例
attrs 为您提供了一个类装饰器和在类上声明属性的方法
>>> from attrs import asdict, define, make_class, Factory
>>> @define
... class SomeClass:
... a_number: int = 42
... list_of_numbers: list[int] = Factory(list)
...
... def hard_math(self, another_number):
... return self.a_number + sum(self.list_of_numbers) * another_number
>>> sc = SomeClass(1, [1, 2, 3])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math(3)
19
>>> sc == SomeClass(1, [1, 2, 3])
True
>>> sc != SomeClass(2, [3, 2, 1])
True
>>> asdict(sc)
{'a_number': 1, 'list_of_numbers': [1, 2, 3]}
>>> SomeClass()
SomeClass(a_number=42, list_of_numbers=[])
>>> C = make_class("C", ["a", "b"])
>>> C("foo", "bar")
C(a='foo', b='bar')
在 声明 您的属性后,attrs 将为您提供
- 类属性的简洁且明确的概述,
- 一个友好的可读性好的
__repr__
, - 相等性检查方法,
- 初始化器,
- 以及更多...
无需再编写枯燥的样板代码,也不会带来运行时性能惩罚。
此示例使用20.1.0版本中引入的attrs的现代化API,以及21.3.0版本中添加的attrs包导入名称。经典API(@attr.s
、attr.ib
以及它们的正式别名)以及attr
包导入名称将无限期保留。
请查看关于核心API名称以获取深入了解!
讨厌类型注解!?
没问题!在attrs中,类型是完全可选的。只需将attrs.field()
分配给属性,而不是用类型注释它们
from attrs import define, field
@define
class SomeClass:
a_number = field(default=42)
list_of_numbers = field(factory=list)
数据类
表面上,attrs可能会让你想起dataclasses
(实际上,dataclasses
是attrs的后代)。在实践中,它做得多得多,而且更灵活。例如,它允许你定义特殊处理NumPy数组以进行等性检查,允许更多方式插入初始化过程,有__init_subclass__
的替代方案,并允许使用调试器逐步执行生成的方法。
有关更多详细信息,请参阅我们的比较页面,但一般来说,我们更倾向于犯自然之罪,以使某些事情能够工作,这些事情在理论上应该能够工作,但在实践中却相当复杂。
项目信息
attrs企业版
作为Tidelift订阅的一部分提供。
attrs的维护者以及数千个其他包的维护者正在与Tidelift合作,为您使用的构建应用程序的开源包提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时支付您使用的确切包的维护者。了解更多信息。
发布信息
弃用
- 鉴于在更广泛的生态系统中引发了许多警告,我们已决定仅对
@define
/@attr.s
的hash参数进行软弃用。请勿在新代码中使用它,但我们不再打算删除它。#1330
更改
attrs.converters.pipe()
(以及attrs.field()
的/attr.ib
的converter参数的语法糖,通过传递列表)在将attrs.setters.convert
传递给on_setattr时(这是attrs.define
的默认值)再次工作。#1328- 恢复了PEP 649 / 749实现Python -- 目前为3.14-dev。#1329
项目详细信息
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。