[英]Not sure why this generates a mypy "Incompatible types in assignment"
让我困惑的简单例子:
from typing import Callable, List, Union
Value = Union[bool, int, str]
Helper = Callable[[Value], List[Value]]
def func_with_alias(aa: Value) -> List[Value]:
return []
def func_with_type(aa: bool) -> List[Value]:
return []
your_func1: Helper = func_with_alias
your_func2: Helper = func_with_type
mypy 抱怨“your_func2”的类型不兼容: error: Incompatible types in assignment (expression has type "Callable[[bool], List[Union[bool, int, str]]]", variable has type "Callable[[Union[bool, int, str]], List[Union[bool, int, str]]]")
为什么它不让我这样做,因为bool
在Union[bool, int, str]
?
❯ mypy --version
mypy 0.782
让我们看看你对类型定义的看法:
Value = Union[bool, int, str]
值可以是布尔值、整数或字符串。
Helper = Callable[[Value], List[Value]]
Helper 接受一个值并返回一个值列表。
现在错误的分配:
def func_with_type(aa: bool) -> List[Value]:
return []
your_func2: Helper = func_with_type
func_with_type
只接受一个布尔值,但你将它分配给一个也应该能够接受整数或字符串的类型。
要了解为什么这没有意义,请考虑以下Helper
函数的使用者:
def consumer(func: Helper) -> List[Value]:
return func("Hello, world!")
Helper
可以接受一个Value
,它可以是bool
、 int
或str
,所以这种用法应该没问题。 但是func_with_type
只接受一个bool
,所以不能以这种方式调用,因此我们不能认为它是一个Helper
。
我实际上在做的是构建一个调度字典,它有一个实际类的键(比如 bool、int 或 str)和一个处理它的函数的值。 返回值是一个值列表(例如,bool、int 或 str)。
可能你想要的是一个泛型函数,其中泛型类型受联合约束:
T = TypeVar('T', bool, int, str)
Helper = Callable[[T], List[T]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.