And*_*art 5 python type-hinting mypy python-typing
我试图了解在键入函数时如何使用重载装饰器。如果我编写以下代码并通过 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
Run Code Online (Sandbox Code Playgroud)
然后我收到“错误:重载函数签名 2 永远不会匹配:签名 1 的参数类型相同或更广泛在 1 个文件中发现 1 个错误(已检查 1 个源文件)”
我不明白为什么签名 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: ...
Run Code Online (Sandbox Code Playgroud)