繁体   English   中英

不知道为什么这会生成一个 mypy“分配中的不兼容类型”

[英]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]]]")

为什么它不让我这样做,因为boolUnion[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 ,它可以是boolintstr ,所以这种用法应该没问题。 但是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM