2010-04-25 23 views
7

¿Me falta algo aquí? ¿Por qué no debería funcionar el código en la sección "Roto"? Estoy usando Python 2.6.Error de análisis de sintaxis extraño en Python?

#!/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

Cuando pruebo este código en Python 2.6, obtengo un error de sintaxis en la línea 19 (el segundo trabajo). –

+0

Gracias, error tipográfico corregido en el ejemplo n. ° 2. – user213060

+1

Y (no sin importancia): ¿por qué querrías esta coma extravagante (a excepción de investigar este comportamiento)? – ChristopheD

Respuesta

9

Esta es la parte relevante de la grammar:

arglist: (argument ',')* (argument [','] 
         |'*' test (',' argument)* [',' '**' test] 
         |'**' test) 

La primera línea aquí permite poner una coma después del último parámetro cuando no se utiliza varargs/kwargs (esta es la razón por su primer ejemplo funciona) . Sin embargo, no está permitido colocar una coma después del parámetro kwargs si está especificado, como se muestra en la segunda y tercera líneas.

Por cierto, aquí es una cosa interesante se muestra por la gramática:

Estos son legales:

f(a=1, b=2, c=3,) 
f(*v, a=1, b=2, c=3) 

pero esto no es:

f(*v, a=1, b=2, c=3,) 

tiene sentido no para permitir una coma después de **kwargs, ya que siempre debe ser el último parámetro. No sé por qué los diseñadores de idiomas decidieron no permitir mi último ejemplo, tal vez un descuido.

5

Python generalmente permite comas adicionales al final de las listas de coma (en listas de argumentos y literales de contenedor). El objetivo principal de esto es hacer que la generación de código sea un poco más fácil (no es necesario que el caso especial sea el último elemento o el caso especial doble una tupla de singleton).

En la definición de la gramática, **kwargs se saca por separado y sin una coma adicional opcional. No ayudaría con nada práctico como la generación de código (** kwargs siempre será lo último, así que no tienes que hacer ningún caso especial) por lo que puedo imaginar, así que no sé por qué Python sería compatible. eso.