Closed
Description
Perhaps a callable that accepts arbitrary arguments by having (*args: Any, **kwargs: Any)
could be treated similarly to Callable[..., X]
(with explicit ...
), i.e. a callable with arbitrary arguments would be compatible with it.
The reason for this is that there's no easy way to annotate a function so that the type would be Callable[..., X]
, even though this seems to be a somewhat common need. Users sometimes assume that using (*args: Any, **kwargs: Any)
will work for this purpose and are confused when it doesn't. python/typing#264 (comment) is a recent example.
Example:
from typing import Any
class A:
# A method that accepts unspecified arguments and returns int
def f(self, *args: Any, **kwargs: Any) -> int: pass
class B(A):
def f(self, x: int) -> int: pass # Should be okay
We could perhaps extend this to handle decorators as well:
from typing import Any, Callable, TypeVar
T = TypeVar('T', bound=Callable[..., Any])
def deco(f: T) -> T:
def wrapper(*args: Any, **kwargs: Any) -> Any:
print('called')
return f(*args, **kwargs)
return wrapper # Maybe this should be okay