当多个类型在输入和输出中但它们之间是 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
应该可以。
我有以下代码:
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
应该可以。