2015-06-17 2 views
0

Я пытаюсь обернуть голову вокруг декораторов. Поэтому я попытался передать аргументы декоратору и обработать их внутри функции декоратора. Я просто передаю список декоратору и хочу, чтобы мой список обрабатывался внутри функции декоратора после вызова оригинальной функции. Вот мой кодДекораторы Python. Ошибка при передаче аргументов

def decorator_function(original_function): 
    def new_function(*args, **kwargs): 
     print("Your list shall be processed now.") 
     print args 
     #Do something with the passed list here.Say, call a function Process(list,string) 
     original_function(*args, **kwargs) 
    return new_function 



@decorator_function([1,2,3]) 
def hello(name = None): 
    if name == None: 
     print "You are nameless?" 
    else: 
     print "hello there,",name 

hello("Mellow") 

Я получаю эту ошибку

Your list shall be processed now. 
(<function hello at 0x7f9164655758>,) 
Traceback (most recent call last): 
    File "anno_game.py", line 14, in <module> 
    def hello(name = None): 
    File "anno_game.py", line 8, in new_function 
    original_function(*args, **kwargs) 
TypeError: 'list' object is not callable 

Может кто-нибудь пожалуйста, скажите мне, что я перепутались здесь и мне точку в правильном направлении?

+2

Я также настоятельно рекомендую взглянуть на е-Сатис ответ на http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python, который имеет одно из лучших, наиболее понятных объяснений декораторов, которые я прочитал на сегодняшний день, включая декораторов, которые принимают аргументы. – lemonhead

ответ

1
def decorator_function(original_function): 
    def new_function(*args, **kwargs): 
     print("Your list shall be processed now.") 
     print args 
     #Do something with the passed list here.Say, call a function Process(list,string) 
     original_function(*args, **kwargs) 
    return new_function 

@decorator_function([1,2,3]) 
def hello(name = None): 
    if name == None: 
     print "You are nameless?" 
    else: 
     print "hello there,",name 

hello("Mellow") 

Когда вы @decorator_function([1,2,3])decorator_function вызывается с [1,2,3] ей передается в качестве аргумента original_function, который вы пытаетесь вызвать original_function(*args, **kwargs).

Чтобы иметь декоратора, чтобы получить список, вам нужно сделать еще одну обертку:

def decorator_function(a_list): 

     print("Your list shall be processed now.", a_list) 
     #Do something with the passed list here.Say, call a function Process(a_list) 

    def wrapper(original_function): 

     def new_function(*args, **kwargs): 

      print("Your list with function args shall be processed now.", a_list, args) 
      #Do something with the passed list here. Say, call a function Process(a_list, args) 

      original_function(*args, **kwargs) 

     return new_function 

    return wrapper 
+0

Да, это обертывание. Немного привыкает ... – nneonneo

+0

Но когда я пробовал этот код, инструкция печати обертки не печатается. 'print (« Теперь ваш список с функциями args будет обработан. », a_list, args) # Что-то в этом списке. Скажем, вызовите функцию Process (a_list, args) original_function (* args, ** kwargs) ' – Tania

+0

О, моя ошибка. Я забыл вызвать оригинальную функцию, Извините. Спасибо за ответ :) Работает как шарм – Tania

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