Это отчасти потому, что классы во время выполнения не могут на самом деле наследовать от функции или вызываемого объекта для начала, а отчасти потому, что вам не нужно явно наследовать от Callable
, чтобы указать, что класс может быть вызван.
Например, следующие типы программ проверяются, как и ожидалось, с использованием mypy 0.630:
from typing import Callable, Union, NoReturn, List
class Foo:
def __call__(self, t: Union[str, int]) -> NoReturn:
pass
class FooChild(Foo): pass
class Bad:
def __call__(self, t: List[str]) -> NoReturn:
pass
def expects_callable(x: Callable[[Union[str, int]], NoReturn]) -> None:
pass
expects_callable(Foo()) # No error
expects_callable(FooChild()) # No error
expects_callable(Bad()) # Error here: Bad.__call__ has an incompatible signature
По сути, если у класса есть метод __call__
, подразумевается, что класс также является вызываемым.