2016-02-02 4 views
0

Используя модуль декоратора от Michele Simionato, я получаю странное поведение по отношению к kwargs. Вот пример, используя простой пример, который in the documentation:Модуль декоратора Python - kwargs

def _trace(f, *args, **kw): 
    kwstr = ', '.join('%r: %r' % (k, kw[k]) for k in sorted(kw)) 
    print("calling %s with args %s, {%s}" % (f.__name__, args, kwstr)) 
    return f(*args, **kw) 

def trace(f): 
    return decorate(f, _trace) 

@trace 
def f(a, b, c=1, d=1): 
    return a + b + c + d 

f(1,2,c=2,d=2) 

печатает calling f with args (1, 2, 3, 4), {}

вместо calling f with args (1, 2), {'c': 2, 'd': 2}

ли хотел поведение? Почему так?

Или у меня что-то не так?

+0

Обернутая функция отлично работает в любом случае, поэтому это не имеет значения. – kindall

ответ

1

Это, кажется, ожидаемое поведение. Из page you linked:

>>> @trace 
... def f(x, y=1, z=2, *args, **kw): 
...  pass 

>>> f(0, 3) 
calling f with args (0, 3, 2), {} 

>>> print(getargspec(f)) 
ArgSpec(args=['x', 'y', 'z'], varargs='args', varkw='kw', defaults=(1, 2)) 

Обратите внимание, как именованные аргументы в y и z обнаружиться как обычные аргументах, а не ключевое слово арг.

+0

Значения 'y = 1' и' z = 2' - это только значения аргументов по умолчанию, но не аргументы ключевых слов. Является ли аргумент значением по умолчанию полностью независимым от того, передано ли оно по положению или по ключевому слову. – user2357112

0

Ожидание неверно с прототипом f (a, b, c = 1, d = 1). Это просто тип аргумента по умолчанию. Изменить f, чтобы принять keyargs-

@trace 
def f(a, b, **kargs): 
    return a + b + kargs['c'] + kargs['d'] 
f(1,2,c=2,d=2) 
calling f with args (1, 2), {'c': 2, 'd': 2} 
Смежные вопросы