attrs:Python 类定义的轻量解决方案

attrs 是一个 Python 类库,目前积累了 5,793 个 Star:

正文顶部截图

README区域截图

attrs 用于简化 Python 类的定义过程。它通过装饰器和声明式语法,自动生成 initrepreq 等常见的魔术方法,减少重复样板代码的编写量。这个项目从 2015 年开始维护,持续迭代至今,被 NASA 用于火星探测任务的数据处理。

使用 attrs 定义类的写法很简洁:

from attrs import define

@define
class SomeClass:
    a_number: int = 42
    list_of_numbers: list[int] = field(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
asdict(sc)  # {'a_number': 1, 'list_of_numbers': [1, 2, 3]}

attrs 在声明属性之后,自动提供以下能力:

  • 明确的属性概览
  • 可读的 repr 输出
  • 相等性比较方法
  • 带默认值的初始化器
  • 字典序列化(asdict)

这些都不需要手写,也不会带来运行时性能损失。

attrs 支持 Python 的类型注解,但类型不是强制的。不想用类型注解的开发者可以用 field() 替代:

from attrs import define, field

@define
class SomeClass:
    a_number = field(default=42)
    list_of_numbers = field(factory=list)

Python 3.7 引入的 dataclasses 在设计上参考了 attrs,但 attrs 的能力范围更广。它支持自定义初始化过程、特殊的相等性比较逻辑、调试器单步跟踪生成的方法等。对于需要在类定义上做更多定制的场景,attrs 提供了更大的空间。

attrs 从 20.1.0 版本开始引入现代 API(@define、field),从 21.3.0 版本开始支持 attrs 包的导入名。经典的 @attr.s 和 attr.ib 写法仍然保留,现有代码可以继续使用,迁移是渐进式的。

安装 attrs 很简单:

pip install attrs

attrs 的目标是在不拖慢代码的前提下,帮助开发者写出更简洁、更正确的类。对于频繁需要定义数据类的 Python 项目,这是一个值得考虑的工具。

目标是在不拖慢代码的前提下,帮助开发者写出更简洁、更正确的类。对于频繁需要定义数据类的 Python 项目,这是一个值得考虑的工具。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