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?

0 ответов

Другие вопросы по тегам