python - solucion - syntaxerror invalid syntax que significa
¿Por qué no es esto un error de sintaxis en Python? (3)
Espacios en blanco entre tokens
Excepto al comienzo de una línea lógica o en literales de cadena, el espacio de caracteres en blanco, la pestaña y el avance de forma se pueden usar indistintamente para separar tokens. El espacio en blanco se necesita entre dos tokens solo si su concatenación podría interpretarse como un token diferente (por ejemplo, ab es un token, pero ab es dos tokens).
Entonces, en este caso, 1if
no es un token válido, por lo que el espacio en blanco es opcional. El 1
se interpreta como un literal entero del cual el if
no es una parte. Entonces, if
se interpreta por separado y se reconoce como una palabra clave.
Sin embargo, en xif
, se reconoce un identificador, por lo que Python no puede ver que usted quería hacer x if
existe.
Notamos una línea en nuestra base de código hoy que pensé que seguramente habría fallado la construcción con error de sintaxis, pero las pruebas estaban pasando, así que aparentemente era una python válida (tanto en 2.x como en 3).
El espacio en blanco a veces no se requiere en la expresión condicional:
>>> 1if True else 0
1
No funciona si el LHS es una variable:
>>> x = 1
>>> xif True else 0
File "<stdin>", line 1
xif True else 0
^
SyntaxError: invalid syntax
Pero parece que todavía funciona con otros tipos de literales:
>>> {''hello''}if False else ''potato''
''potato''
¿Qué está pasando aquí, es intencionalmente parte de la gramática por alguna razón? ¿Es esta extraña peculiaridad un comportamiento conocido / documentado?
Con mi conocimiento limitado de procesamiento léxico y tokenización, diría que lo que está viendo es que cualquier pieza que pueda ser léxica analizada como "diferente" (es decir, números / diccionarios, etc.) desde el if
se está haciendo así. La mayoría de los lenguajes ignoran los espacios e imagino que Python hace lo mismo (excluyendo, por supuesto, los niveles de sangría). Una vez generados los tokens, a la gramática en sí no le importa, lo más probable es que busque una agrupación [EXPRESSION] [IF] [EXPRESSION] [ELSE] [EXPRESSION]
, que, de nuevo con sus ejemplos, funcionaría bien.
El lexer de Python genera dos tokens para la entrada 1if
: el entero 1
y la palabra clave if
, ya que ningún token que comience con un dígito puede contener la cadena if
. xif
, por otro lado, se reconoce como un identificador válido; no hay ninguna razón para creer que se trata de un identificador seguido de una palabra clave, por lo que se pasa al analizador como un único token.