# attrs changelog > attrs release notes. - Vendor: attrs - Category: Frameworks & Libraries - Official site: https://github.com/python-attrs/attrs - Tracked by: What's New (https://whatsnew.fyi/product/attrs) - Harvested from: GitHub (python-attrs/attrs) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### 26.1.0 - Date: 2026-03-19 - Version: 26.1.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/26.1.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/26.1.0 ##### Highlights The main outward change here only affects people using field transformers, but it should be a nice quality of life improvement! *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [Kraken Tech](https://kraken.tech) (@[kraken-tech](https://github.com/kraken-tech)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Ecosystems](https://ecosyste.ms) (@[ecosyste-ms](https://github.com/ecosyste-ms)), [TestMu AI Open Source Office (Formerly LambdaTest)](https://www.lambdatest.com) (@[LambdaTest-Inc](https://github.com/LambdaTest-Inc)), [Doist](https://doist.com/) (@[Doist](https://github.com/Doist)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)), [Mike Fiedler](https://miketheman.dev) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), [Brian M. Dennis](https://bmdphd.info/) (@[crossjam](https://github.com/crossjam)), Celebrity News AG (@[celebritynewsag](https://github.com/celebritynewsag)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Trapper Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). ##### Full Changelog ###### Backwards-incompatible Changes - Field aliases are now resolved *before* calling `field_transformer`, so transformers receive fully populated `Attribute` objects with usable `alias` values instead of `None`. The new `Attribute.alias_is_default` flag indicates whether the alias was auto-generated (`True`) or explicitly set by the user (`False`). [\#1509](https://github.com/python-attrs/attrs/issues/1509) ###### Changes - Fix type annotations for `attrs.validators.optional()`, so it no longer rejects tuples with more than one validator. [\#1496](https://github.com/python-attrs/attrs/issues/1496) - The `attrs.validators.disabled()` contextmanager can now be nested. [\#1513](https://github.com/python-attrs/attrs/issues/1513) - Frozen classes can set `on_setattr=attrs.setters.NO_OP` in addition to `None`. [\#1515](https://github.com/python-attrs/ _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/26.1.0]_ ### 25.4.0 - Date: 2025-10-06 - Version: 25.4.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/25.4.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/25.4.0 ##### Highlights The main reason for this release (and why it's published _today_) is that it ships the first pieces of work for Python 3.14 and [PEP 749](https://peps.python.org/pep-0749/). There will be more work required and there's going to be a lot more churn once everyone starts testing 3.14 earnestly. We hope to receive more feedback before spending more time on this. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), [Quesma](https://quesma.com/) ([@QuesmaOrg](https://github.com/QuesmaOrg)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Doist](https://doist.com/) (@[Doist](https://github.com/Doist)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)), [Mike Fiedler](https://www.miketheman.net) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), [Brian M. Dennis](https://mpr.crossjam.net/) (@[crossjam](https://github.com/crossjam)), Celebrity News AG (@[celebritynewsag](https://github.com/celebritynewsag)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Trapper Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). ##### Full Changelog ###### Backwards-incompatible Changes - Class-level `kw_only=True` behavior is now consistent with `dataclasses`. Previously, a class that sets `kw_only=True` makes all attributes keyword-only, including those from base classes. If an attribute sets `kw_only=False`, that setting is ignored, and it is still made keyword-only. Now, only the attributes defined in that class that doesn't explicitly set `kw_only=False` are made keyword-only. This shouldn't be a problem for most users, unless you have a pattern like this: ``` python @attrs.define(kw_only=True) class Base: a: int b: int = attrs.field(default=1, kw_only=False) @attrs.define class Subclass(Base): c: int ``` Here, we have a `kw_only=True` *attrs* class (`Base`) wi _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/25.4.0]_ ### 25.3.0 - Date: 2025-03-13 - Version: 25.3.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/25.3.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/25.3.0 ##### Highlights Quick regression fix for generator-based `field_transformer`s. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [Ecosystems](https://ecosyste.ms) (@[ecosyste-ms](https://github.com/ecosyste-ms)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [nate nowack](https://blog.alternatebuild.dev) (@[zzstoatzz](https://github.com/zzstoatzz)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)), [Mike Fiedler](https://www.miketheman.net) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), [Brian M. Dennis](https://mpr.crossjam.net/) (@[crossjam](https://github.com/crossjam)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Trapper Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). Not to forget 14 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Changes - Restore support for generator-based `field_transformer`s. [\#1417](https://github.com/python-attrs/attrs/issues/1417) --- This release contains contributions from @ashb, and @hynek. ##### Artifact Attestations You can verify this release's [artifact attestions](https://docs.github.com/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds) using [GitHub's CLI tool](https://cli.github.com) by downloading the sdist and wheel from [PyPI](https://pypi.org/project/attrs) and running: ```console $ gh attestation verify --owner python-attrs attrs-25.3.0.tar.gz ``` and ```console $ gh attestation verify --owner python-attrs attrs-25.3.0-py3-none-any.whl ``` ### 25.2.0 - Date: 2025-03-12 - Version: 25.2.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/25.2.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/25.2.0 ##### Highlights Vroom–vroom edition! _attrs_ had always impressive runtime performance because we generate optimal code for your configuration. But now, said code generation is 30–50% faster, too! This is the last *attrs* version to support Python 3.8. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [Ecosystems](https://ecosyste.ms) (@[ecosyste-ms](https://github.com/ecosyste-ms)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [nate nowack](https://blog.alternatebuild.dev) (@[zzstoatzz](https://github.com/zzstoatzz)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)), [Mike Fiedler](https://www.miketheman.net) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), [Brian M. Dennis](https://mpr.crossjam.net/) (@[crossjam](https://github.com/crossjam)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Trapper Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). Not to forget 14 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Changes - Checking mandatory vs non-mandatory attribute order is now performed after the field transformer, since the field transformer may change attributes and/or their order. [\#1147](https://github.com/python-attrs/attrs/issues/1147) - `attrs.make_class()` now allows for Unicode class names. [\#1406](https://github.com/python-attrs/attrs/issues/1406) - Speed up class creation by 30%-50% by compiling methods only once and using a variety of other techniques. [\#1407](https://github.com/python-attrs/attrs/issues/1407) - The error message if an attribute has both an annotation and a type argument will now disclose *wh _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/25.2.0]_ ### 25.1.0 - Date: 2025-01-25 - Version: 25.1.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/25.1.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/25.1.0 ##### Highlights This release only ensures correct PyPI licensing metadata. ##### 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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), [Gedankenspieler](https://www.gedankenspieler.org/) (@[Gedankenspieler](https://github.com/Gedankenspieler)), Daniel Fortunov (@[asqui](https://github.com/asqui)), Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)), and [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), Chris Withers (@[cjw296](https://github.com/cjw296)), [Mike Fiedler](https://www.miketheman.net) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). Not to forget 11 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Changes - This release only ensures correct PyPI licensing metadata. [\#1386](https://github.com/python-attrs/attrs/issues/1386) --- This release contains contributions from @hynek, and @Lx. ##### Artifact Attestations You can verify this release's [artifact attestions](https://docs.github.com/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds) using [GitHub's CLI tool](https://cli.github.com) by downloading the sdist and wheel from [PyPI](https://pypi.org/project/attrs) and running: ```console $ gh attestation verify --owner python-attrs attrs-25.1.0.tar.gz ``` and ```console $ gh attestation verify --owner python-attrs attrs-25.1.0-py3-none-any.whl ``` ### 24.3.0 - Date: 2024-12-16 - Version: 24.3.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/24.3.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/24.3.0 ##### Highlights Mostly bug fixes and adjustments, but also support for Python 3.13's [`copy.replace()`](https://docs.python.org/3/library/copy.html#copy.replace). On the other side we say goodbye to Python 3.7. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [thanks.dev](https://www.thanks.dev) (@[thnxdev](https://github.com/thnxdev)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Privacy Solutions GmbH](https://privacy-solutions.org) (@[privacy-solutions](https://github.com/privacy-solutions)), Daniel Fortunov (@[asqui](https://github.com/asqui)), Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)), and [Polar](https://polar.sh) (@[polarsource](https://github.com/polarsource)). ###### Maintenance Sustainers [Buttondown](https://buttondown.com) (@[buttondown](https://github.com/buttondown)), [Konstantin Vinogradov](https://kvinogradov.com) (@[vinogradovkonst](https://github.com/vinogradovkonst)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), [Stefan Hagen](https://stefan-hagen.website) (@[sthagen](https://github.com/sthagen)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](https://cra.mr) (@[dcramer](https://github.com/dcramer)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), Chris Withers (@[cjw296](https://github.com/cjw296)), [Mike Fiedler](https://mike.fiedler.me) (@[miketheman](https://github.com/miketheman)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), [Pieter Swinkels](https://blog.journeythatcounts.nl) (@[swinkels](https://github.com/swinkels)), Nick Libertini (@[libertininick](https://github.com/libertininick)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)), [August Bigelow](https://atbigelow.com) (@[atbigelow](https://github.com/atbigelow)), [Carlton Gibson](https://noumenal.es/) (@[carltongibson](https://github.com/carltongibson)), and [Roboflow](https://roboflow.com) (@[roboflow](https://github.com/roboflow)). Not to forget 9 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Backwards-incompatible Changes - Python 3.7 has been dropped. [\#1340](https://github.com/python-attrs/attrs/issues/1340) ###### Changes - Introduce `attrs.NothingType`, for annotating types consistent with `attrs.NOTHING`. [\#1358](https://github.com/python-attrs/attrs/issues/1358) - Allow mutating `__suppress_context__` and `__notes__` on frozen exceptions. [\#1365](https://github.com/python-attrs/attrs/issues/1365) - `attrs.converters.optional()` works again when taking `attrs.converters.pipe()` or another Converter as its argument. [\#1372](https://github.com/python-attrs/attrs/issues/1372) - *attrs* inst _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/24.3.0]_ ### 24.2.0 - Date: 2024-08-06 - Version: 24.2.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/24.2.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/24.2.0 ##### Highlights Big releases always carry the risk of regressions, but never did I expect [to break Python 3.14’s CI](https://github.com/python-attrs/attrs/issues/1326)! On the plus side, *attrs* runs on 3.14 now. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Adam Hill](https://adamghill.com) (@[adamghill](https://github.com/adamghill)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](http://cra.mr) (@[dcramer](https://github.com/dcramer)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), Philippe Galvan (@[PhilippeGalvan](https://github.com/PhilippeGalvan)), [Birk Jernström](https://polar.sh) (@[birkjernstrom](https://github.com/birkjernstrom)), Chris Withers (@[cjw296](https://github.com/cjw296)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), [Stefan Hagen](https://stefan-hagen.website) (@[sthagen](https://github.com/sthagen)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), [Mike Fiedler](https://mike.fiedler.me) (@[miketheman](https://github.com/miketheman)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), and [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/ap--)). Not to forget 7 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Deprecations - Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. Please don't use it in new code, but we don't intend to remove it anymore. [\#1330](https://github.com/python-attrs/attrs/issues/1330) ###### Changes - `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). [\#1328](https://github.com/python-attrs/attrs/issues/1328) - Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. [\#1329](https://github.com/python-attrs/attrs/issues/1329) --- This release contains contributions from @hynek. ##### Artifact Attestations You can verify this release's [artifact attestions](https://docs.github.com/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds) using [GitHub's CLI tool](https://cli.github.com) by downloading the sdist and wheel from [PyPI](https://pypi.org/project/attrs) and running: ```console $ gh attestation verif _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/24.2.0]_ ### 24.1.0 - Date: 2024-08-03 - Version: 24.1.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/24.1.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/24.1.0 ##### 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](https://www.attrs.org/en/stable/api.html#attrs.Converter). The other big thing is our own replacement for `__init_subclass__` called (you guessed it) `__attrs_init_subclass__`. Check out the [docs](https://www.attrs.org/en/stable/init.html#attrs-and-init-subclass), 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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), [Klaviyo](https://www.klaviyo.com) (@[klaviyo](https://github.com/klaviyo)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Adam Hill](https://adamghill.com) (@[adamghill](https://github.com/adamghill)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](http://cra.mr) (@[dcramer](https://github.com/dcramer)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), Philippe Galvan (@[PhilippeGalvan](https://github.com/PhilippeGalvan)), [Birk Jernström](https://polar.sh) (@[birkjernstrom](https://github.com/birkjernstrom)), Chris Withers (@[cjw296](https://github.com/cjw296)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), [Stefan Hagen](https://stefan-hagen.website) (@[sthagen](https://github.com/sthagen)), [Sławomir Ehlert](https://slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](https://fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), [Mike Fiedler](https://mike.fiedler.me) (@[miketheman](https://github.com/miketheman)), Thomas Klinger (@[thmsklngr](https://github.com/thmsklngr)), Duncan Hill (@[cricalix](https://github.com/cricalix)), Colin Marquardt (@[cmarqu](https://github.com/cmarqu)), and [Andreas Poehlmann](https://poehlmann.io) (@[ap--](https://github.com/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](https://github.com/python-attrs/attrs/issues/1264) - `attrs.validators.provides()` has been removed. The removed code is available as a [gist](https://gist.github.com/hynek/9eaaaeb659808f3519870dfa16d2b6b2) for convenient copy and pasting. [\#1265](https://github.com/python-attrs/attrs/issues/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`](https://docs.python.org/3/library/import _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/24.1.0]_ ### 23.2.0 - Date: 2023-12-31 - Version: 23.2.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/23.2.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/23.2.0 ##### Highlights Mostly typing fixes in this release, but I'm excited that we found a workaround to make `functools.cached_property` work with slotted classes! Also, I'm sure there's gonna be fans of the new behavior of `__attrs_pre_init__` where it receives all arguments passed to `__init__` if it accepts more than `self`. *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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@[variomedia](https://github.com/variomedia)), [Tidelift](https://www.tidelift.com/) (@[tidelift](https://github.com/tidelift)), [FilePreviews](http://filepreviews.io/) (@[filepreviews](https://github.com/filepreviews)), Daniel Fortunov (@[asqui](https://github.com/asqui)), and Kevin P. Fleming (@[kpfleming](https://github.com/kpfleming)). ###### Maintenance Sustainers [Adam Hill](https://adamghill.com) (@[adamghill](https://github.com/adamghill)), Dan Groshev (@[si14](https://github.com/si14)), Magnus Watn (@[magnuswatn](https://github.com/magnuswatn)), [David Cramer](http://cra.mr) (@[dcramer](https://github.com/dcramer)), Moving Content AG (@[moving-content](https://github.com/moving-content)), [ProteinQure](https://proteinqure.com/) (@[ProteinQure](https://github.com/ProteinQure)), Jesse Snyder (@[jessesnyder](https://github.com/jessesnyder)), [Rivo Laks](https://rivolaks.com) (@[rivol](https://github.com/rivol)), [Ionel Cristian Mărieș](https://blog.ionelmc.ro) (@[ionelmc](https://github.com/ionelmc)), [The Westervelt Company](https://westervelt.com) (@[westerveltco](https://github.com/westerveltco)), Philippe Galvan (@[PhilippeGalvan](https://github.com/PhilippeGalvan)), [Birk Jernström](polar.sh) (@[birkjernstrom](https://github.com/birkjernstrom)), [Tim Schilling](www.better-simple.com) (@[tim-schilling](https://github.com/tim-schilling)), Chris Withers (@[cjw296](https://github.com/cjw296)), [Christopher Dignam](https://christopher.xyz) (@[chdsbd](https://github.com/chdsbd)), [Stefan Hagen](https://stefan-hagen.website) (@[sthagen](https://github.com/sthagen)), [Sławomir Ehlert](slafs.net) (@[slafs](https://github.com/slafs)), Mostafa Khalil (@[khadrawy](https://github.com/khadrawy)), [Filip Mularczyk](fmularczyk.pl) (@[mukiblejlok](https://github.com/mukiblejlok)), and [Mike Fiedler](https://mike.fiedler.me) (@[miketheman](https://github.com/miketheman)). Not to forget 6 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Changes - The type annotation for `attrs.resolve_types()` is now correct. [\#1141](https://github.com/python-attrs/attrs/issues/1141) - Type stubs now use `typing.dataclass_transform` to decorate dataclass-like decorators, instead of the non-standard `__dataclass_transform__` special form, which is only supported by Pyright. [\#1158](https://github.com/python-attrs/attrs/issues/1158) - Fixed serialization of namedtuple fields using `attrs.asdict/astuple()` with `retain_collection_types=True`. [\#1165](https://github.com/python-attrs/attrs/issues/1165) - `attrs.AttrsInstance` is now a `typing.Protocol` in both type hints and code. This allows you to subclass it along with another `Protocol`. [\#1172](https://github.com/python-attrs/attrs/issues/1172) - If *attrs* detects that `__attrs_pre_init__` accepts more than just `self`, it will call it with the same arguments as `__init__` was called. This allows you to, for example, pass arguments to `super().__init__()`. [\#1187](https://github.com/python-attrs/attrs/issues/1187) - Slotted classes now transform `functools.cached_property` decorated methods to support equivalent semantics. [\#1200](https://github.com/python-attrs/attrs/issues/1200) - Added *class_body* argument to `attrs.make_class()` to provide _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/23.2.0]_ ### 23.1.0 - Date: 2023-04-16 - Version: 23.1.0 - Original notes: https://github.com/python-attrs/attrs/releases/tag/23.1.0 - Permalink: https://whatsnew.fyi/product/attrs/releases/23.1.0 ##### Highlights A lot of features and smaller bug fixes! But also with a heavy heart, we're leaving the last `dataclass`-less Python version (3.6) behind, but don't worry: the old versions aren't going anywhere and thanks to the magic of package metadata, `pip install attrs` should still work on Python 3.6 as if nothing happened. ##### 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 and check out the sweet perks! ###### Above and Beyond [Variomedia AG](https://www.variomedia.de/) (@variomedia), [Tidelift](https://www.tidelift.com/) (@tidelift), [Sentry](https://sentry.io) (@getsentry), [HiredScore](https://hiredscore.com) (@HiredScore), [FilePreviews](http://filepreviews.io/) (@filepreviews), and Daniel Fortunov (@asqui). ###### Maintenance Sustainers [Adam Hill](https://adamghill.com) (@adamghill), Dan Groshev (@si14), Magnus Watn (@magnuswatn), [David Cramer](http://cra.mr) (@dcramer), Moving Content AG (@moving-content), [Stein Magnus Jodal](https://jod.al) (@jodal), [ProteinQure](https://proteinqure.com/) (@ProteinQure), Jesse Snyder (@jessesnyder), [Rivo Laks](https://rivolaks.com) (@rivol), [Tom Ballinger](http://ballingt.com/) (@thomasballinger), @medecau, [Ionel Cristian Mărieș](https://blog.ionelmc.ro) (@ionelmc), [The Westervelt Company](https://westervelt.com) (@westerveltco), Philippe Galvan (@PhilippeGalvan), Birk Jernström (@birkjernstrom), [Tim Schilling](www.better-simple.com) (@tim-schilling), Chris Withers (@cjw296), [Christopher Dignam](https://christopher.xyz) (@chdsbd), and [Stefan Hagen](https://stefan-hagen.website) (@sthagen). Not to forget 3 more amazing humans who chose to be generous but anonymous! ##### Full Changelog ###### Backwards-incompatible Changes - Python 3.6 has been dropped and packaging switched to static package data using [Hatch](https://hatch.pypa.io/latest/). [\#993](https://github.com/python-attrs/attrs/issues/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](https://github.com/python-attrs/attrs/issues/1120) ###### Changes - `attrs.filters.exclude()` and `attrs.filters.include()` now support the passing of attribute names as strings. [\#1068](https://github.com/python-attrs/attrs/issues/1068) - `attrs.has()` and `attrs.fields()` now handle generic classes correctly. [\#1079](https://github.com/python-attrs/attrs/issues/1079) - Fix frozen exception classes when raised within e.g. `contextlib.contextmanager`, which mutates their `__traceback__` attributes. [\#1081](https://github.com/python-attrs/attrs/issues/1081) - `@frozen` now works with type checkers that implement [PEP-681](https://peps.python.org/pep-0681/) (ex. [pyright](https://github.com/microsoft/pyright/)). [\#1084](https://github.com/python-attrs/attrs/issues/1084) - Restored ability to unpickle instances pickled before 22.2.0. [\#1085](https://github.com/python-attrs/attrs/issues/1085) - `attrs.asdict()`'s and `attrs.astuple()`'s type stubs now accept the `attrs.AttrsInstance` protocol. [\#1090](https://github.com/python-attrs/attrs/issues/1090) - Fix slots class cellvar updating closure in CPython 3.8+ even when `__code__` introspection is unavailable. [\#1092](https://github.com/python-attrs/attrs/issues/1092) - `attrs.resolve_types()` can now pass `include_extras` to `typing.get_type_hints()` on Python 3.9+, and does so by default. [\#1099](https://github.com/python-attrs/attrs/issues/1099) - Added instructions for pull re _[Truncated at 4000 characters — full notes: https://github.com/python-attrs/attrs/releases/tag/23.1.0]_