Mypy提示重载函数签名2无法匹配报错原因求解
错误触发原因
这个报错的核心逻辑来自两部分规则的共同作用:
- PEP 484 类型规范明确约定,Python 类型系统中
int是float的子类型,所有int类型的值都可以合法传入标注为float类型的参数位置,二者不存在类型冲突。 - Mypy 匹配重载函数签名时遵循从上到下依次匹配、匹配成功即终止的规则,不会主动寻找最精确的签名,只会按顺序匹配第一个符合参数类型要求的签名。
你当前的代码中,参数范围更宽的float签名放在了第一位:当传入两个int类型的参数时,因为int兼容float,会直接命中第一个签名,第二个int签名永远没有被匹配到的可能,因此 Mypy 抛出该错误。
修复方案
只需要调整重载签名的顺序,把参数类型更精确、范围更窄的签名放在前面,更宽泛的签名放在后面即可:
from typing import Union, overload @overload def myfunc(a: int, b: int) -> int: ... @overload def myfunc(a: float, b: float) -> float: ... def myfunc(a: Union[float, int], b: Union[float, int]) -> Union[float, int]: return a + b
调整顺序后,传入两个int会优先命中第一个签名返回int类型,传入float参数则会命中第二个签名返回float类型,符合预期,也不会再触发 Mypy 报错。
内容的提问来源于stack exchange,提问作者Andrew Stewart
相关产品推荐
相关产品推荐

