Странный синтаксический синтаксический анализ ошибки в Python? - PullRequest
7 голосов
/ 25 апреля 2010

Я что-то здесь упускаю? Почему не должен работать код в разделе «Сломанный»? Я использую 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,
     )

Ответы [ 2 ]

9 голосов
/ 25 апреля 2010

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

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

5 голосов
/ 25 апреля 2010

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

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

...