【问题标题】:Mypy error: "Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader"Mypy 错误:“重载的函数签名 2 永远不会匹配:签名 1 的参数类型相同或更宽”
【发布时间】:2021-11-19 07:23:24
【问题描述】:

我试图了解在键入函数时如何使用重载装饰器。如果我编写以下代码并通过 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 的参数类型相同或更广泛 在 1 个文件中发现 1 个错误(已检查 1 个源文件)"

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

这是怎么回事?

【问题讨论】:

标签: python type-hinting mypy python-typing


【解决方案1】:

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: ...

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 2018-01-12
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多