Странная ошибка анализа синтаксиса в Python?

Я пропускаю что-то здесь? Почему не был должен код при работе раздела "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,
     )
7
задан user213060 25 April 2010 в 15:05
поделиться

2 ответа

Python обычно позволяет использовать дополнительные запятые в конце списков запятых (в списках аргументов и контейнерных литералах). Основная цель для этого - немного упростить генерацию кода (вам не нужно задавать особый регистр для последнего элемента или двойного особого случая для одноэлементного кортежа).

В определении грамматики ** kwargs извлекается отдельно и без дополнительной необязательной запятой. Насколько я могу себе представить, это никогда не поможет ни с чем практичным, например с генерацией кода (** kwargs всегда будет последним, поэтому вам не нужно ничего делать в особом случае), поэтому я не знаю, почему Python поддерживает Это.

5
ответ дан 6 December 2019 в 15:19
поделиться

Это соответствующий бит из грамматики :

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 , поскольку он всегда должен быть последним параметром. Я не знаю, почему разработчики языка решили не разрешить мой последний пример - может быть, из-за недосмотра?

9
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: