By default, two instances of
attrs classes are equal if all their fields are equal.
__ne__ methods for you.
Additionally, if you pass
order=True (which is the default if you use the
attrs will also create a full set of ordering methods that are based on the defined fields:
As with other features, you can exclude fields from being involved in comparison operations:
>>> from attr import define, field >>> @define ... class C: ... x: int ... y: int = field(eq=False) >>> C(1, 2) == C(1, 3) True
Additionally you can also pass a callable instead of a bool to both eq and order.
It is then used as a key function like you may know from
>>> from attr import define, field >>> @define ... class S: ... x: str = field(eq=str.lower) >>> S("foo") == S("FOO") True >>> @define(order=True) ... class C: ... x: str = field(order=int) >>> C("10") > C("2") True
This is especially useful when you have fields with objects that have atypical comparison properties. Common examples of such objects are NumPy arrays.
To save you unnecessary boilerplate,
attrs comes with the
attrs.cmp_using helper to create such functions.
For NumPy arrays it would look like this:
import numpy @define(order=False) class C: an_array = field(eq=attr.cmp_using(eq=numpy.array_equal))