Python(mypy)强类型枚举使用:解决Enum.value类型推断为Any的问题
解决方案
方案1:使用标准库IntEnum(仅适配整数值枚举)
这是成本最低的适配方案,IntEnum是enum模块原生提供的整数值枚举专用基类,mypy对其有原生类型支持,直接替换原有Enum基类即可:
from enum import IntEnum class Role(IntEnum): ENG = 0 PRODUCT = 1 BUSINESS = 2 FOUNDER = 3 a = Role(2) a.value # mypy 会正确推断为int类型
方案2:自定义泛型枚举基类(适配任意类型的枚举值)
如果你的枚举值不局限于整数,想要通用的类型推断能力,可以自己实现一个带泛型参数的枚举基类,后续定义枚举时直接指定值的类型即可:
from enum import Enum from typing import Generic, TypeVar T = TypeVar('T') class TypedEnum(Generic[T], Enum): # 显式声明value的类型为泛型参数T value: T # 定义枚举时指定值的类型为int class Role(TypedEnum[int]): ENG = 0 PRODUCT = 1 BUSINESS = 2 FOUNDER = 3 a = Role(2) a.value # mypy 准确推断为int类型
如果枚举值是字符串类型,仅需将TypedEnum[int]改为TypedEnum[str]即可,支持所有值类型的枚举定义。
补充说明
- 两种方案都无需修改现有枚举的业务逻辑,仅调整基类声明即可
- 如果同一个枚举类下存在不同类型的枚举值,mypy会自动将
value推断为所有值类型的联合类型,符合实际使用预期
内容的提问来源于stack exchange,提问作者Adhyyan Sekhsaria
相关产品推荐
相关产品推荐

