Skip to content

Preserve astuple filters for dictionary keys and values - #1641

Open
skyon0522-ai wants to merge 3 commits into
python-attrs:mainfrom
skyon0522-ai:codex/astuple-mapping-filter
Open

skyon0522-ai wants to merge 3 commits into
python-attrs:mainfrom
skyon0522-ai:codex/astuple-mapping-filter

Conversation

@skyon0522-ai

@skyon0522-ai skyon0522-ai commented Oct 8, 2026 •

Copy link
Copy Markdown

Summary

When astuple() converts attrs instances stored in dictionary keys or values, it drops the supplied filter during recursion.
For example, excluding y leaves {(1, 2): (3, 4)} inside the output tuple instead of {(1,): (3,)}.
Directly nested instances and instances in sequences already receive the filter.

Forward the filter to both dictionary recursion calls.
The regression covers keys and values, dict and OrderedDict, and both collection-retention settings.
The docstring describes the behavior and includes a versionchanged:: 26.2.0 directive; a news fragment is included.

The same two missing filter=filter arguments appeared in #1577 (closed).
This PR isolates mapping filter propagation in a three-file change, with key/value and retention coverage and documentation, without the unrelated converter changes present in that proposal.

Validation

  • All four new regression cases failed on unchanged base 644b4e165bfbeee7e127de6fcbda08b64014316f.
  • After the fix, tests/test_funcs.py: 57 passed.
  • Full pytest tests -q on source-and-tests revision 3eb74883d6a04ee3a9198cef3291f86b94f97efc: 1405 passed, 10 skipped, 1 xfailed.
  • Ruff lint and format checks pass for the changed Python files.
  • Towncrier 26.9.0 draft rendering passes and includes the entry for Preserve astuple filters for dictionary keys and values #1641.
  • The complete tox matrix and documentation build were not run locally; remote checks are reported by this PR's CI.

The first full-suite attempts exposed missing package metadata and incomplete Git history in the local environment.
Installing the checkout in editable mode with complete history and tags resolved those failures; the full-suite result above is from the corrected environment.

After the PR number was assigned, the news fragment was renamed to changelog.d/1641.change.md.
Current head 9dbbede1f14c1f60ad155b75a208d53fbce55f98 has identical source and tests to the full-suite revision above; only the fragment filename changed.

OpenAI Codex assisted with the investigation, implementation, tests, and this description.
I have reviewed and understand the full diff and accept responsibility under the project's AI policy.

The type-stub, typing-fixture, re-export, and new API-index checklist items are not applicable: this change adds no public symbol and changes no signature.
They are checked as permitted by the template.

Pull Request Checklist

  • I acknowledge this project's AI policy.
  • This pull request is not from my main branch.
  • There's tests for all new and changed code.
  • Changes or additions to public APIs are reflected in our type stubs (files ending in .pyi).
    • ...and used in the stub test file typing_tests/baseline.py or, if necessary, typing_tests/mypy.py.
    • If they've been added to attr/__init__.pyi, they've also been re-imported in attrs/__init__.pyi.
  • The documentation has been updated.
    • New functions/classes have to be added to docs/api.rst by hand.
    • Changes to the signatures of @attr.s() and @attrs.define() have to be added by hand too.
    • Changed/added classes/methods/functions have appropriate versionadded, versionchanged, or deprecated directives.
      The next version is the second number in the current release + 1.
      The first number represents the current year.
      So if the current version on PyPI is 26.2.0, the next version is gonna be 26.3.0.
      If the next version is the first in the new year, it'll be 27.1.0.
    • Documentation in .rst and .md files is written using semantic newlines.
  • Changes have news fragments in changelog.d.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant