Как работает функция внутри функции?
Всем добрый день. Возник вопрос по поводу декораторов в Python. Можете пожалуйста сказать что делает каждая строка в следующем коде:
def logged(hello):
def new_hello(username):
print('Arguments:', username)
result = hello(username)
print('Result:', result)
return result
return new_hello
def hello(username):
return f"Привет, {username}"
hello = logged(hello)
hello('Вася')
Вывод:
Arguments: Вася
Result: Привет, Вася
Каким образом в logged передав Вася, получился Привет Вася? Заранее спасибо
Ответы (1 шт):
logged всего лишь возвращает ссылку на функцию new_hello, вы эту ссылку присваиваете переменной hello и когда вы потом пишете hello('Вася') вы таким образом вызываете new_hello('Вася'), вроде тут всё просто.
В Python в переменные можно записывать ссылки на абсолютно любые объекты, включая функции, что в данном случае и происходит.
До строки hello = logged(hello) переменная hello глобальной области видимости указывала на функцию hello, а после этой строки она стала указывать на функцию new_hello. При этом в самой функции new_hello осталась ссылка на старую функцию hello на момент когда отработал def.