我有以下代码:
AnyTypeEnum = TypeVar("AnyTypeEnum", Type[Enum], Type[IntEnum])
AnyEnum = TypeVar("AnyEnum", Enum, IntEnum)
def decode(value: str, enum_class: AnyTypeEnum) -> AnyEnum:
return make_map(enum_class)[value]
@functools.cache()
def make_map(enum_class: AnyTypeEnum) -> Dict[str, AnyEnum]:
return {x.name: x for x in enum_class}
如果我传递一个IntEnum类,我将在输出中具有IntEnum值,与Enum相同。从一个类到另一个类的值的混合是不可能的。
然而,mypy报告了错误:
1.第9行:字典理解具有不兼容的类型Enum,应为IntEnum
2.第9行:字典理解具有不兼容的类型IntEnum,应为Enum
我正在使用TypeVar来解决";类型混合";如果我使用Union,则会出现输入和输出之间的差异,但显然这并不是完全固定的。
我该如何解决此问题?
您没有任何东西绑定您的输出和输入类型。目前他们完全没有关系。试试这个
AnyEnum = TypeVar("AnyEnum", Enum, IntEnum)
def decode(value: str, enum_class: Type[AnyEnum]) -> AnyEnum:
return make_map(enum_class)[value]
@functools.cache()
def make_map(enum_class: Type[AnyEnum]) -> Dict[str, AnyEnum]:
return {x.name: x for x in enum_class}
或者,@overload
应该起作用。