为Pydantic对象的枚举字段添加自定义描述时出现继承报错
枚举继承报错:无法扩展已有枚举类
我想为枚举字段添加自定义描述,编写了以下代码:
from enum import Enum from pydantic import BaseModel class BasicEnum(Enum): e1 = "E1" e2 = "E2" class ModifiedEnum(BasicEnum): """ This is really an enum!!! """ class PydandicObject(BaseModel): enum_field: ModifiedEnum
运行后抛出错误:
Traceback (most recent call last): File "tmp_enum.py", line 9, in <module> class ModifiedEnum(BasicEnum): File "C:\Users\lazlo\AppData\Local\Programs\Python\Python38\lib\enum.py", line 146, in __prepare__ metacls._check_for_existing_members(cls, bases) File "C:\Users\lazlo\AppData\Local\Programs\Python\Python38\lib\enum.py", line 527, in _check_for_existing_members raise TypeError( TypeError: ModifiedEnum: cannot extend enumeration 'BasicEnum'
问题原因
Python标准库的Enum不允许继承已定义成员的枚举类,这是枚举的设计规则——一旦枚举类包含了具体成员(如BasicEnum中的e1、e2),就无法被子类继承扩展。
解决方法
方法一:直接修改原枚举类的文档字符串
如果可以改动原枚举类,直接在BasicEnum上添加自定义描述:
from enum import Enum from pydantic import BaseModel class BasicEnum(Enum): """ This is really an enum!!! """ e1 = "E1" e2 = "E2" class PydandicObject(BaseModel): enum_field: BasicEnum
方法二:给单个枚举成员添加描述
如果需要为每个枚举成员单独设置说明,可以直接为成员的__doc__属性赋值:
from enum import Enum from pydantic import BaseModel class BasicEnum(Enum): e1 = "E1" e1.__doc__ = "第一个枚举成员" e2 = "E2" e2.__doc__ = "第二个枚举成员" class PydandicObject(BaseModel): enum_field: BasicEnum
方法三:自定义元类绕过检查(不推荐)
如果必须通过子类形式实现且不能修改原枚举,可以自定义元类跳过成员检查,但这种方式违反枚举的设计原则,可能引发意外问题:
from enum import Enum, EnumMeta from pydantic import BaseModel class BasicEnum(Enum): e1 = "E1" e2 = "E2" class NoCheckEnumMeta(EnumMeta): @classmethod def _check_for_existing_members(cls, enum_class, bases): # 跳过已有成员检查逻辑 pass class ModifiedEnum(BasicEnum, metaclass=NoCheckEnumMeta): """ This is really an enum!!! """ class PydandicObject(BaseModel): enum_field: ModifiedEnum
内容的提问来源于stack exchange,提问作者Lazloo Xp
相关产品推荐
相关产品推荐

