attr 命名空间API参考

备注

这些是传统的 API,其创建早于类型注解。它们 不是 被弃用,但我们建议在新代码中使用 attrs 命名空间,因为它们看起来更美观,且具有更好的默认值。

同样参见 核心API中的名称(On The Core API Names).

核心(Core)

attr.s(these=None, repr_ns=None, repr=None, cmp=None, hash=None, init=None, slots=False, frozen=False, weakref_slot=True, str=False, auto_attribs=False, kw_only=False, cache_hash=False, auto_exc=False, eq=None, order=None, auto_detect=False, collect_by_mro=False, getstate_setstate=None, on_setattr=None, field_transformer=None, match_args=True, unsafe_hash=None)

一个类装饰器,根据指定的属性使用 attr.ibthese 参数添加 双下划线方法

考虑在新代码中使用 attrs.define / attrs.frozen ( attr.s永远 不会消失)。

参数:

repr_ns (str) -- 在使用嵌套类时,Python 2 中没有办法自动检测这一点。此参数允许设置一个自定义名称以获得更有意义的 repr 输出。此参数在 Python 3 中是无用的,因此被弃用。

小心

请参考 attrs.define 的其余参数,但请注意它们可能有不同的默认值。

特别是,on_setattr 保持为 None不会 添加任何钩子。

Added in version 16.0.0: slots

Added in version 16.1.0: frozen

Added in version 16.3.0: str

Added in version 16.3.0: 支持 __attrs_post_init__

在 17.1.0 版本发生变更: hash 现在支持 None 作为值,这也是默认值。

Added in version 17.3.0: auto_attribs

在 18.1.0 版本发生变更: 如果传递了 these ,则不会从类体中删除任何属性。

在 18.1.0 版本发生变更: 如果 these 是有序的,则保留顺序。

Added in version 18.2.0: weakref_slot

自 18.2.0 版本弃用: __lt__, __le__, __gt__, 和 __ge__ 现在如果被比较的类是彼此的子类,将引发 DeprecationWarning__eq__ne__ 从未尝试比较子类。

在 19.2.0 版本发生变更: __lt__, __le__, __gt__, 和 __ge__ 现在不再认为子类可比较。

Added in version 18.2.0: kw_only

Added in version 18.2.0: cache_hash

Added in version 19.1.0: auto_exc

自 19.2.0 版本弃用: cmp 在 2021-06-01 或之后将被移除。

Added in version 19.2.0: eqorder

Added in version 20.1.0: auto_detect

Added in version 20.1.0: collect_by_mro

Added in version 20.1.0: getstate_setstate

Added in version 20.1.0: on_setattr

Added in version 20.3.0: field_transformer

在 21.1.0 版本发生变更: init=False 注入 __attrs_init__

在 21.1.0 版本发生变更: 支持 __attrs_pre_init__

在 21.1.0 版本发生变更: cmp 重新引入

Added in version 21.3.0: match_args

Added in version 22.2.0: unsafe_hash 作为 hash 的别名(符合 PEP 681)。

自 24.1.0 版本弃用: repr_ns

在 24.1.0 版本发生变更: 实例不再作为属性的元组进行比较,而是使用一个大的 and 条件。这更快,并且对于不可比较的值(如 math.nan)具有更正确的行为。

Added in version 24.1.0: 如果一个类有一个 继承的 类方法 __attrs_init_subclass__,则在类创建后执行。

自 24.1.0 版本弃用: hash 被弃用,取而代之的是 unsafe_hash

例如:

>>> import attr
>>> @attr.s
... class C:
...     _private = attr.ib()
>>> C(private=42)
C(_private=42)
>>> class D:
...     def __init__(self, x):
...         self.x = x
>>> D(1)
<D object at ...>
>>> D = attr.s(these={"x": attr.ib()}, init=False)(D)
>>> D(1)
D(x=1)
>>> @attr.s(auto_exc=True)
... class Error(Exception):
...     x = attr.ib()
...     y = attr.ib(default=42, init=False)
>>> Error("foo")
Error(x='foo', y=42)
>>> raise Error("foo")
Traceback (most recent call last):
   ...
Error: ('foo', 42)
>>> raise ValueError("foo", 42)   # for comparison
Traceback (most recent call last):
   ...
ValueError: ('foo', 42)
attr.ib(default=NOTHING, validator=None, repr=True, cmp=None, hash=None, init=True, metadata=None, type=None, converter=None, factory=None, kw_only=False, eq=None, order=None, on_setattr=None, alias=None)

在类上创建一个新的字段 / 属性。

