Note
These are the traditional APIs whose creation predates type annotations. They are not deprecated, but we suggest using the :mod:`attrs` namespace for new code, because they look nicer and have better defaults.
See also :doc:`names`.
.. module:: attr
.. autofunction:: 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)
For example:
.. doctest::
>>> 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)
.. autofunction:: attr.ib
.. note::
*attrs* also comes with a serious-business alias ``attr.attrib``.
The object returned by `attr.ib` also allows for setting the default and the validator using decorators:
.. doctest::
>>> @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
.. function:: attrs Serious business alias for `attr.s`.
.. function:: define Same as `attrs.define`.
.. function:: mutable Same as `attrs.mutable`.
.. function:: frozen Same as `attrs.frozen`.
.. function:: field Same as `attrs.field`.
Same as attrs.Attribute.
.. function:: make_class Same as `attrs.make_class`.
.. autoclass:: Factory :noindex: Same as `attrs.Factory`.
.. data:: NOTHING Same as `attrs.NOTHING`.
.. module:: attr.exceptions
All exceptions are available from both attr.exceptions and attrs.exceptions (it's the same module in a different namespace).
Please refer to attrs.exceptions for details.
.. currentmodule:: attr
.. function:: cmp_using Same as `attrs.cmp_using`.
.. function:: fields Same as `attrs.fields`.
.. function:: fields_dict Same as `attrs.fields_dict`.
.. function:: has Same as `attrs.has`.
.. function:: resolve_types Same as `attrs.resolve_types`.
.. autofunction:: asdict
.. autofunction:: astuple
.. module:: attr.filters
.. function:: include Same as `attrs.filters.include`.
.. function:: exclude Same as `attrs.filters.exclude`.
See :func:`attrs.asdict` for examples.
All objects from attrs.filters are also available in attr.filters.
.. currentmodule:: attr
.. function:: evolve Same as `attrs.evolve`.
.. function:: validate Same as `attrs.validate`.
.. module:: attr.validators
All objects from attrs.validators are also available in attr.validators.
Please refer to the former for details.
.. module:: attr.converters
All objects from attrs.converters are also available from attr.converters.
Please refer to the former for details.
.. module:: attr.setters
All objects from attrs.setters are also available in attr.setters.
Please refer to the former for details.
.. currentmodule:: attr
To help you write backward compatible code that doesn't throw warnings on modern releases, the attr module has an __version_info__ attribute as of version 19.2.0.
It behaves similarly to sys.version_info and is an instance of attr.VersionInfo:
.. autoclass:: VersionInfo
With its help you can write code like this:
>>> 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
.. autofunction:: assoc
Before attrs got attrs.validators.set_disabled and attrs.validators.set_disabled, it had the following APIs to globally enable and disable validators. They won't be removed, but are discouraged to use:
.. autofunction:: set_run_validators
.. autofunction:: get_run_validators
The serious-business aliases used to be called attr.attributes and attr.attr.
There are no plans to remove them but they shouldn't be used in new code.