Mypy error: "Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader"

Mypy error: "Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader"

我正在尝试了解如何在键入函数时使用重载装饰器。如果我编写以下代码并通过 mypy 运行 它:

from typing import Union, overload

@overload
def myfunc(a: float, b: float) -> float: ...
@overload
def myfunc(a: int, b: int) -> int: ...

def myfunc(a: Union[float, int], b: Union[float, int]) -> Union[float, int]:
    return a + b

然后我收到“错误:永远不会匹配重载函数签名 2:签名 1 的参数类型相同或更广泛 Found 1 error in 1 file (checked 1 source file)"

我不明白为什么签名 1(即浮点数)的参数类型比签名 2(即整数)更广泛。

这是怎么回事?

mypy 有一个奇怪的特殊情况,它将 int 视为有效,而 float 是预期的,因为要求人们在整个地方写 Union[int, float] 已经很尴尬了阻碍类型注释的采用。这意味着 myfunc(1, 2) 匹配两个签名。

当一个重载函数的多个签名匹配一个调用时,mypy 将选择第一个定义的签名。按照您编写代码的方式,mypy 不可能选择 int 签名。 float 签名将始终 用于任何呼叫。

您可以通过将 int 签名放在首位来解决此问题:

@overload
def myfunc(a: int, b: int) -> int: ...
@overload
def myfunc(a: float, b: float) -> float: ...