为什么在编写装饰器时不调用函数而不返回它?

时间:2019-06-17 07:56:47

标签: python python-3.x decorator python-decorators

我正在用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是一个适当的装饰器。我只是想使用装饰器和函数都可以接受参数的复杂情况。

1 个答案:

答案 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