Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
==19.3.0
->==24.3.0
Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Release Notes
python-attrs/attrs (attrs)
v24.3.0
Compare Source
Backwards-incompatible Changes
#1340
Changes
attrs.NothingType
, for annotating types consistent withattrs.NOTHING
.#1358
__suppress_context__
and__notes__
on frozen exceptions.#1365
attrs.converters.optional()
works again when takingattrs.converters.pipe()
or another Converter as its argument.#1372
copy.replace()
.#1383
attrs.validators.instance_of()
's type hints now allow for union types.For example:
instance_of(str | int)
#1385
v24.2.0
Compare Source
Deprecations
@define
/@attr.s
.Please don't use it in new code, but we don't intend to remove it anymore.
#1330
Changes
attrs.converters.pipe()
(and its syntactic sugar of passing a list forattrs.field()
's /attr.ib()
's converter argument) works again when passingattrs.setters.convert
to on_setattr (which is default forattrs.define
).#1328
#1329
v24.1.0
Compare Source
Backwards-incompatible Changes
attrs.evolve()
doesn't accept the inst argument as a keyword argument anymore.Pass it as the first positional argument instead.
#1264
attrs.validators.provides()
has been removed.The removed code is available as a gist for convenient copy and pasting.
#1265
All packaging metadata except from
__version__
and__version_info__
has been removed from theattr
andattrs
modules (for example,attrs.__url__
).Please use
importlib.metadata
or importlib-metadata instead.#1268
The generated
__eq__
methods have been sped up significantly by generating a chain of attribute comparisons instead of constructing and comparing tuples.This change arguably makes the behavior more correct,
but changes it if an attribute compares equal by identity but not value, like
float('nan')
.#1310
Deprecations
attr.s
is now deprecated.It was a workaround for nested classes in Python 2 and is pointless in Python 3.
#1263
@attr.s
,@attrs.define
, andmake_class()
is now deprecated in favor of unsafe_hash, as defined by PEP 681.#1323
Changes
Allow original slotted
functools.cached_property
classes to be cleaned by garbage collection.Allow
super()
calls in slotted cached properties.#1221
Our type stubs now use modern type notation and are organized such that VS Code's quick-fix prefers the
attrs
namespace.#1234
Preserve
AttributeError
raised by properties of slotted classes withfunctools.cached_properties
.#1253
It is now possible to wrap a converter into an
attrs.Converter
and get the current instance and/or the current field definition passed into the converter callable.Note that this is not supported by any type checker, yet.
#1267
attrs.make_class()
now populates the__annotations__
dict of the generated class, so thatattrs.resolve_types()
can resolve them.#1285
Added the
attrs.validators.or_()
validator.#1303
The combination of a
__attrs_pre_init__
that takes arguments, a kw-only field, and a default on that field does not crash anymore.#1319
attrs.validators.in_()
now transforms certain unhashable options to tuples to keep the field hashable.This allows fields that use this validator to be used with, for example,
attrs.filters.include()
.#1320
If a class has an inherited method called
__attrs_init_subclass__
, it is now called once the class is done assembling.This is a replacement for Python's
__init_subclass__
and useful for registering classes, and similar.#1321
v23.2.0
Compare Source
Changes
attrs.resolve_types()
is now correct.#1141
typing.dataclass_transform
to decorate dataclass-like decorators, instead of the non-standard__dataclass_transform__
special form, which is only supported by Pyright.#1158
attrs.asdict/astuple()
withretain_collection_types=True
.#1165
attrs.AttrsInstance
is now atyping.Protocol
in both type hints and code.This allows you to subclass it along with another
Protocol
.#1172
__attrs_pre_init__
accepts more than justself
, it will call it with the same arguments as__init__
was called.This allows you to, for example, pass arguments to
super().__init__()
.#1187
functools.cached_property
decorated methods to support equivalent semantics.#1200
attrs.make_class()
to provide additional attributes for newly created classes.It is, for example, now possible to attach methods.
#1203
v23.1.0
Compare Source
Backwards-incompatible Changes
#993
Deprecations
The support for zope-interface via the
attrs.validators.provides
validator is now deprecated and will be removed in, or after, April 2024.The presence of a C-based package in our developement dependencies has caused headaches and we're not under the impression it's used a lot.
Let us know if you're using it and we might publish it as a separate package.
#1120
Changes
attrs.filters.exclude()
andattrs.filters.include()
now support the passing of attribute names as strings.#1068
attrs.has()
andattrs.fields()
now handle generic classes correctly.#1079
Fix frozen exception classes when raised within e.g.
contextlib.contextmanager
, which mutates their__traceback__
attributes.#1081
@frozen
now works with type checkers that implement PEP-681 (ex. pyright).#1084
Restored ability to unpickle instances pickled before 22.2.0.
#1085
attrs.asdict()
's andattrs.astuple()
's type stubs now accept theattrs.AttrsInstance
protocol.#1090
Fix slots class cellvar updating closure in CPython 3.8+ even when
__code__
introspection is unavailable.#1092
attrs.resolve_types()
can now passinclude_extras
totyping.get_type_hints()
on Python 3.9+, and does so by default.#1099
Added instructions for pull request workflow to
CONTRIBUTING.md
.#1105
Added type parameter to
attrs.field()
function for use withattrs.make_class()
.Please note that type checkers ignore type metadata passed into
make_class()
, but it can be useful if you're wrapping attrs.#1107
It is now possible for
attrs.evolve()
(andattr.evolve()
) to change fields namedinst
if the instance is passed as a positional argument.Passing the instance using the
inst
keyword argument is now deprecated and will be removed in, or after, April 2024.#1117
attrs.validators.optional()
now also accepts a tuple of validators (in addition to lists of validators).#1122
v22.2.0
Compare Source
Backwards-incompatible Changes
#988
Deprecations
#1017
Changes
attrs.field()
now supports an alias option for explicit__init__
argument names.Get
__init__
signatures matching any taste, peculiar or plain!The PEP 681 compatible alias option can be use to override private attribute name mangling, or add other arbitrary field argument name overrides.
#950
attrs.NOTHING
is now an enum value, making it possible to use with e.g.typing.Literal
.#983
Added missing re-import of
attr.AttrsInstance
to theattrs
namespace.#987
Fix slight performance regression in classes with custom
__setattr__
and speedup even more.#991
Class-creation performance improvements by switching performance-sensitive templating operations to f-strings.
You can expect an improvement of about 5% -- even for very simple classes.
#995
attrs.has()
is now aTypeGuard
forAttrsInstance
.That means that type checkers know a class is an instance of an
attrs
class if you check it usingattrs.has()
(orattr.has()
) first.#997
Made
attrs.AttrsInstance
stub available at runtime and fixed type errors related to the usage ofattrs.AttrsInstance
in Pyright.#999
On Python 3.10 and later, call
abc.update_abstractmethods()
on dict classes after creation.This improves the detection of abstractness.
#1001
attrs's pickling methods now use dicts instead of tuples.
That is safer and more robust across different versions of a class.
#1009
Added
attrs.validators.not_(wrapped_validator)
to logically invert wrapped_validator by accepting only values where wrapped_validator rejects the value with aValueError
orTypeError
(by default, exception types configurable).#1010
The type stubs for
attrs.cmp_using()
now have default values.#1027
To conform with PEP 681,
attr.s()
andattrs.define()
now accept unsafe_hash in addition to hash.#1065
v22.1.0
Compare Source
Backwards-incompatible Changes
Python 2.7 is not supported anymore.
Dealing with Python 2.7 tooling has become too difficult for a volunteer-run project.
We have supported Python 2 more than 2 years after it was officially discontinued and feel that we have paid our dues.
All version up to 21.4.0 from December 2021 remain fully functional, of course.
#936
The deprecated
cmp
attribute ofattrs.Attribute
has been removed.This does not affect the cmp argument to
attr.s
that can be used as a shortcut to set eq and order at the same time.#939
Changes
#898
eq
key is defined, it is also used before hashing the attribute.#909
attrs.validators.min_len()
.#916
attrs.validators.deep_iterable()
's member_validator argument now also accepts a list of validators and wraps them in anattrs.validators.and_()
.#925
attrs.converters
andattrs.filters
.#931
attr(s).cmp_using()
.#949
attrs.validators._in()
'sValueError
is not missing the attribute, expected options, and the value it got anymore.#951
#969
v21.4.0
Compare Source
Changes
cloudpickle
does not work.#892
coverage report
for projects that useattrs
and don't set a--source
.#895,
#896
v21.3.0
Compare Source
Backward-incompatible Changes
When using
@define
, converters are now run by default when setting an attribute on an instance -- additionally to validators.I.e. the new default is
on_setattr=[attrs.setters.convert, attrs.setters.validate]
.This is unfortunately a breaking change, but it was an oversight, impossible to raise a
DeprecationWarning
about, and it's better to fix it now while the APIs are very fresh with few users.#835,
#886
import attrs
has finally landed!As of this release, you can finally import
attrs
using its proper name.Not all names from the
attr
namespace have been transferred; most notablyattr.s
andattr.ib
are missing.See
attrs.define
andattrs.field
if you haven't seen our next-generation APIs yet.A more elaborate explanation can be found On The Core API Names
This feature is at least for one release provisional.
We don't plan on changing anything, but such a big change is unlikely to go perfectly on the first strike.
The API docs have been mostly updated, but it will be an ongoing effort to change everything to the new APIs.
Please note that we have not moved -- or even removed -- anything from
attr
!Please do report any bugs or documentation inconsistencies!
#887
Changes
attr.asdict(retain_collection_types=False)
(default) dumps collection-esque keys as tuples.#646,
#888
__match_args__
are now generated to support Python 3.10'sStructural Pattern Matching.
This can be controlled by the
match_args
argument to the class decorators on Python 3.10 and later.On older versions, it is never added and the argument is ignored.
#815
attrs.setters.validate
(default in@define
and@mutable
) but no field defines a validator, pretend that it's not set.#817
__repr__
is significantly faster on Pythons with f-strings.#819
field_transformer
are wrapped withAttrsClass
again.#824
#828
attrs.converters.to_bool()
.#830
attrs.resolve_types()
now resolves types of subclasses after the parents are resolved.#842
#843
lt(val)
(< val),le(va)
(≤ val),ge(val)
(≥ val),gt(val)
(> val), andmaxlen(n)
.#845
attrs
classes are now fully compatible with cloudpickle (no need to disablerepr
anymore).#857
attrs.validators.disabled()
and functionsattrs.validators.(set|get)_disabled()
.They deprecate
attrs.(set|get)_run_validators()
.All functions are interoperable and modify the same internal state.
They are not – and never were – thread-safe, though.
#859
attrs.validators.matches_re()
now accepts pre-compiled regular expressions in addition to pattern strings.#877
v21.2.0
Compare Source
Backward-incompatible Changes
attr.evolve()
because it broke some use-cases -- sorry!#806
attrs
can't be imported on it anymore.To ensure that 3.4 users can keep installing
attrs
easily, we will yank 21.1.0 from PyPI.This has no consequences if you pin
attrs
to 21.1.0.#807
v21.1.0
Compare Source
Deprecations
The long-awaited, much-talked-about, little-delivered
import attrs
is finally upon us!Since the NG APIs have now been proclaimed stable, the next release of
attrs
will allow you to actuallyimport attrs
.We're taking this opportunity to replace some defaults in our APIs that made sense in 2015, but don't in 2021.
So please, if you have any pet peeves about defaults in
attrs
's APIs, now is the time to air your grievances in #487!We're not gonna get such a chance for a second time, without breaking our backward-compatibility guarantees, or long deprecation cycles.
Therefore, speak now or forever hold you peace!
#487
The cmp argument to
attr.s()
andattr.ib()
has been undeprecatedIt will continue to be supported as syntactic sugar to set eq and order in one go.
I'm terribly sorry for the hassle around this argument!
The reason we're bringing it back is it's usefulness regarding customization of equality/ordering.
The
cmp
attribute and argument onattr.Attribute
remains deprecated and will be removed later this year.#773
Changes
It's now possible to customize the behavior of
eq
andorder
by passing in a callable.#435,
#627
The instant favorite next-generation APIs are not provisional anymore!
They are also officially supported by Mypy as of their 0.800 release.
We hope the next release will already contain an (additional) importable package called
attrs
.#668,
#786
If an attribute defines a converter, the type of its parameter is used as type annotation for its corresponding
__init__
parameter.If an
attr.converters.pipe
is used, the first one's is used.#710
Fixed the creation of an extra slot for an
attr.ib
when the parent class already has a slot with the same name.#718
__attrs__init__()
will now be injected ifinit=False
, or ifauto_detect=True
and a user-defined__init__()
exists.This enables users to do "pre-init" work in their
__init__()
(such assuper().__init__()
).__init__()
can then delegate constructor argument processing toself.__attrs_init__(*args, **kwargs)
.#731
bool(attr.NOTHING)
is nowFalse
.#732
It's now possible to use
super()
inside of properties of slotted classes.#747
Allow for a
__attrs_pre_init__()
method that -- if defined -- will get called at the beginning of theattrs
-generated__init__()
method.#750
Added forgotten
attr.Attribute.evolve()
to type stubs.#752
attrs.evolve()
now works recursively with nestedattrs
classes.#759
Python 3.10 is now officially supported.
#763
attr.resolve_types()
now takes an optional attrib argument to work inside afield_transformer
.#774
ClassVar
s are now also detected if they come from typing-extensions.#782
To make it easier to customize attribute comparison (#435), we have added the
attr.cmp_with()
helper.See the new docs on comparison for more details.
#787
Added provisional support for static typing in
pyright
via PEP 681.Both the
pyright
specification andattrs
implementation may change in future versions of both projects.Your constructive feedback is welcome in both attrs#795 and pyright#1782.
#796
v20.3.0
Compare Source
Backward-incompatible Changes
attr.define()
,attr.frozen()
,attr.mutable()
, andattr.field()
remain provisional.This release does not change anything about them and they are already used widely in production though.
If you wish to use them together with mypy, you can simply drop this plugin into your project.
Feel free to provide feedback to them in the linked issue #668.
We will release the
attrs
namespace once we have the feeling that the APIs have properly settled.#668
Changes
attr.s()
now has a field_transformer hook that is called for allAttribute
s and returns a (modified or updated) list ofAttribute
instances.attr.asdict()
has a value_serializer hook that can change the way values are converted.Both hooks are meant to help with data (de-)serialization workflows.
#653
kw_only=True
now works on Python 2.#700
raise from
now works on frozen classes on PyPy.#703,
#712
attr.asdict()
andattr.astuple()
now treatfrozenset
s likeset
s with regards to the retain_collection_types argument.#704
attr.s()
andattr.make_class()
are not missing the collect_by_mro argument anymore.#711
v20.2.0
Compare Source
Backward-incompatible Changes
attr.define()
,attr.frozen()
,attr.mutable()
, andattr.field()
remain provisional.This release fixes a bunch of bugs and ergonomics but they remain mostly unchanged.
If you wish to use them together with mypy, you can simply drop this plugin into your project.
Feel free to provide feedback to them in the linked issue #668.
We will release the
attrs
namespace once we have the feeling that the APIs have properly settled.#668
Changes
attr.define()
et al now correctly detect__eq__
and__ne__
.#671
attr.define()
et al's hybrid behavior now also works correctly when arguments are passed.#675
It's possible to define custom
__setattr__
methods on slotted classes again.#681
In 20.1.0 we introduced the
inherited
attribute on theattr.Attribute
class to differentiate attributes that have been inherited and those that have been defined directly on the class.It has shown to be problematic to involve that attribute when comparing instances of
attr.Attribute
though, because when sub-classing, attributes from base classes are suddenly not equal to themselves in a super class.Therefore the
inherited
attribute will now be ignored when hashing and comparing instances ofattr.Attribute
.#684
zope.interface
is now a "soft dependency" when running the test suite; ifzope.interface
is not installed when running the test suite, the interface-related tests will be automatically skipped.#685
The ergonomics of creating frozen classes using
@define(frozen=True)
and sub-classing frozen classes has been improved:you don't have to set
on_setattr=None
anymore.#687
v20.1.0
Compare Source
Backward-incompatible Changes
Python 3.4 is not supported anymore.
It has been unsupported by the Python core team for a while now, its PyPI downloads are negligible, and our CI provider removed it as a supported option.
It's very unlikely that
attrs
will break under 3.4 anytime soon, which is why we do not block its installation on Python 3.4.But we don't test it anymore and will block it once someone reports breakage.
#608
Deprecations
Less of a deprecation and more of a heads up: the next release of
attrs
will introduce anattrs
namespace.That means that you'll finally be able to run
import attrs
with new functions that aren't cute abbreviations and that will carry better defaults.This should not break any of your code, because project-local packages have priority before installed ones.
If this is a problem for you for some reason, please report it to our bug tracker and we'll figure something out.
The old
attr
namespace isn't going anywhere and its defaults are not changing – this is a purely additive measure.Please check out the linked issue for more details.
These new APIs have been added provisionally as part of #666 so you can try them out today and provide feedback.
Learn more in the API docs.
#408
Changes
Added
attr.resolve_types()
.It ensures that all forward-references and types in string form are resolved into concrete types.
You need this only if you need concrete types at runtime.
That means that if you only use types for static type checking, you do not need this function.
#288,
#302
Added
@attr.s(collect_by_mro=False)
argument that if set toTrue
fixes the collection of attributes from base classes.It's only necessary for certain cases of multiple-inheritance but is kept off for now for backward-compatibility reasons.
It will be turned on by default in the future.
As a side-effect,
attr.Attribute
now always has aninherited
attribute indicating whether an attribute on a class was directly defined or inherited.#428,
#635
On Python 3, all generated methods now have a docstring explaining that they have been created by
attrs
.#506
It is now possible to prevent
attrs
from auto-generating the__setstate__
and__getstate__
methods that are required for pickling of slotted classes.Either pass
@attr.s(getstate_setstate=False)
or pass@attr.s(auto_detect=True)
and implement them yourself:if
attrs
finds either of the two methods directly on the decorated class, it assumes implicitlygetstate_setstate=False
(and implements neither).This option works with dict classes but should never be necessary.
#512,
#513,
#642
Fixed a
ValueError: Cell is empty
bug that could happen in some rare edge cases.#590
attrs
can now automatically detect your own implementations and inferinit=False
,repr=False
,eq=False
,order=False
, andhash=False
if you set@attr.s(auto_detect=True)
.attrs
will ignore inherited methods.If the argument implies more than one method (for example,
eq=True
creates both__eq__
and__ne__
), it's enough for one of them to exist andattrs
will create neither.This feature requires Python 3.
#607
Added
attr.converters.pipe()
.The feature allows combining multiple conversion callbacks into one by piping the value through all of them, and retuning the last result.
As part of this feature, we had to relax the type information for converter callables.
#618
Fixed serialization behavior of non-slots classes with
cache_hash=True
.The hash cache will be cleared on operations which make "deep copies" of instances of classes with hash caching,
though the cache will not be cleared with shallow copies like those made by
copy.copy()
.Previously,
copy.deepcopy()
or serialization and deserialization withpickle
would result in an un-initialized object.This change also allows the creation of
cache_hash=True
classes with a custom__setstate__
,which was previously forbidden (#494).
#620
It is now possible to specify hooks that are called whenever an attribute is set after a class has been instantiated.
You can pass
on_setattr
both to@attr.s()
to set the default for all attributes on a class, and to@attr.ib()
to overwrite it for individual attributes.attrs
also comes with a new moduleattr.setters
that brings helpers that run validators, converters, or allow to freeze a subset of attributes.#645,
#660
Provisional APIs called
attr.define()
,attr.mutable()
, andattr.frozen()
have been added.They are only available on Python 3.6 and later, and call
attr.s()
with different default values.If nothing comes up, they will become the official way for creating classes in 20.2.0 (see above).
Please note that it may take some time until mypy – and other tools that have dedicated support for
attrs
– recognize these new APIs.Please do not open issues on our bug tracker, there is nothing we can do about it.
#666
We have also provisionally added
attr.field()
that supplantsattr.ib()
.It also requires at least Python 3.6 and is keyword-only.
Other than that, it only dropped a few arguments, but changed no defaults.
As with
attr.s()
:attr.ib()
is not going anywhere.#669
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.