Python 3.3+collectionsпонятие
collections.abc.Callable
collections.abc — протоколы
Абстрактный класс «вызываемый объект»: для isinstance-проверки и, главное, для аннотаций вида Callable[[int], str].
Синтаксис
from collections.abc import Callable
def apply(f: Callable[[int], str], x: int) -> str: ...
Для проверки в рантайме проще встроенная callable(obj): она смотрит на слот вызова типа, а isinstance(obj, Callable) — на метод __call__ в MRO, и они расходятся на краях: класс с __call__ = None для callable() «вызываем», а для Callable — нет. Параметризованная форма Callable[[int], str] годится только в аннотации: isinstance с ней падает TypeError, сигнатуру в рантайме никто не проверяет. Аннотация typing.Callable — устаревший псевдоним этого же класса, с 3.9 пишут collections.abc.Callable.
Примеры
from collections.abc import Callable
print(isinstance(len, Callable), isinstance(42, Callable)) # → True False
class Box:
__call__ = None
print(callable(Box()), isinstance(Box(), Callable)) # → True False — края расходятся
# Python 3.9+
from collections.abc import Callable
def apply(f: Callable[[int], str], x: int) -> str:
return f(x)
print(apply(hex, 255)) # → 0xff
try:
isinstance(hex, Callable[[int], str])
except TypeError as e:
print(e) # → isinstance() argument 2 cannot be a parameterized generic
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности