Python Декораторы: фон
Благодаря поиску я нашел много учебных пособий, которые объясняют, как это работает, но не объясняют, почему это работает таким образом. Теперь я знаю, как реализовать все 3 основных варианта использования:
- 1-й: без аргументов
- 2-й: у функции, которую я хочу украсить, есть аргументы
- 3-е: у самого декоратора есть аргументы
Я нахожу первый и второй варианты использования очень интуитивно понятными: Python видит декоратор и говорит: "Хорошо, декоратор, вот твоя функция - передает аргумент - теперь дай мне то, что я могу использовать вместо этого".
Первый вариант использования: "Вы дали мне функцию, которая не принимает аргументов? Работает, спасибо".
Второй вариант использования: "Вы дали мне функцию, которая просто принимает * args и ** kwargs? Работает, спасибо
Теперь третий вариант использования с примером кода:
def mydecorator(msg=""):
def wrapper2(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
print "You know nothing about Python"
print msg
return wrapper
return wrapper2
@mydecorator(msg="No, really, nothing.")
def printHello(name="Jon Snow"):
print "Hello " + name
Я не понимаю внутреннюю логику этого. В этом случае python не может сказать "Эй, декоратор, вот функция, дай мне что-то, что я могу использовать вместо этого". На этот раз python говорит: "Вот твой аргумент msg, теперь дай мне функцию, которую я могу использовать вместо функции, которую я тебе не сказал (потому что вместо этого я дал тебе msg)". Так как же теперь декоратор может получить / работать с func, если он получает msg вместо func?