2015-08-03 4 views
0

Код ниже, предполагает, чтобы войти имя функции, количество позиционных аргументов и именованных аргументыPython функции декоратор примера

def log(original_function): 
def new_function(*args, **kwargs): 
    with open("log.txt", "w") as logfile: 
     logfile.write("%s,%s,%s" % (log, len(args),len(kwargs.keys()))) 

    return original_function(*args, **kwargs) 

return new_function 


def my_function(message): 
    print(message) 

>>> my_function = log(my_function) 
>>> A = (2,3,4,5) 
>>> B = {'Anthony' : 6, 'James' : 7} 
>>> my_function(*A, **B) 

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

return original_function(*args, **kwargs) 
TypeError: my_function() got an unexpected keyword argument 'Anthony' 

Я прошел через на предыдущих страницах учебника, который я изучаю, и я следил за всем синтаксисом ... Кажется, я думаю.

+1

Ваш отступ неправильный. Дайте целой «новой_функции» еще одну вкладку в – Pynchia

+0

также «return new_function» следует отступом с еще одной вкладкой – Pynchia

+0

, а затем есть слишком много аргументов для 'my_function' ... – Pynchia

ответ

0

ОК, я отредактировал ваш код немного, чтобы исправить отступ проблемы Ation и число параметров, вы передаете my_function (6 вместо одного)

def log(original_function): 
    def new_function(*args, **kwargs): 
     with open("log.txt", "w") as logfile: 
      logfile.write("%s,%s,%s" % (log, len(args),len(kwargs))) 

     return original_function(*args, **kwargs) 

    return new_function 

def my_function(message): 
    print(message) 

my_function = log(my_function) 
#A = (2,3,4,5) 
#B = {'Anthony' : 6, 'James' : 7} 
#my_function(*A, **B) 
my_function("hello there") 

производит

hello there 

и

cat log.txt 

производит

<function log at 0x7faf64be85f0>,1,0 

Если вы были определить my_function в

def my_function(a, b, c, d, Anthony, James): 
    print(a, b, c, d, Anthony, James) 

затем

my_function = log(my_function) 
A = (2,3,4,5) 
B = {'Anthony' : 6, 'James' : 7} 
my_function(*A, **B) 

будет производить:

(2, 3, 4, 5, 6, 7) # in python 2.7; 2, 3, 4, 5, 6, 7 in python3 

Side Примечание: не вызывать переменные CamelCase, используйте нижний регистр вместо. Оставьте CamelCase для имен классов.

0

Вы даете в качестве параметра вашей функции my_function(message) следующее:

my_function(2, 3, 4, 5, Anthony=6, James=7) 

Ваш декоратор выглядит следующим образом

def decorator(func): 
    def wrapper(*args, **kwargs): 
     # Some code 
     return func(*args, **kwargs) 
    return wrapper 

И тогда вы украшаете вашу функцию:

new_func = decorator(my_function) 

Так new_func - обертка my_function , Но вы вызываете функцию:

A = (2, 3, 4, 5) 
B = {'Anthony' : 6, 'James' : 7} 
new_func(*A, **B) 

что эквивалентно

new_func(2, 3, 4, 5, Anthony=6, James=7) 

стек будет выглядеть следующим образом:

new_func(2, 3, 4, 5, Anthony=6, James=7) 
> wrapper(2, 3, 4, 5, Anthony=6, James=7) 
    > my_function(2, 3, 4, 5, Anthony=6, James=7) 

И my_function позволяют только один параметр: message

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