2015-08-24 4 views
0

Я прочитал над этим большим постом: 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 так что простите меня, если я пропустил что-то очень очевидное здесь ,

+1

не проходят 'first_name' и' last_name' на линии 11 –

ответ

1

Он должен работать с:

decorated_print_full_name = a_decorator_passing_arguments(print_full_name) 
+0

Да, я идиот. Мне пришлось передать функцию как объект, а не как вызов. Спасибо! – jktstance

+0

Если бы это не сработало, последнее, когда обертка попытается вызвать 'None (arg1, arg2)'. –

Смежные вопросы