如何为Python中动态创建的Enum枚举类添加正确的类型提示?
解决方案
针对动态生成Enum的类型提示需求,有两种常见的可落地实现方案,都可以适配条目较多的场景:
方案1:使用类型存根文件(最推荐)
完全不修改原有运行时代码,仅新增同名.pyi类型声明文件即可,类型检查工具会自动读取该文件的声明信息。
比如你的业务代码存放在my_module.py中,新增my_module.pyi文件,内容如下:
from enum import Enum class FooEnum(Enum): DAY: str WEEK: str MONTH: str # 剩余97个枚举成员直接按上述格式逐行补充即可,复制key_value的键列表即可快速生成
原有动态创建Enum的代码不需要做任何改动,运行时逻辑完全不受影响,mypy、pyright等主流类型检查工具都可以正常识别FooEnum的所有枚举成员。
方案2:用cast强转类型(无需单独维护存根文件)
如果不想额外维护存根文件,可以用typing.cast结合Literal声明枚举的所有键,直接在业务代码中补充类型提示:
from typing import Literal, cast from enum import Enum key_value = {"DAY": "d", "WEEK": "w", "MONTH": "m"} # 按实际情况补充Literal内的所有枚举键 FooEnumKey = Literal["DAY", "WEEK", "MONTH"] FooEnum = cast(type[Enum[FooEnumKey, str]], Enum("FooEnum", key_value))
该方案同样可以让类型检查工具识别所有枚举成员,新增枚举条目时只需要同步更新Literal内的键列表即可。
注意:动态生成的枚举成员是运行时才创建的,静态类型检查工具无法直接识别运行时数据,因此两种方案都需要你静态声明所有枚举键的信息,不存在不需要声明键即可自动推导的通用原生方案。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

