Я прочитал над этим большим постом: How to make a chain of function decorators?Python - как мне создать новую украшенную функцию, которая принимает аргументы?
я решил возиться с ним, и я беру этот блок от него:
# It’s not black magic, you just have to let the wrapper
# pass the argument:
def a_decorator_passing_arguments(function_to_decorate):
def a_wrapper_accepting_arguments(arg1, arg2):
print "I got args! Look:", arg1, arg2
function_to_decorate(arg1, arg2)
return a_wrapper_accepting_arguments
# Since when you are calling the function returned by the decorator, you are
# calling the wrapper, passing arguments to the wrapper will let it pass them to
# the decorated function
@a_decorator_passing_arguments
def print_full_name(first_name, last_name):
print "My name is", first_name, last_name
print_full_name("Peter", "Venkman")
# outputs:
#I got args! Look: Peter Venkman
#My name is Peter Venkman
Что делать, если, вместо того, чтобы просто переименовать декорированные print_full_name(first_name, last_name)
как и я, я хотел сохранить украшенную версию как другое имя функции, например decorated_print_full_name(first_name, last_name)
? В принципе, мне более любопытно, как я меняю код, поэтому я НЕ ДЕЛАЮТ использовать ярлык @a_decorator_passing_arguments
.
я переписал выше (для Python 3):
def a_decorator_passing_arguments(function_to_decorate):
def a_wrapper_accepting_arguments(arg1, arg2):
print("I got args! Look:", arg1, arg2)
function_to_decorate(arg1, arg2)
return a_wrapper_accepting_arguments
#@a_decorator_passing_arguments
def print_full_name(first_name, last_name):
print("My name is", first_name, last_name)
decorated_print_full_name = a_decorator_passing_arguments(print_full_name(first_name, last_name))
decorated_print_full_name("Peter", "Venkman")
но Python жалуется, что first_name
не определен в строке 11. Я еще новичок в Python так что простите меня, если я пропустил что-то очень очевидное здесь ,
не проходят 'first_name' и' last_name' на линии 11 –