python typing signature (typing.Callable) for function with kwargs python typing signature (typing.Callable) for function with kwargs python-3.x python-3.x

python typing signature (typing.Callable) for function with kwargs


You are probably looking for Callback protocols.

In short, when you want to express a callable with a complex signature, what you'll want to do is to create a custom Protocol that defines a __call__ method with the precise signature you want.

For example, in your case:

from typing import Protocol# Or, if you want to support Python 3.7 and below, install the typing_extensions# module via pip and do the below:from typing_extensions import Protocolclass MyCallable(Protocol):    def __call__(self, a: int, b: float) -> float: ...def good(a: int, b: float) -> float: ...def bad(x: int, y: float) -> float: ...def function_executor(a: int, b: float, fn: MyCallable) -> float:    return fn(a=a, b=b)function_executor(1, 2.3, good)  # Ok!function_executor(1, 2.3, bad)   # Errors

If you try type-checking this program using mypy, you'll get the following (admittedly cryptic) error on the last line:

Argument 3 to "function_executor" has incompatible type "Callable[[int, float], float]"; expected "MyCallable"

(Callback protocols are somewhat new, so hopefully the quality of the error messages will improve over time.)