当多个类型在输入和输出中但它们之间是 1 对 1 关系时的类型提示

Type hinting when multiple types are in input and output but in 1-to-1 relation between them

我有以下代码:

 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 class,我将在输出中得到 IntEnum 值,与 Enum 相同。从一个 class 到另一个的值的混合是不可能的。

然而,mypy 报错:

1.Line 9: 字典推导具有不兼容的枚举类型,应为 IntEnum

2.Line 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 应该可以。