我正在用Python学习装饰器,遇到了一个问题。我不太明白为什么不在装饰器中提供参数并返回带有参数的函数(如@notaProperDecorator
),而只是返回(@aProperDecorator
)内部的函数对象。
def aProperDecorator(arg):
print(arg)
def outer(func):
print("in outer")
def inner(*args,**kwargs):
print("in inner")
return func(*args,**kwargs)
return inner
return outer
def functionToDecorate(*args,**kwargs):
print("function")
def notaProperDecorator(arg):
print(arg)
def outer(func):
print("in outer")
def inner(*args,**kwargs):
print("in inner")
return func(*args,**kwargs)
return inner(*args,**kwargs) #here
return outer(func) #and here also
在这种情况下,我认为会发生类似于Java的事情。也就是说,如果函数返回函数,则应直接调用它(例如return function("test")
)
编辑:如下所述,在我的情况下,函数external是一个适当的装饰器。我只是想使用装饰器和函数都可以接受参数的复杂情况。
答案 0 :(得分:1)
当您编写这样的内容时:
@decorator(arg)
def defined_function():
do_something()
Python首先调用decorator(arg)
。函数decorator
应该返回另一个函数(在您的情况下为outer
)。 (请注意,函数和类是Python中的对象,因此可以从函数中返回它们。还要注意,decorator
不是修饰符,实际的修饰符是outer
。)Python调用返回的修饰符以defined_function
作为参数。然后,装饰器应使用defined_function
做一些事情,并返回一个新函数-或@MadPhysicist所说的其他事情(在您的情况下为inner
)。然后,Python将用新函数替换defined_function
。