Что бы произошло, если бы вы вызвали этот декоратор для функции?
@decorator
def foo(): pass
Этот код немедленно вызвал бы foo, чего мы не хотим.Вызываются декораторы, и их возвращаемое значение заменяет функцию.Это то же самое, что сказать
def foo(): pass
foo = decorator(foo)
Так что, если у нас есть декоратор, который вызывает foo, мы, вероятно, хотим иметь функцию, которая возвращает функцию, которая вызывает foo - эта функция, которую она возвращает, заменит foo.
def decorator(f):
def g(*args, **kwargs):
return f(*args, **kwargs)
return g
Теперь, если мы хотим передать параметры декоратору, мы не можем точно передать их вместе с функцией, как в вашем примере.Там нет синтаксиса для этого.Итак, мы определяем функцию, которая возвращает параметризованный декоратор.Декоратор, который он возвращает, будет закрытием.
def argument_decorator(will_I_call_f):
def decorator(f):
def g(*args, **kwargs):
if will_I_call_f: return f(*args, **kwargs)
return g
return decorator
, поэтому мы можем сделать
decorator = argument_decorator(True)
@decorator
def foo(): pass
И Python предлагает удобный синтаксис, когда вы встраиваете вызов функции:
@argument_decorator(True)
def foo(): pass
И все это - синтаксический сахар для синтаксиса без декоратора
def foo(): pass
foo = argument_decorator(True)(foo)