Python Glossary English

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Сообщить о неточности