attrs.field 相同,只是它不是仅限关键字。

考虑在新代码中使用 attrs.field ( attr.ib永远 不会消失)。

警告

除非类也被装饰为 attr.s (或类似的),否则 不执行任何操作!

Added in version 15.2.0: convert

Added in version 16.3.0: metadata

在 17.1.0 版本发生变更: validator 现在可以是 list

在 17.1.0 版本发生变更: hashNone,因此默认与 eq 镜像。

Added in version 17.3.0: type

自 17.4.0 版本弃用: convert

Added in version 17.4.0: converter 作为弃用的 convert 的替代,以实现与其他基于名词的参数的一致性。

Added in version 18.1.0: factory=fdefault=attr.Factory(f) 的语法糖。

Added in version 18.2.0: kw_only

在 19.2.0 版本发生变更: 移除了 convert 关键字参数。

在 19.2.0 版本发生变更: repr 现在也接受自定义可调用对象。

自 19.2.0 版本弃用: cmp 在 2021-06-01 或之后将被移除。

Added in version 19.2.0: eqorder

Added in version 20.1.0: on_setattr

在 20.3.0 版本发生变更: kw_only 回溯到 Python 2

在 21.1.0 版本发生变更: eq, order, 和 cmp 现在也接受自定义可调用对象

在 21.1.0 版本发生变更: cmp 重新引入

Added in version 22.2.0: alias

备注

attrs 还附带一个重要别名 attr.attrib

attr.ib 返回的对象还允许使用装饰器设置默认值和验证器:

>>> @attr.s
... class C:
...     x = attr.ib()
...     y = attr.ib()
...     @x.validator
...     def _any_name_except_a_name_of_an_attribute(self, attribute, value):
...         if value < 0:
...             raise ValueError("x must be positive")
...     @y.default
...     def _any_name_except_a_name_of_an_attribute(self):
...         return self.x + 1
>>> C(1)
C(x=1, y=2)
>>> C(-1)
Traceback (most recent call last):
    ...
ValueError: x must be positive
attr.attrs()

attr.s 的严肃业务别名。

attr.define()

attrs.define 一样.

attr.mutable()

attrs.mutable 一样.

attr.frozen()

attrs.frozen 一样.

attr.field()

attrs.field 一样.

class attr.Attribute

attrs.Attribute 一样.

attr.make_class()

attrs.make_class 一样.

class attr.Factory(factory, takes_self=False)

存储一个工厂可调用对象(factory callable)。

如果作为默认值传递给 attrs.field ,则该工厂用于生成新值。

参数:
  • factory (Callable) -- 一个可调用对象,根据 takes_self 的值,可以不接受参数或只接受一个必需的位置参数。

  • takes_self (bool) -- 将正在初始化的部分初始化实例作为位置参数传递。

Added in version 17.1.0: takes_self

attrs.Factory 一样.

attr.NOTHING

attrs.NOTHING 一样.

Exceptions

所有异常都可以从 attr.exceptionsattrs.exceptions 获得(它们是不同命名空间中的相同模块)。

请参阅 attrs.exceptions 了解详情。

Helpers

attr.cmp_using()

attrs.cmp_using 一样.

attr.fields()

attrs.fields 一样.

attr.fields_dict()

attrs.fields_dict 一样.

attr.has()

attrs.has 一样.

attr.resolve_types()

attrs.resolve_types 一样.

attr.asdict(inst, recurse=True, filter=None, dict_factory=<class 'dict'>, retain_collection_types=False, value_serializer=None)

返回 instattrs 属性值作为字典。

可选择递归进入其他 attrs 装饰的类。

参数:
  • inst -- 一个 attrs 装饰类的实例。

  • recurse (bool) -- 递归进入也被 attrs 装饰的类。

  • filter (Callable) -- 一个可调用对象,其返回值决定一个属性或元素是否包含(True)或被丢弃(False)。作为第一个参数调用 attrs.Attribute,第二个参数为值。

  • dict_factory (Callable) -- 用于生成字典的可调用对象。例如,为了生成有序字典而不是普通的 Python 字典,可以传入 collections.OrderedDict

  • retain_collection_types (bool) -- 遇到类型为 tupleset 的属性时,不转换为 list。仅在 recurseTrue 时有意义。

  • value_serializer (Callable | None) -- 针对每个属性或字典键/值调用的钩子。它接收当前实例、字段和值,并必须返回(更新后的)值。该钩子在应用可选的 filter 后运行。

返回:

返回类型为 dict_factory

抛出:

attrs.exceptions.NotAnAttrsClassError -- 如果 cls 不是一个 attrs 类。

Added in version 16.0.0: dict_factory

Added in version 16.1.0: retain_collection_types

Added in version 20.3.0: value_serializer

Added in version 21.3.0: 如果字典中有一个键的集合,则将其序列化为元组。

attr.astuple(inst, recurse=True, filter=None, tuple_factory=<class 'tuple'>, retain_collection_types=False)

返回 instattrs 属性值作为元组。

可选择递归进入其他 attrs 装饰的类。

参数:
  • inst -- attrs 装饰类的实例。

  • recurse (bool) -- 是否递归进入同样被 attrs 装饰的类。

  • filter (Callable) -- 一个可调用对象,其返回值决定了属性或元素是被包含(True)还是被丢弃(False)。该函数的第一个参数为 attrs.Attribute,第二个参数为值。

  • tuple_factory (Callable) -- 用于生成元组的可调用对象。例如,可以生成列表而不是元组。

  • retain_collection_types (bool) -- 遇到类型为 tupledictset 的属性时,不进行转换为 listdict。只有在 recurseTrue 时才有意义。

返回:

返回 tuple_factory 的类型。

抛出:

attrs.exceptions.NotAnAttrsClassError -- 如果 cls 不是一个 attrs 类。

Added in version 16.2.0.

attr.filters.include()

attrs.filters.include 一样.

attr.filters.exclude()

attrs.filters.exclude 一样.

参见 attrs.asdict() 查看更多示例.

attr.filters 中的所有对象也可在 attrs.filters 中使用。


attr.evolve()

attrs.evolve 一样.

attr.validate()

attrs.validate 一样.

Validators

所有来自 attrs.validators 的对象也可以在 attr.validators 中找到。详情请参阅前者。

Converters

所有来自 attrs.converters 的对象也可以从 attr.converters 获得。请参阅前者了解详情。

Setters

所有来自 attrs.setters 的对象也可以在 attr.setters 中使用。请参阅前者以了解详情。

Deprecated APIs

为了帮助您编写向后兼容的代码,在现代版本中不会引发警告, attr 模块自 19.2.0 版本起提供了一个 __version_info__ 属性。 它的行为类似于 sys.version_info ,并且是 attr.VersionInfo 的一个实例:

class attr.VersionInfo(year: int, minor: int, micro: int, releaselevel: str)

可以与长度为 1--4 的元组进行比较的版本对象:

>>> attr.VersionInfo(19, 1, 0, "final")  <= (19, 2)
True
>>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1)
True
>>> vi = attr.VersionInfo(19, 2, 0, "final")
>>> vi < (19, 1, 1)
False
>>> vi < (19,)
False
>>> vi == (19, 2,)
True
>>> vi == (19, 2, 1)
False

Added in version 19.2.

在它的帮助下,您可以编写如下代码:

>>> if getattr(attr, "__version_info__", (0,)) >= (19, 2):
...     cmp_off = {"eq": False}
... else:
...     cmp_off = {"cmp": False}
>>> cmp_off == {"eq":  False}
True
>>> @attr.s(**cmp_off)
... class C:
...     pass

attr.assoc(inst, **changes)

复制 inst 并应用 changes

这与 evolve 不同,后者将更改应用于创建新实例的参数。

evolve 的行为是更可取的,但存在一些 边缘情况 ,在这些情况下它不起作用。因此 assoc 被弃用,但不会被移除。

参数:
  • inst -- 带有 attrs 属性的类的实例。

  • changes -- 新副本中的关键字更改。

返回:

一个包含 changesinst 的副本。

抛出:

自 17.1.0 版本弃用: 如果可以,请改用 attrs.evolve。由于与 attrs.evolve 的略微不同的方法,这个函数不会被移除。

attrs 获得 attrs.validators.set_disabledattrs.validators.get_disabled 之前,它有以下 API 用于全局启用和禁用验证器。 这些 API 不会被移除,但不推荐使用:

attr.set_run_validators(run)

设置是否运行验证器。默认情况下,它们是运行的。

自 21.3.0 版本弃用: 不会被移除,但也不会迁移到新的 attrs 命名空间。请改用 attrs.validators.set_disabled()

attr.get_run_validators()

返回验证器是否运行。

自 21.3.0 版本弃用: 不会被移除,但也不会迁移到新的 attrs 命名空间。请改用 attrs.validators.get_disabled()


以前,严肃的别名被称为 attr.attributesattr.attr。 虽然没有计划移除它们,但不应在新代码中使用。