Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3k
FixEnum.value
inference forEnum
s with@cache
d methods#19374
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
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
Should I add something to the changelog? I think this is a user-facing change. |
This comment has been minimized.
This comment has been minimized.
We build changelog from the commit history, like#19138, so no need to add CHANGELOG entries in every PR:) |
mypy/plugins/enums.py Outdated
@@ -194,12 +194,7 @@ class SomeEnum: | |||
for n in stnodes | |||
if n is None or not n.implicit |
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.
I'm not sure this check is still needed - can there be anyenum_members
that areimplicit
? That should never happen AFAIC
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.
Seems like it is? With
diff --git i/mypy/plugins/enums.py w/mypy/plugins/enums.pyindex 35338d091..c6e9f21b6 100644--- i/mypy/plugins/enums.py+++ w/mypy/plugins/enums.py@@ -192,7 +192,7 @@ def enum_value_callback(ctx: mypy.plugin.AttributeContext) -> Type: node_types = ( get_proper_type(n.type) if n else None for n in stnodes- if n is None or not n.implicit+ if n is None ) proper_types = [_infer_value_type_with_auto_fallback(ctx, t) for t in node_types] underlying_type = _first(proper_types)
I get
$pytest-ktestValueFallbackWithCachedMethod=============================testsessionstarts==============================platformlinux--Python3.12.6,pytest-8.3.5,pluggy-1.6.0rootdir:/home/kevinmurphy/src/python/mypyconfigfile:pyproject.tomltestpaths:mypy/test,mypyc/testplugins:xdist-3.7.0,cov-6.1.16workers [1item]F [100%]===================================FAILURES===================================______________________testValueFallbackWithCachedMethod_______________________[gw0]linux--Python3.12.6/home/kevinmurphy/src/python/mypy/venv/bin/python3data:/home/kevinmurphy/src/python/mypy/test-data/unit/check-enum.test:2543:Failed:Unexpectedtypecheckeroutput (/home/kevinmurphy/src/python/mypy/test-data/unit/check-enum.test,line2543)-----------------------------Capturedstderrcall-----------------------------Expected:main:19:note:Revealedtypeis"builtins.int"main:22:note:Revealedtypeis"builtins.int" (diff)Actual:main:19:note:Revealedtypeis"builtins.int"main:22:note:Revealedtypeis"Any" (diff)Alignmentoffirstlinedifference:E: ...ote:Revealedtypeis"builtins.int"A: ...ote:Revealedtypeis"Any"^Updatethetestoutputusing--update-data (implies-n0;youcanadditionallyusethe-kselectortoupdateonlyspecifictests)===========================shorttestsummaryinfo============================FAILEDmypy/test/testcheck.py::TypeCheckSuite::check-enum.test::testValueFallbackWithCachedMethod==============================1failedin2.26s===============================
sterliakovJul 11, 2025 • 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.
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.
Sorry, I didn't mean to suggest only retainingNone
items:) I asked if theif
clause can be removed altogether:n is None or not n.implicit
should be true for alln
coming fromenum_members
(all members should not beimplicit
- attrs with annotation and without value are assumed to be nonmembers according to the spec). Probably none of them should beNone
either, maybe just
node_types = (get_proper_type(info[name].type) for name in info.enum_members)
is enough now?
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.
Ah, yes, I think1cedcf9 will work! I'll go ahead and squash that into the other commit.
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.
.. and resolve the upstream conflict while I'm at it.
1cedcf9
toe116ada
CompareBefore this, adding an annotation like `@functools.cache` to anymethod on an `Enum` caused the inference for the class's `.value`to fail (i.e., become `Any`).Fixespython#19368Co-authored-by: Stanislav Terliakov <50529348+sterliakov@users.noreply.github.com>
e116ada
to110a1a9
CompareAccording tomypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
Uh oh!
There was an error while loading.Please reload this page.
Before this, adding an annotation like
@functools.cache
to any method on anEnum
caused the inference for the class's.value
to fail (i.e., becomeAny
).Fixes#19368