Почему мы не вызываем функцию вместо ее возврата при написании декоратора? - PullRequest
0 голосов
/ 17 июня 2019

Я изучаю декораторы на 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 Ответ

1 голос
/ 17 июня 2019

Когда вы пишете что-то вроде этого:

@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 новой функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...