[英]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.