我有两个非常相似的函数,第二个函数调用第一个函数(并且在实际代码中稍后执行其他操作)。
都有两个参数,可以有多个类型,但只有某些组合有意义,因此我使用重载来表示(实际代码也会引发无效组合)。请看下面的例子:
from typing import overload
@overload
def x(k: int, m: float) -> int:
...
@overload
def x(k: str, m: bytes) -> str:
...
def x(k: int | str, m: float | bytes) -> int | str:
return k
@overload
def y(k: int, m: float) -> int:
...
@overload
def y(k: str, m: bytes) -> str:
...
def y(k: int | str, m: float | bytes) -> int | str:
return x(k, m)
现在我抱怨:
error: No overload variant of "x" matches argument type "Union[int, str]" [call-overload]
note: Possible overload variants:
note: def x(k: int, m: float) -> int
note: def x(k: str, m: bytes) -> str
这样一个问题的正确输入方式是什么?
我认为你已经达到了python的overload
的限制,当
def y(k: int | str, m: float | bytes) -> int | str:
是推荐的方式来写它,它不是严格正确的。这太宽泛了,我认为没有其他办法。您将不得不在y
的实现签名和调用x
之间的某个点再次缩小类型。你可以做isinstance
检查,但由于这需要一些费用,我个人只做# type: ignore[call-overload]
。