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: ...
我正在尝试了解如何在键入函数时使用重载装饰器。如果我编写以下代码并通过 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: ...