繁体   English   中英

如何使用 *args 和 **kwargs 注释可调用对象?

[英]How do I annotate a callable with *args and **kwargs?

我有一个 function,它返回一个 function。 我想找到一个合适的类型注释。 但是,返回的 function 有*args*kwargs 这在Callable[[Parameters???], ReturnType]中是如何注释的?

例子:

from typing import Callable
import io
import pandas as pd

def get_conversion_function(file_type: str) -> Callable[[io.BytesIO, TODO], pd.DataFrame]:
    def to_csv(bytes_, *args, **kwargs):
        return pd.read_csv(bytes_, **kwargs)
    if file_type == "csv":
        return to_csv

随着typing.Protocol的引入,MyPy(和其他兼容的类型检查器)通过__call__特殊方法本地支持完整的调用语法。

MyPy: 回调协议

协议可用于定义使用Callable[...]语法难以(甚至不可能)表达的灵活回调类型,例如可变参数、重载和复杂的泛型回调。 (...)

只需定义一个Protocol ,其__call__方法具有所需的签名。

from typing import Protocol

class SomeCallable(Protocol):
      def __call__(self, a: str, b: int, *args: float, **kwargs: str) -> bytes: ...

def my_callable(a: str, b: int, *args: float, **kwargs: str) -> bytes:
    return b"Hello World"

def my_func(key: str) -> SomeCallable:
    return my_callable

请注意, Protocol__call__必须包含一个self参数。 将其他签名与Protocol进行比较时,将忽略此参数。

据我所知,python 的输入不允许像typing.Callable文档中所述那样直接执行此操作:

没有语法来指示可选或关键字 arguments; 此类 function 类型很少用作回调类型。 Callable[..., ReturnType](文字省略号)可用于键入提示一个可调用对象,该可调用对象采用任意数量的 arguments 并返回 ReturnType。

但是你可以像这样使用mypy 扩展

from typing import Callable
from mypy_extensions import Arg, VarArg, KwArg

def foo(a: str, *args: int, **kwargs: float) -> str:
    return 'Hello, {}'.format(a)
    
def bar() -> Callable[[Arg(str, 'a'), VarArg(int), KwArg(float)], str]:
    return foo

暂无
暂无

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

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