Uh oh!
There was an error while loading. Please reload this page.
Fix Enum.value inference for Enums with @cached methods - #19374
Conversation
kmurphy4
commented
Jul 4, 2025
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.
sterliakov
commented
Jul 4, 2025
We build changelog from the commit history, like #19138, so no need to add CHANGELOG entries in every PR:) |
| @@ -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.
I'm not sure this check is still needed - can there be any enum_members that are implicit? That should never happen AFAIC
There was a problem hiding this comment.
Seems like it is? With
diff --git i/mypy/plugins/enums.py w/mypy/plugins/enums.py
index 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===============================There was a problem hiding this comment.
Sorry, I didn't mean to suggest only retaining None items:) I asked if the if clause can be removed altogether: n is None or not n.implicit should be true for all n coming from enum_members (all members should not be implicit - attrs with annotation and without value are assumed to be nonmembers according to the spec). Probably none of them should be None 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.
Ah, yes, I think 1cedcf9 will work! I'll go ahead and squash that into the other commit.
There was a problem hiding this comment.
.. and resolve the upstream conflict while I'm at it.
1cedcf9 to
e116adaCompareBefore this, adding an annotation like `@functools.cache` to any method on an `Enum` caused the inference for the class's `.value` to fail (i.e., become `Any`). Fixespython#19368 Co-authored-by: Stanislav Terliakov <50529348+sterliakov@users.noreply.github.com>
e116ada to
110a1a9CompareAccording to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
kmurphy4
commented
Aug 1, 2025
@sterliakov bump? |
1 similar comment
kmurphy4
commented
Sep 2, 2025
@sterliakov bump? |
Before this, adding an annotation like
@functools.cacheto any method on anEnumcaused the inference for the class's.valueto fail (i.e., becomeAny).Fixes#19368