那么,如果您在函数上调用该装饰器会发生什么?
@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)