a объектом типа int, мы можем написать isinstance(a, int)
Но что, если нам нужно проверить, является ли a функцией?
Мы не можем написать isinstance(a, function), потому что function — это не тип. А где взять тип функции? В модуле types.
from types import FunctionType
...
print(isinstance(a, FunctionType))
Кроме FunctionType, в модуле есть много других полезных типов: например, ModuleType, AsyncGeneratorType, TracebackType.
Но если в builtins этих объектов нет, то откуда они в types? А давайте посмотрим в исходный код модуля. Это очень смешно...
def _f(): pass
FunctionType = type(_f)
Да, именно так определяется FunctionType. И все остальные аналогично (некоторые на картинке ниже).
Чтобы получить TracebackType, в коде поднимается ошибка и сразу же обрабатывается.
Мораль: Питонисты могут не писать костыли. Костыли уже написаны за них...
Это же callable решается
callable != function
Обсуждают сегодня