А так как в Python всё объекты то функции и классы тоже входят в этот список.
Но как проверить что нам вернули именно функцию? Не класс, не None и не число и не строку.
(Да, динамическая типизация в Python даёт о себе знать)
Например, у нас есть функция, полученная из вне.
>>> func = some_module.get_function()Надо убедиться что это именно функция. Какие есть варианты? Проверим, вызываемый ли это объект.
>>> hasattr(func, '__call__')Но это ничего не говорит о типе объекта. Вызываемым может быть и класс и генератор и lambda.
True
Лучше всего сравнить тип объекта с типом функции. Но как это сделать? Если бы у нас был int, то всё очевидно:
>>> isinstance(value, int)Но где взять ссылку на тип функции? Можно просто забрать его от любой функции
>>> # создаём пустую функциюКаждый раз нам этого делать не надо. Все нужные типы уже есть в модуле types, созданные именно таким способом. Нам остаётся только сделать сравнение
>>> def f():pass
>>> # сравниваем типы
>>> isinstance(func, type(f))
True
>>> import typesНо есть способ еще проще и понятней, это модуль inspect. Всё тоже самое но завёрнуто красиво.
>>> isinstance(func, types.FunctionType)
True
>>> import inspectПриведу неполный но часто используемый мною список функций этого модуля.
>>> inspect.isfunction(func)
True
Функции, определяющие что объект это:
.isfunction() — функция.isbuiltin() — стандартная функция Python.isclass() — класс (не инстанс класса).isabstract() — абстрактный класс.ismethod() — метод класса.isgenerator() — генератор.ismodule() — модуль#libs