2016-10-06 4 views
0

Так что я пытался использовать * args и ** kwargs в Python. Но я получаю сообщение об ошибке, что я не могу понять причину.** kwargs in Python

def new(a,b,c): 
    print a,b,c 

a={'a': 7, 'b': 8, 'c': 9} 
b={'1':7, '2':8, '3':9} 

new(**a) 
new(**b) 

Новый (** a) печатает результаты, как ожидалось, то есть ключи, 7,8,9. Но, новый (** б) дает ошибку:

new(**b) 
TypeError: new() got an unexpected keyword argument '1' 

Может кто-нибудь объяснить это? Я передаю строку как аргумент в обоих случаях, но «a» работает, а «1» - нет.

+0

Переменные не могут быть номера, что означает, что ваши словарные ключи не должны начинаться с одного. – Nicarus

+2

Если вы думаете о том, что 'new (** a)' по существу является новым (a = 7, b = 8, c = 9) ', вы, вероятно, можете выяснить, почему он не работает. – SethMMorton

+0

@Nicarus Здесь есть две проблемы. Это определенно одно, но это не то, что Python хочет поднять как ошибку. – SethMMorton

ответ

1

Причина проста. Когда вы передаете словарь в функцию python как kwargs, он распаковывает его и использует ключи в словаре в качестве имен переменных, и вы можете использовать только имена параметров, указанные в списке параметров функций.

+1

Я хотел бы пояснить, что это не только то, что OP использовал числа. Это все равно не удастся, если они попытаются использовать ключи «d», «e» и «f». – SethMMorton

+0

См. Мой ответ - вы * можете * иметь числовые 'kwargs' –

+0

Фактически @LegoStormtroopr, я ссылаюсь на ** клавиши **, а не на ** значения **. и пользователь на самом деле не отправил число ** ключей **, а укусы чисел. – RFVenter

0

для словаря data={"key1":val1, "key2":val2, ..., "keyn":valn} когда вы словарь распаковки в вызове функции, fun(**data), эквивалентно делать fun(key1=val1, key2=val2,..., keyn=valn), и это будет успеха до тех пор, как ваша функция имела аргументы key1, ..., Кейн и/или принимать аргументы ключевых слов.

Таким образом, проблема с new(**b) является то, что пытается сделать new(1=7,2=8,3=9), который является нонсенс, как функции только что аргументы по имени a, b и c, поэтому погрешность.

Для вашего, ваш второй пример попробовать со списком вместо

b=[7,8,9] 
new(*b) 

Кроме того, вы можете играть с этой функцией

def test(*argv, **kwarg): 
    print "positional arguments", argv 
    print "key word arguments", kwarg 

, как, например,

test(1,23,42) 
test(w=3,r="buu") 
test(1,2,3,q=23,ans=42) 
a=[143,56,76] 
b={'a': 7, 'b': 8, 'c': 9} 
test(*a,**b) 
0

This is related to a similar question , но коротким прохождением **kwargs методу является способ пройти в ряде случаев k ey w ord arg uments в качестве словаря.

Причина ваша попытка терпит неудачу в том, что ваш метод новые определяет 3 именованные аргументы - a,b,c, так что если вы передаете в kwargs словаре это необходимо иметь эти значения в качестве ключей.

важно отметить, что вы можете также пойматьkwargs в методе, так что вы можете вызвать метод с числовыми аргументами, например, так:

def foo(**kwargs): 
    print kwargs 

a={'a': 7, 'b': 8, 'c': 9} 
b={'1':7, '2':8, '3':9} 

foo(**a) 
foo(**b) 

Дает:

{'a': 7, 'c': 9, 'b': 8} 
{'1': 7, '3': 9, '2': 8} 
Смежные вопросы