Skip to content

24.1.0

Compare
Choose a tag to compare
@hynek hynek released this 03 Aug 14:29
· 67 commits to main since this release
24.1.0
556ca7c

Highlights

This release comes severely delayed, but comes with many exciting new features, bugfixes, and performance optimizations!

The most notable is probably the possibility to receive self and field definitions in your converters by wrapping them into a attrs.Converter.

The other big thing is our own replacement for __init_subclass__ called (you guessed it) __attrs_init_subclass__. Check out the docs, if you're not sure what this is good for.

Finally, we've made more important steps to promote our "new" APIs (can you believe they're 4 years old!?) in the docs. If we missed anything, please let us know.

Full changelog below!

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), FilePreviews (@filepreviews), Klaviyo (@klaviyo), Daniel Fortunov (@asqui), and Kevin P. Fleming (@kpfleming).

Maintenance Sustainers

Adam Hill (@adamghill), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Moving Content AG (@moving-content), ProteinQure (@ProteinQure), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), The Westervelt Company (@westerveltco), Philippe Galvan (@PhilippeGalvan), Birk Jernström (@birkjernstrom), Chris Withers (@cjw296), Christopher Dignam (@chdsbd), Stefan Hagen (@sthagen), Sławomir Ehlert (@slafs), Mostafa Khalil (@khadrawy), Filip Mularczyk (@mukiblejlok), Mike Fiedler (@miketheman), Thomas Klinger (@thmsklngr), Duncan Hill (@cricalix), Colin Marquardt (@cmarqu), and Andreas Poehlmann (@ap--).

Not to forget 7 more amazing humans who chose to be generous but anonymous!

Full Changelog

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 the attr and attrs modules (for example, attrs.__url__).

    Please use importlib.metadata or importlib_metadata instead. #1268

  • Speed up the generated __eq__ methods 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

  • The repr_ns argument to attr.s is now deprecated. It was a workaround for nested classes in Python 2 and is pointless in Python 3. #1263
  • The hash argument to @attr.s, @attrs.define, and make_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 with functools.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 that attrs.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


This release contains contributions from @bibajz, @carltongibson, @diabolo-dan, @dlax, @econchick, @frenzymadness, @hynek, @koenigdavidmj, @mikejturner, @moto-timo, @my1e5, @richardsheridan, @sscherfke, @tdsmith, and @Tinche.

Artifact Attestations

You can verify this release's artififact attestions using GitHub's CLI tool by downloading the sdist and wheel from PyPI and running:

$ gh attestation verify --owner python-attrs attrs-24.1.0.tar.gz

and

$ gh attestation verify --owner python-attrs attrs-24.1.0-py3-none-any.whl