Что на самом деле декоратор написан на Python? - PullRequest
0 голосов
/ 29 мая 2018

Я изо всех сил пытаюсь понять декоратор с Python.Мое понимание здесь ниже:

Сначала метод my_function_too(x,y) будет определен как func в my_decorator(func), а затем будут выведены методы function_that_runs_func(*args,**kwargs).

1.Что такое функция в @functools.wraps(func)?

2.Почему мы должны писать return function_that_runs_func и return my_decorator здесь?

Мои друзья объяснили, что метод function_that_runs_func() собирается заменить метод my_function_too().Но я не мог понять, что он говорит и почему.

3.Кто-нибудь, пожалуйста, скажите мне мягко, что он имеет в виду?

КОД:

def decorator_with_arguments(number):
   def my_decorator(func):
       @functools.wraps(func)
       def function_that_runs_func(*args,**kwargs):
           print("In the decorator")
           if number == 56:
               print("Not running the function")
               return None
           else:
               print("Running the 'real' func")
               return func(*args,**kwargs)
        return function_that_runs_func
     return my_decorator
@decorator_with_arguments(57)
def my_function_too(x,y)
    print(x+y)

my_function_too(57,67)

ВЫХОД:

В декораторе

124

1 Ответ

0 голосов
/ 29 мая 2018

Это может помочь думать о декораторе, который принимает аргументы как фабрику декораторов.Таким образом, decorator_with_arguments(57) возвращает my_decorator, что делает фактическое украшение.

То есть my_decorator получает исходную версию my_function_too в качестве аргумента и возвращает оформленную версию, привязывая ее к имени my_function_too, как если бы вы сделали

my_function_too = my_decorator(my_function_too)

В вашем коде func в @functools.wraps(func) - это функция, переданная в my_decorator, которая в данном случае является исходной версией my_function_too.functools.wraps - это версия для декоратора functools.update_wrapper.Вы можете прочитать о них обоих в связанных документах.Не беспокойтесь о них, они просто делают оформленную версию функции более похожей на оригинальную.

...