Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3.1k
Improve attrs hashability detection#16556
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.
This comment has been minimized.
This comment has been minimized.
Tinche commentedDec 8, 2023
@sobolevn Does this look good to you? 🙏 |
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
This comment has been minimized.
This comment has been minimized.
According tomypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
sobolevn left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Let's wait a bit for more possible input. I will merge this in several days.
brianmedigate commentedMar 10, 2024 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@Tinche are you sure about the inheritance behavior? I just upgraded to mypy 1.9 and encountered this. I have a In [1]:importattrsIn [2]: @attrs.define ...:classA: ...:a:int ...:In [3]: @attrs.define(frozen=True) ...:classB(A): ...:b:int ...:In [4]:hash(B(a=1,b=2))Out[4]:-1340312973636267308In [5]:hash(A(a=1))---------------------------------------------------------------------------TypeErrorTraceback (mostrecentcalllast)CellIn[5],line1---->1hash(A(a=1))TypeError:unhashabletype:'A' However mypy doesn't seem to think it is: importattrsimportfunctools@attrs.defineclassA:a:int@attrs.define(frozen=True)classB(A):b:intb=B(a=1,b=2)@functools.lru_cache()deffoo(b:B)->int:returnb.bfoo(b) This is using attrs 23.3.0, mypy 1.9.0. |
Tinche commentedMar 10, 2024
@brianmedigate I tested the other direction :/ I'll look into handling this case in a new PR. |
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>
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`.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>
Fixes#16550
Improve hashability detection for attrs classes.
I added a new parameter to
add_attribute_to_class,overwrite_existing, since I needed it.Frozen classes remain hashable, non-frozen default to no. This can be overriden by passing in
hash=Trueorunsafe_hash=True(new parameter, added to stubs) todefine().Inheritance-wise I think we're correct, if a non-hashable class inherits from a hashable one, it's still unhashable at runtime.
Accompanying tests.