Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2018 21:06:07

clipper1995
Зарегистрирован: 2018-03-19
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по вложенному декоратору функци

Всем привет. Вроде все было понятно по декораторам, пока не нашел на одном из ресурсов способ передачи параметров в декоратор. Способ заключается во вложении декоратора в другой. С одноуровневым декоратором все было понятно, запускается декоратор, возвращающий функцию-обертку, которая вызывает нужную функцию тогда, когда я ее запускаю в коде. А в этом примере вставил разделитель print(“*”*30) и возник вопрос - почему после вставки строки разделителя я вижу до разделителя в выводе результат работы не только функции первого уровня, но еще и функции второго уровня? Если при объявлении @decorator_maker_with_arguments запуск идет дальше decorator_maker_with_arguments, и запускается my_decorator, то почему тогда и дальше не запускается print из функции wrapped? По какому критерию останавливается вызов вложенных функций?

 def decorator_maker_with_arguments(decorator_arg1, decorator_arg2):
    print("Я создаю декораторы! И я получил следующие аргументы:", decorator_arg1, decorator_arg2)
    def my_decorator(func):
        print("Я - декоратор. И ты всё же смог передать мне эти аргументы:", decorator_arg1, decorator_arg2)
        # Не перепутайте аргументы декораторов с аргументами функций!
        def wrapped(function_arg1, function_arg2):
            print("Я - обёртка вокруг декорируемой функции.\n"
                  "И я имею доступ ко всем аргументам: \n"
                  "\t- и декоратора: {0} {1}\n"
                  "\t- и функции: {2} {3}\n"
                  "Теперь я могу передать нужные аргументы дальше"
                  .format(decorator_arg1, decorator_arg2,
                          function_arg1, function_arg2))
            return func(function_arg1, function_arg2)
        return wrapped
    return my_decorator
@decorator_maker_with_arguments("Леонард", "Шелдон")
def decorated_function_with_arguments(function_arg1, function_arg2):
    print("Я - декорируемая функция и я знаю только о своих аргументах: {0} {1}".format(function_arg1, function_arg2))
print("*"*30)
decorated_function_with_arguments("Раджеш", "Говард")

# выведет:
Я создаю декораторы! И я получил следующие аргументы: Леонард Шелдон
Я - декоратор. И ты всё же смог передать мне эти аргументы: Леонард Шелдон
****************************************************************
Я - обёртка вокруг декорируемой функции.
И я имею доступ ко всем аргументам:
- и декоратора: Леонард Шелдон
- и функции: Раджеш Говард
Теперь я могу передать нужные аргументы дальше
Я - декорируемая функция и я знаю только о своих аргументах: Раджеш Говард

Отредактировано clipper1995 (Апрель 7, 2018 21:06:47)

Офлайн

#2 Апрель 7, 2018 22:11:48

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по вложенному декоратору функци

1) decorator_maker_with_arguments принимает аргументы “Леонард”, “Шелдон” и возвращает функцию my_decorator
2) my_decorator принимает аргументом декорируемую функцию decorated_function_with_arguments и заменяет её на функцию wrapped
3) Происходит вызов функции wrapped с аргументами “Раджеш”, “Говард”. Она печатает текст про обёртку, а затем вызывает переданную ей функцию decorated_function_with_arguments с аргументами “Раджеш”, “Говард”.

Вот собственно и всё. Если это не понятно, то можешь пока не вникать.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version