如何使用相同的重载签名输入多个相似的python函数



我有两个非常相似的函数,第二个函数调用第一个函数(并且在实际代码中稍后执行其他操作)。

都有两个参数,可以有多个类型,但只有某些组合有意义,因此我使用重载来表示(实际代码也会引发无效组合)。请看下面的例子:

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]

相关内容

  • 没有找到相关文章

最新更新