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:
==20.1.0
->==22.2.0
Release Notes
python-attrs/attrs
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 the dataclass_transforms specification.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
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.