'How do I annotate a callable with *args and **kwargs?
I have a function which returns a function. I would like to find a proper type annotation. However, the returned function has *args and *kwargs. How is that annotated within Callable[[Parameters???], ReturnType]?
Example:
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
Solution 1:[1]
With the introduction of typing.Protocol, MyPy (and other compliant type checkers) support the full call syntax natively via the __call__ special method.
MyPy: Callback Protocols
Protocols can be used to define flexible callback types that are hard (or even impossible) to express using the
Callable[...]syntax, such as variadic, overloaded, and complex generic callbacks. (...)
Simply define a Protocol whose __call__ method has the desired signature.
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
Note that the Protocol's __call__ must include a self parameter. This parameter is ignored when comparing other signatures against the Protocol.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | JoseKilo |
