Какой тип имеет имя функции в Python и что выводит print(type(имя_функции))
Что проверяют
Понимаете ли вы, что функция в Python это объект, а имя лишь переменная, которая на него ссылается. Следом обычно спрашивают про type(len) или метод, взятый у экземпляра, чтобы проверить, не заучен ли один ответ.
Как отвечать
Для функции, объявленной через def или lambda, print(type(my_func)) выведет <class 'function'>. Это класс types.FunctionType. Встроенного имени function нет: isinstance(f, function) упадёт с NameError, проверяют через types.FunctionType.
Строго говоря, тип есть у объекта, а не у имени. После g = my_func оба имени указывают на один объект, и g.__name__ вернёт 'my_func'.
Что выведет type() в похожих случаях:
- встроенные функции:
type(len)даёт<class 'builtin_function_or_method'>, они написаны на C; - метод через экземпляр:
type(obj.method)даёт<class 'method'>, это связанный метод с атрибутами__self__и__func__; - метод через класс:
MyClass.methodв Python 3 это обычнаяfunction, несвязанных методов больше нет; async defи генераторы: сама функция тожеfunction, а вызов вернётcoroutineилиgenerator;functools.partial: объект классаfunctools.partial, хотя вызывается как функция;- класс:
type(MyClass)это<class 'type'>.
Как у объекта, у функции есть атрибуты: __name__, __qualname__, __defaults__, __code__, __closure__, __doc__. Отсюда первоклассность: функцию можно передать аргументом, вернуть, положить в словарь, обернуть декоратором.
Где спотыкаются
Путают type(f) и type(f()). Второе вернёт тип результата вызова, например NoneType для функции без return.
Проверяют «функция ли это» через type(x) == types.FunctionType. Встроенные функции, методы и partial такую проверку не пройдут. Если важно, можно ли объект вызвать, пишут callable(x), а для точного вида используют модуль inspect.
Отвечают одним словом «function» без формы вывода. Вопрос именно про print, и правильный ответ это строка <class 'function'>.