API Reference for the attr Namespace#
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)#
A class decorator that adds dunder methods according to the specified attributes using
attr.ibor the these argument.Please consider using
attrs.define/attrs.frozenin new code (attr.swill never go away, though).- Parameters:
these (
dictofstrtoattr.ib) –A dictionary of name to
attr.ibmappings. This is useful to avoid the definition of your attributes within the class body because you can’t (e.g. if you want to add__repr__methods to Django models) or don’t want to.If these is not
None, attrs will not search the class body for attributes and will not remove any attributes from it.The order is deduced from the order of the attributes inside these.
repr_ns (str) – When using nested classes, there’s no way in Python 2 to automatically detect that. Therefore it’s possible to set the namespace explicitly for a more meaningful
reproutput.auto_detect (bool) –
Instead of setting the init, repr, eq, order, and hash arguments explicitly, assume they are set to
Trueunless any of the involved methods for one of the arguments is implemented in the current class (i.e. it is not inherited from some base class).So for example by implementing
__eq__on a class yourself, attrs will deduceeq=Falseand will create neither__eq__nor__ne__(but Python classes come with a sensible__ne__by default, so it should be enough to only implement__eq__in most cases).Warning
If you prevent attrs from creating the ordering methods for you (
order=False, e.g. by implementing__le__), it becomes your responsibility to make sure its ordering is sound. The best way is to use thefunctools.total_orderingdecorator.Passing
TrueorFalseto init, repr, eq, order, cmp, or hash overrides whatever auto_detect would determine.repr (bool) – Create a
__repr__method with a human readable representation of attrs attributes..str (bool) – Create a
__str__method that is identical to__repr__. This is usually not necessary except forExceptions.eq (bool | None) –
If
TrueorNone(default), add__eq__and__ne__methods that check two instances for equality.They compare the instances as if they were tuples of their attrs attributes if and only if the types of both classes are identical!
See also
order (bool | None) –
If
True, add__lt__,__le__,__gt__, and__ge__methods that behave like eq above and allow instances to be ordered. IfNone(default) mirror value of eq.See also
cmp (bool | None) –
Setting cmp is equivalent to setting eq and order to the same value. Must not be mixed with eq or order.
See also
unsafe_hash (bool | None) –
If
None(default), the__hash__method is generated according how eq and frozen are set.If both are True, attrs will generate a
__hash__for you.If eq is True and frozen is False,
__hash__will be set to None, marking it unhashable (which it is).If eq is False,
__hash__will be left untouched meaning the__hash__method of the base class will be used (if base class isobject, this means it will fall back to id-based hashing.).
Although not recommended, you can decide for yourself and force attrs to create one (e.g. if the class is immutable even though you didn’t freeze it programmatically) by passing
Trueor not. Both of these cases are rather special and should be used carefully.See also
Our documentation on Hashing,
Python’s documentation on
object.__hash__,and the GitHub issue that led to the default behavior for more details.
hash (bool | None) – Alias for unsafe_hash. unsafe_hash takes precedence.
init (bool) –
Create a
__init__method that initializes the attrs attributes. Leading underscores are stripped for the argument name. If a__attrs_pre_init__method exists on the class, it will be called before the class is initialized. If a__attrs_post_init__method exists on the class, it will be called after the class is fully initialized.If
initisFalse, an__attrs_init__method will be injected instead. This allows you to define a custom__init__method that can do pre-init work such assuper().__init__(), and then call__attrs_init__()and__attrs_post_init__().See also
slots (bool) – Create a slotted class that’s more memory-efficient. Slotted classes are generally superior to the default dict classes, but have some gotchas you should know about, so we encourage you to read the glossary entry.
frozen (bool) –
Make instances immutable after initialization. If someone attempts to modify a frozen instance,
attrs.exceptions.FrozenInstanceErroris raised.Note
This is achieved by installing a custom
__setattr__method on your class, so you can’t implement your own.True immutability is impossible in Python.
This does have a minor a runtime performance impact when initializing new instances. In other words:
__init__is slightly slower withfrozen=True.If a class is frozen, you cannot modify
selfin__attrs_post_init__or a self-written__init__. You can circumvent that limitation by usingobject.__setattr__(self, "attribute_name", value).Subclasses of a frozen class are frozen too.
weakref_slot (bool) – Make instances weak-referenceable. This has no effect unless
slotsis also enabled.auto_attribs (bool) –
If
True, collect PEP 526-annotated attributes from the class body.In this case, you must annotate every field. If attrs encounters a field that is set to an
attr.ibbut lacks a type annotation, anattr.exceptions.UnannotatedAttributeErroris raised. Usefield_name: typing.Any = attr.ib(...)if you don’t want to set a type.If you assign a value to those attributes (e.g.
x: int = 42), that value becomes the default value like if it were passed usingattr.ib(default=42). Passing an instance ofattrs.Factoryalso works as expected in most cases (see warning below).Attributes annotated as
typing.ClassVar, and attributes that are neither annotated nor set to anattr.ibare ignored.Warning
For features that use the attribute name to create decorators (e.g. validators), you still must assign
attr.ibto them. Otherwise Python will either not find the name or try to use the default value to call e.g.validatoron it.These errors can be quite confusing and probably the most common bug report on our bug tracker.
kw_only (bool) – Make all attributes keyword-only in the generated
__init__(ifinitisFalse, this parameter is ignored).cache_hash (bool) – Ensure that the object’s hash code is computed only once and stored on the object. If this is set to
True, hashing must be either explicitly or implicitly enabled for this class. If the hash code is cached, avoid any reassignments of fields involved in hash code computation or mutations of the objects those fields point to after object creation. If such changes occur, the behavior of the object’s hash code is undefined.auto_exc (bool) –
If the class subclasses
BaseException(which implicitly includes any subclass of any exception), the following happens to behave like a well-behaved Python exceptions class:the values for eq, order, and hash are ignored and the instances compare and hash by the instance’s ids (N.B. attrs will not remove existing implementations of
__hash__or the equality methods. It just won’t add own ones.),all attributes that are either passed into
__init__or have a default value are additionally available as a tuple in theargsattribute,the value of str is ignored leaving
__str__to base classes.
collect_by_mro (bool) –
Setting this to
Truefixes the way attrs collects attributes from base classes. The default behavior is incorrect in certain cases of multiple inheritance. It should be on by default but is kept off for backward-compatibility.See also
Issue #428
getstate_setstate (bool | None) –
Note
This is usually only interesting for slotted classes and you should probably just set auto_detect to
True.If
True,__getstate__and__setstate__are generated and attached to the class. This is necessary for slotted classes to be pickleable. If leftNone, it’sTrueby default for slotted classes andFalsefor dict classes.If auto_detect is
True, and getstate_setstate is leftNone, and either__getstate__or__setstate__is detected directly on the class (i.e. not inherited), it is set toFalse(this is usually what you want).on_setattr (
callable, or a list of callables, orNone, orattrs.setters.NO_OP) –A callable that is run whenever the user attempts to set an attribute (either by assignment like
i.x = 42or by usingsetattrlikesetattr(i, "x", 42)). It receives the same arguments as validators: the instance, the attribute that is being modified, and the new value.If no exception is raised, the attribute is set to the return value of the callable.
If a list of callables is passed, they’re automatically wrapped in an
attrs.setters.pipe.field_transformer (callable | None) –
A function that is called with the original class object and all fields right before attrs finalizes the class. You can use this, e.g., to automatically add converters or validators to fields based on their types.
match_args (bool) – If
True(default), set__match_args__on the class to support PEP 634 (Structural Pattern Matching). It is a tuple of all non-keyword-only__init__parameter names on Python 3.10 and later. Ignored on older Python versions.
New in version 16.0.0: slots
New in version 16.1.0: frozen
New in version 16.3.0: str
New in version 16.3.0: Support for
__attrs_post_init__.Changed in version 17.1.0: hash supports
Noneas value which is also the default now.New in version 17.3.0: auto_attribs
Changed in version 18.1.0: If these is passed, no attributes are deleted from the class body.
Changed in version 18.1.0: If these is ordered, the order is retained.
New in version 18.2.0: weakref_slot
Deprecated since version 18.2.0:
__lt__,__le__,__gt__, and__ge__now raise aDeprecationWarningif the classes compared are subclasses of each other.__eqand__ne__never tried to compared subclasses to each other.Changed in version 19.2.0:
__lt__,__le__,__gt__, and__ge__now do not consider subclasses comparable anymore.New in version 18.2.0: kw_only
New in version 18.2.0: cache_hash
New in version 19.1.0: auto_exc
Deprecated since version 19.2.0: cmp Removal on or after 2021-06-01.
New in version 19.2.0: eq and order
New in version 20.1.0: auto_detect
New in version 20.1.0: collect_by_mro
New in version 20.1.0: getstate_setstate
New in version 20.1.0: on_setattr
New in version 20.3.0: field_transformer
Changed in version 21.1.0:
init=Falseinjects__attrs_init__Changed in version 21.1.0: Support for
__attrs_pre_init__Changed in version 21.1.0: cmp undeprecated
New in version 21.3.0: match_args
New in version 22.2.0: unsafe_hash as an alias for hash (for PEP 681 compliance).
Note
attrs also comes with a serious-business alias
attr.attrs.For example:
>>> 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.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)#
Create a new attribute on a class.
Warning
Does not do anything unless the class is also decorated with
attr.s/attrs.define/ and so on!Please consider using
attrs.fieldin new code (attr.ibwill never go away, though).- Parameters:
default –
A value that is used if an attrs-generated
__init__is used and no value is passed while instantiating or the attribute is excluded usinginit=False.If the value is an instance of
attrs.Factory, its callable will be used to construct a new value (useful for mutable data types like lists or dicts).If a default is not set (or set manually to
attrs.NOTHING), a value must be supplied when instantiating; otherwise aTypeErrorwill be raised.The default can also be set using decorator notation as shown below.
See also
factory (callable) – Syntactic sugar for
default=attr.Factory(factory).validator (
callableor alistofcallables.) –callablethat is called by attrs-generated__init__methods after the instance has been initialized. They receive the initialized instance, theAttribute(), and the passed value.The return value is not inspected so the validator has to throw an exception itself.
If a
listis passed, its items are treated as validators and must all pass.Validators can be globally disabled and re-enabled using
attrs.validators.get_disabled/attrs.validators.set_disabled.The validator can also be set using decorator notation as shown below.
See also
repr (a
boolor acallableto use a custom function.) – Include this attribute in the generated__repr__method. IfTrue, include the attribute; ifFalse, omit it. By default, the built-inrepr()function is used. To override how the attribute value is formatted, pass acallablethat takes a single value and returns a string. Note that the resulting string is used as-is, i.e. it will be used directly instead of callingrepr()(the default).If
True(default), include this attribute in the generated__eq__and__ne__methods that check two instances for equality. To override how the attribute value is compared, pass acallablethat takes a single value and returns the value to be compared.See also
order (a
boolor acallable.) –If
True(default), include this attributes in the generated__lt__,__le__,__gt__and__ge__methods. To override how the attribute value is ordered, pass acallablethat takes a single value and returns the value to be ordered.See also
Setting cmp is equivalent to setting eq and order to the same value. Must not be mixed with eq or order.
See also
hash (bool | None) –
Include this attribute in the generated
__hash__method. IfNone(default), mirror eq’s value. This is the correct behavior according the Python spec. Setting this value to anything else thanNoneis discouraged.See also
init (bool) –
Include this attribute in the generated
__init__method. It is possible to set this toFalseand set a default value. In that case this attributed is unconditionally initialized with the specified default value or factory.See also
converter (callable) –
callablethat is called by attrs-generated__init__methods to convert attribute’s value to the desired format. It is given the passed-in value, and the returned value will be used as the new value of the attribute. The value is converted before being passed to the validator, if any.See also
metadata (dict | None) – An arbitrary mapping, to be used by third-party components. See Metadata.
type –
The type of the attribute. Nowadays, the preferred method to specify the type is using a variable annotation (see PEP 526). This argument is provided for backward compatibility. Regardless of the approach used, the type will be stored on
Attribute.type.Please note that attrs doesn’t do anything with this metadata by itself. You can use it as part of your own code or for static type checking.
kw_only (bool) – Make this attribute keyword-only in the generated
__init__(ifinitisFalse, this parameter is ignored).on_setattr (
callable, or a list of callables, orNone, orattrs.setters.NO_OP) – Allows to overwrite the on_setattr setting fromattr.s. If leftNone, the on_setattr value fromattr.sis used. Set toattrs.setters.NO_OPto run nosetattrhooks for this attribute – regardless of the setting inattr.s.alias (str | None) – Override this attribute’s parameter name in the generated
__init__method. If leftNone, default tonamestripped of leading underscores. See Private Attributes and Aliases.
New in version 15.2.0: convert
New in version 16.3.0: metadata
Changed in version 17.1.0: validator can be a
listnow.Changed in version 17.1.0: hash is
Noneand therefore mirrors eq by default.New in version 17.3.0: type
Deprecated since version 17.4.0: convert
New in version 17.4.0: converter as a replacement for the deprecated convert to achieve consistency with other noun-based arguments.
New in version 18.1.0:
factory=fis syntactic sugar fordefault=attr.Factory(f).New in version 18.2.0: kw_only
Changed in version 19.2.0: convert keyword argument removed.
Changed in version 19.2.0: repr also accepts a custom callable.
Deprecated since version 19.2.0: cmp Removal on or after 2021-06-01.
New in version 19.2.0: eq and order
New in version 20.1.0: on_setattr
Changed in version 20.3.0: kw_only backported to Python 2
Changed in version 21.1.0: eq, order, and cmp also accept a custom callable
Changed in version 21.1.0: cmp undeprecated
New in version 22.2.0: alias
Note
attrs also comes with a serious-business alias
attr.attrib.The object returned by
attr.ibalso allows for setting the default and the validator using decorators:>>> @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.define()#
Same as
attrs.define.
- attr.mutable()#
Same as
attrs.mutable.
- attr.frozen()#
Same as
attrs.frozen.
- attr.field()#
Same as
attrs.field.
- class attr.Attribute#
Same as
attrs.Attribute.
- attr.make_class()#
Same as
attrs.make_class.
- class attr.Factory(factory, takes_self=False)
Stores a factory callable.
If passed as the default value to
attrs.field, the factory is used to generate a new value.- Parameters:
factory (callable) – A callable that takes either none or exactly one mandatory positional argument depending on takes_self.
takes_self (bool) – Pass the partially initialized instance that is being initialized as a positional argument.
New in version 17.1.0: takes_self
Same as
attrs.Factory.
- attr.NOTHING#
Same as
attrs.NOTHING.
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.
Helpers#
- attr.cmp_using()#
Same as
attrs.cmp_using.
- attr.fields()#
Same as
attrs.fields.
- attr.fields_dict()#
Same as
attr.fields_dict.
- attr.resolve_types()#
Same as
attrs.resolve_types.
- attr.asdict(inst, recurse=True, filter=None, dict_factory=<class 'dict'>, retain_collection_types=False, value_serializer=None)#
Return the attrs attribute values of inst as a dict.
Optionally recurse into other attrs-decorated classes.
- Parameters:
inst – Instance of an attrs-decorated class.
recurse (bool) – Recurse into classes that are also attrs-decorated.
filter (callable) – A callable whose return code determines whether an attribute or element is included (
True) or dropped (False). Is called with theattrs.Attributeas the first argument and the value as the second argument.dict_factory (callable) – A callable to produce dictionaries from. For example, to produce ordered dictionaries instead of normal Python dictionaries, pass in
collections.OrderedDict.retain_collection_types (bool) – Do not convert to
listwhen encountering an attribute whose type istupleorset. Only meaningful ifrecurseisTrue.value_serializer (Optional[callable]) – A hook that is called for every attribute or dict key/value. It receives the current instance, field and value and must return the (updated) value. The hook is run after the optional filter has been applied.
- Return type:
return type of dict_factory
- Raises:
attrs.exceptions.NotAnAttrsClassError – If cls is not an attrs class.
New in version 16.0.0: dict_factory
New in version 16.1.0: retain_collection_types
New in version 20.3.0: value_serializer
New in version 21.3.0: If a dict has a collection for a key, it is serialized as a tuple.
- attr.astuple(inst, recurse=True, filter=None, tuple_factory=<class 'tuple'>, retain_collection_types=False)#
Return the attrs attribute values of inst as a tuple.
Optionally recurse into other attrs-decorated classes.
- Parameters:
inst – Instance of an attrs-decorated class.
recurse (bool) – Recurse into classes that are also attrs-decorated.
filter (callable) – A callable whose return code determines whether an attribute or element is included (
True) or dropped (False). Is called with theattrs.Attributeas the first argument and the value as the second argument.tuple_factory (callable) – A callable to produce tuples from. For example, to produce lists instead of tuples.
retain_collection_types (bool) – Do not convert to
listordictwhen encountering an attribute which type istuple,dictorset. Only meaningful ifrecurseisTrue.
- Return type:
return type of tuple_factory
- Raises:
attrs.exceptions.NotAnAttrsClassError – If cls is not an attrs class.
New in version 16.2.0.
- attr.filters.include()#
Same as
attrs.filters.include.
- attr.filters.exclude()#
Same as
attrs.filters.exclude.
See attrs.asdict() for examples.
All objects from attrs.filters are also available in attr.filters.
- attr.evolve()#
Same as
attrs.evolve.
- attr.validate()#
Same as
attrs.validate.
Validators#
All objects from attrs.validators are also available in attr.validators.
Please refer to the former for details.
Converters#
All objects from attrs.converters are also available from attr.converters.
Please refer to the former for details.
Setters#
All objects from attrs.setters are also available in attr.setters.
Please refer to the former for details.
Deprecated APIs#
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:
- class attr.VersionInfo(year: int, minor: int, micro: int, releaselevel: str)#
A version object that can be compared to tuple of length 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
New in version 19.2.
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
- attr.assoc(inst, **changes)#
Copy inst and apply changes.
This is different from
evolvethat applies the changes to the arguments that create the new instance.evolve’s behavior is preferable, but there are edge cases where it doesn’t work. Thereforeassocis deprecated, but will not be removed.- Parameters:
inst – Instance of a class with attrs attributes.
changes – Keyword changes in the new copy.
- Returns:
A copy of inst with changes incorporated.
- Raises:
attrs.exceptions.AttrsAttributeNotFoundError – If attr_name couldn’t be found on cls.
attrs.exceptions.NotAnAttrsClassError – If cls is not an attrs class.
Deprecated since version 17.1.0: Use
attrs.evolveinstead if you can. This function will not be removed du to the slightly different approach compared toattrs.evolve.
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:
- attr.set_run_validators(run)#
Set whether or not validators are run. By default, they are run.
Deprecated since version 21.3.0: It will not be removed, but it also will not be moved to new
attrsnamespace. Useattrs.validators.set_disabled()instead.
- attr.get_run_validators()#
Return whether or not validators are run.
Deprecated since version 21.3.0: It will not be removed, but it also will not be moved to new
attrsnamespace. Useattrs.validators.get_disabled()instead.
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.