Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3.1k
Fix attrs hashability detection when inheriting from mutable#17012
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
This comment has been minimized.
This comment has been minimized.
1 similar comment
This comment has been minimized.
This comment has been minimized.
633db11 to45454efCompareTinche commentedMar 11, 2024
@sobolevn Ready for review, if you have time! |
According tomypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of eq and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of eq and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of eq and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of eq and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of `eq` and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
Hnasar commentedMar 11, 2024
Thanks for the quick fix@Tinche ! I was curious to learn myself how attrs handles this, so I ended up cloning your fix and testing it out, but realized that the logic didn't always accurately match attrs'. And also it didn't fix the regression I reported in#17015. So I reworked some of the subtle issues with this patch and added several other test cases here#17016 |
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of `eq` and`unsafe_hash`.Fixespython#17015Fixespython#16556 (comment)Based on a patch inpython#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>
sobolevn commentedMar 12, 2024
@Tinche can you please first decide which PR should be reviewed? :) |
Tinche commentedMar 12, 2024
This commit fixes a couple regressions in 1.9.0 from91be285.Attrs' logic for hashability is slightly complex:*https://www.attrs.org/en/stable/hashing.html*https://github.com/python-attrs/attrs/blob/9e443b18527dc96b194e92805fa751cbf8434ba9/src/attr/_make.py#L1660-L1689Mypy now properly emulates attrs' logic so that custom `__hash__`implementations are preserved, `@frozen` subclasses are always hashable,and classes are only made unhashable based on the values of `eq` and`unsafe_hash`.Fixes#17015Fixes#16556 (comment)Based on a patch in#17012Co-Authored-By: Tin Tvrtkovic <tinchester@gmail.com>Co-authored-by: Hashem Nasarat <hashem@hudson-trading.com>
Frozenattrs classes inheriting from mutable classes are hashable; fix this case and add a test.
Also support frozen classes with
hash=False(although I'm not sure this is a common use case at all, but it was easy to add).