繁体   English   中英

具有可变数量的 str/相同类型参数的 Callable 的 Python 类型提示?

[英]Python type hint for Callable with variable number of str/same type arguments?

如何为所有这些可调用对象指定一种类型:

a(str)
b(str, str)
c(str, str, str)
d(str, str, str, str

我发现我可以以一般方式指定Callable[..., None]但如何详细指定所有参数都将是 str 而不使用丑陋的语法Union[Callable[[str], None], Callable[[str, str], None, __more_like_this__] 有其他方法可以做到吗? 我可以通过使用打字来做到吗?

您可以使用回调协议来指定具有可变参数字符串参数的函数类型:

from typing_extensions import Protocol


class Callback(Protocol):
    def __call__(self, *args: str) -> None: ...

并像这样使用它:

def handler(cb: Callback) -> None:
    cb('a', 'b', 'c')

def callback(*args: str) -> None:
    pass

handler(callback)

请注意,回调必须采用可变参数,例如。 这行不通:

def callback(a: str, b: str) -> None:
    pass

协议在 Python 3.8 中添加到标准库 类型模块中,因此如果您想在 Python 3.5-3.7 上使用它们,则需要从 PyPI 安装类型扩展模块。

你想要的是 4 种不同类型的联合。

t1 = Union[
 Callable[[str],Any],
 Callable[[str,str],Any],
 Callable[[str,str,str],Any],
 Callable[[str,str,str,str],Any],
]

对比一下可以接受 1 到 4 个参数的函数类型:

t2 = Callable[[str,Optional[str],Optional[str],Optional[str]],Any]

一个函数像

def foo(x: str, y:str):

不属于上述第二种。 如果我说我需要一个t2类型的函数,你不知道我可能会尝试传递多少个参数。 我可以给你foo ,但是你可能会尝试传递 3 个参数,或者只传递 1 个参数,然后得到一个TypeError

如果你要求一个t1类型的函数,我可以给你foo t1承诺在所有值t1可以比正好3个参数或多或少; 它只包含do 的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM