2012-02-07 11 views

Respuesta

18

Este es un efecto de la tokenizer: 1.__add__(1) se divide en las fichas "1.", "__add__", "(", "1" y ")", ya que el tokenizer siempre trata de construir el token más larga posible. El primer token es un número de punto flotante, seguido directamente por un identificador, que no tiene sentido para el analizador, por lo que arroja un SyntaxError.

simplemente añadiendo un espacio antes del punto hará que este trabajo:

>>> 1 .__add__(1) 
2 
2

, el analizador espera de encontrar un flotador, pero _ no es un dígito válido. Los parens le dicen al analizador que deje de analizar después del 1.

+3

'1 ..__ add __ (1)' también funcionará. –

+6

No, '1 ..__ add __ (1)' devuelve un flotante, mientras que '(1) .__ add __ (1)' devuelve un int. – phihag

+1

Quiero decir que no es un error de sintaxis, pero sí. –

8

Debido 1. es un flotador válida literal, y el analizador léxico seguir la regla de "máxima Munch" - se utiliza el partido más largo. Después de que 1. se consumió como literal flotante, el identificador __add__ y parens siguen. Todo lo que el analizador ve es <float> <indentifier> que no es válido (compare 1.0 __add__(), lo que da como resultado los mismos tokens y espero que vea cómo es un error de sintaxis) y sin sentido. En el segundo ejemplo, hay una expresión 1 envuelta en parens, y luego un punto (un solo token, recogido por el analizador como operador de acceso de atributo) etc. que obviamente es válido.

Cuestiones relacionadas