Я не могу понять, как функции возвращают функции.
Как уже объяснено LTheriault, в python все является объектом. Не только это, но и все происходит во время выполнения - оператор def
является исполняемым оператором, который создает объект function
из кода в блоке def
и связывает этот объект с именем функции в текущем пространстве имен - IOW - это, в основном, syntacti c sugar для некоторых операций, которые вы можете кодировать вручную (хотя очень приветствуется syntacti c sugar - создание функционального объекта "вручную" - довольно большая работа).
Обратите внимание, что наличие функций «первоклассных граждан» - это не Python специфика c - это основа функционального программирования .
Я имею в виду, в каком порядке интерпретатор интерпретирует эту функцию:
def decorator(another_func):
def wrapper():
print('before actual function')
return another_func()
print('pos')
return wrapper
Предполагается, что функция decorator
объявлена на верхнем уровне модуля: сначала выполняется среда выполнения берет блок кода, следующий за оператором def
, компилирует его в объект code
, создает объект function
(экземпляр типа 'function') из этого объекта code
и пару других вещей (список аргументов) et c) и, наконец, привязывает этот объект функции к объявленному имени (nb: 'binds' => "assignments").
Внутренний оператор def
фактически выполняется только тогда, когда внешняя функция вызывается и выполняется заново каждый раз, когда вызывается внешняя функция - IOW, каждый вызов decorator
возвращает новый экземпляр функции.
Приведенное выше объяснение, конечно, довольно упрощено (следовательно, частично неточно), но достаточно понять принцип базового c.