-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Bug Report
The enum metaclass will skip callables so that defining methods on an enum still works. This introduces a subtle logic error that won't be caught be mypy. If you assign callables to the enum members the enum will pick it up as a method, but mypy thinks it will pick it up as an enum member.
To Reproduce
import enum
class Transform(enum.Enum):
upper = str.upper
lower = str.lower
reveal_type(Transform.upper)
Expected Behavior
reveal_type
on Transform.upper
should yield something along the lines of Callable[[str], str]
, since in the actual class it will be a method.
Actual Behavior
reveal_type
yields Literal[Transform.upper]
. While this is intuitively what should happen, when looking at this code, in practice this doesn't work, due to the implementation details of Enum
. (I'm not sure it's possible to make this work without wrapping the callable in some other object first)
As such it will hide a bug, that should be easy for mypy to detect and report.
Your Environment
- Mypy version used: 1.4.1
- Mypy command-line flags: None (just used on the file/module/package)
- Mypy configuration options from
mypy.ini
(and other config files):
python_version = "3.10"
ignore_missing_imports = false
namespace_packages = true
disallow_any_generics = true
disallow_untyped_defs = true
warn_redundant_casts = true
warn_unreachable = true
warn_unused_ignores = true
plugins = ["mypy_zope.plugin"]
- Python version used: 3.10