Search code examples
pythonpython-typingmypy

Python type hint Callable with one known positional type and then *args and **kwargs


I the below function foo, which has:

  • One positional arg with a known type
  • A variable number of positional and keyword args after that
from typing import Callable

def foo(bar: str, *args, **kwargs) -> None:
    """Some function with one positional arg and then *args and **kwargs."""

foo_: Callable[[str, ...], None] = foo  # error: Unexpected '...'

How can I type hint this?

Currently, mypy==0.812 throws the error: error: Unexpected '...' [misc]


Solution

  • I'd probably use Protocols for this. They're generally a bit more flexible than Callables. It would look something like this

    from typing import Protocol
    
    class BarFunc(Protocol):
        def __call__(fakeself, bar: str, *args, **kwargs) -> None:
            # fakeself gets swallowed by the class method binding logic
            # so this will match functions that have bar and the free arguments.
            ...
    
    def foo(bar: str, *args, **kwargs) -> None:
        """Some function with one positional arg and then *args and **kwargs."""
    
    foo_: BarFunc = foo