Форум сайта python.su
Всем привет. Вроде все было понятно по декораторам, пока не нашел на одном из ресурсов способ передачи параметров в декоратор. Способ заключается во вложении декоратора в другой. С одноуровневым декоратором все было понятно, запускается декоратор, возвращающий функцию-обертку, которая вызывает нужную функцию тогда, когда я ее запускаю в коде. А в этом примере вставил разделитель 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)
Офлайн
1) decorator_maker_with_arguments принимает аргументы “Леонард”, “Шелдон” и возвращает функцию my_decorator
2) my_decorator принимает аргументом декорируемую функцию decorated_function_with_arguments и заменяет её на функцию wrapped
3) Происходит вызов функции wrapped с аргументами “Раджеш”, “Говард”. Она печатает текст про обёртку, а затем вызывает переданную ей функцию decorated_function_with_arguments с аргументами “Раджеш”, “Говард”.
Вот собственно и всё. Если это не понятно, то можешь пока не вникать.
Офлайн