Я пропускаю что-то здесь? Почему не был должен код при работе раздела "Broken"? Я использую Python 2.6.
#!/usr/bin/env python
def func(a,b,c):
print a,b,c
#Working: Example #1:
p={'c':3}
func(1,
b=2,
c=3,
)
#Working: Example #2:
func(1,
b=2,
**p)
#Broken: Example #3:
func(1,
b=2,
**p,
)
Python обычно позволяет использовать дополнительные запятые в конце списков запятых (в списках аргументов и контейнерных литералах). Основная цель для этого - немного упростить генерацию кода (вам не нужно задавать особый регистр для последнего элемента или двойного особого случая для одноэлементного кортежа).
В определении грамматики ** kwargs
извлекается отдельно и без дополнительной необязательной запятой. Насколько я могу себе представить, это никогда не поможет ни с чем практичным, например с генерацией кода (** kwargs всегда будет последним, поэтому вам не нужно ничего делать в особом случае), поэтому я не знаю, почему Python поддерживает Это.
Это соответствующий бит из грамматики :
arglist: (argument ',')* (argument [',']
|'*' test (',' argument)* [',' '**' test]
|'**' test)
Первая строка здесь позволяет ставить запятую после последнего параметра, если это не так. используя varargs / kwargs (вот почему ваш первый пример работает). Однако нельзя ставить запятую после параметра kwargs, если он указан, как показано во второй и третьей строках.
Кстати, вот интересная вещь, показанная грамматикой:
Они оба допустимы:
f(a=1, b=2, c=3,)
f(*v, a=1, b=2, c=3)
но это не так:
f(*v, a=1, b=2, c=3,)
Имеет смысл не ставить запятую после ** kwargs
, поскольку он всегда должен быть последним параметром. Я не знаю, почему разработчики языка решили не разрешить мой последний пример - может быть, из-за недосмотра?