如何解决为什么类型联合不能解析为 Python 中的约束泛型类型?
我有以下示例。
from typing import Union,TypeVar,Dict,Sequence
IdentifierSymbol = TypeVar("IdentifierSymbol",str,int)
def f(ids: Sequence[IdentifierSymbol]) -> Dict[int,IdentifierSymbol]:
return dict(zip(range(len(ids)),ids))
def g(ids: Union[Sequence[int],Sequence[str]]) -> int:
x = f(ids)
return 1
PyLance(我猜在里面使用了 mypy)在 x=f(ids)
行中抱怨以下内容:
Argument of type "Sequence[int] | Sequence[str]" cannot be assigned to parameter "ids" of type "Sequence[IdentifierSymbol@f]" in function "f"
Type "Sequence[int] | Sequence[str]" cannot be assigned to type "Sequence[IdentifierSymbol@f]"
TypeVar "_T_co@Sequence" is covariant
Type "str" is not compatible with constrained type "int" PylancereportGeneralTypeIssues
我不确定如何解释这一点,但听起来问题在于 int 与 str 不兼容。但为什么在这种情况下这是一个问题?我有一个 strs 序列或一个 int 序列,int 和 str 之间的兼容性从何而来?
解决方法
对于mypy
,那么在当前版本(0.800)中,由于推导类型变量(TypeVar
)的特殊性,这不起作用:当它的类型从多个类型(包括在 Union
和 Sequence
) 中使用,它被简化为它们最接近的公共基类型。在这种情况下,如果该公共基类型未包含在 TypeVar 约束列表中,则会出现错误。
此行为 may change 在未来版本中。
例如:
class A: ...
class B(A): ...
class C(A): ...
T = TypeVar("T")
def foo(var1: T,var2: T) -> T:
return var1
reveal_type(foo(B(),C())) # Revealed type is 'main.A*'
def bar(var: T) -> T:
return var
def baz(var: Union[A,B]):
reveal_type(bar(var)) # Revealed type is 'main.A*'
def qux(var: Sequence[T]) -> T:
return var[0]
def quux(var: Tuple[A,B]):
reveal_type(qux(var)) # Revealed type is 'main.A*'
def quuux(var: Union[Sequence[A],Sequence[B]]):
reveal_type(qux(var)) # Revealed type is 'main.A*'
您需要使用其他类型注释,例如使 g
函数也通用。也许有人会建议一个更优雅的解决方案。
def g(ids: Sequence[IdentifierSymbol]) -> int:
x = f(ids)
return 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。