# attrs: what changed from 25 to 26 - Product: attrs (https://whatsnew.fyi/product/attrs) - Vendor: attrs - Range: changelog entries numbered after 25.4.0 up to and including 26.1.0, stable releases only - Entries below: 1 release (newest first) - Resolved: 25 is 25.4.0 and 26 is 26.1.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 0 - Page: https://whatsnew.fyi/product/attrs/compare/25...26 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. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (6 changes, grouped by kind) ### Added #### 26.1.0 (2026-03-19) - Add Attribute.alias_is_default flag to indicate whether the alias was auto-generated (True) or explicitly set by the user (False) - It is now possible to pass attrs instances in addition to attrs classes to attrs.fields() ### Changed #### 26.1.0 (2026-03-19) - Field aliases are now resolved before calling field_transformer, so transformers receive fully populated Attribute objects with usable alias values instead of None - The attrs.validators.disabled() contextmanager can now be nested - Frozen classes can set on_setattr=attrs.setters.NO_OP in addition to None ### Fixed #### 26.1.0 (2026-03-19) - Fix type annotations for attrs.validators.optional() so it no longer rejects tuples with more than one validator ## Release notes ### 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 - **changed** — Field aliases are now resolved before calling field_transformer, so transformers receive fully populated Attribute objects with usable alias values instead of None - **added** — Add Attribute.alias_is_default flag to indicate whether the alias was auto-generated (True) or explicitly set by the user (False) - **fixed** — Fix type annotations for attrs.validators.optional() so it no longer rejects tuples with more than one validator - **changed** — The attrs.validators.disabled() contextmanager can now be nested - **changed** — Frozen classes can set on_setattr=attrs.setters.NO_OP in addition to None - **added** — It is now possible to pass attrs instances in addition to attrs classes to attrs.fields() ##### 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]_