lenguaje - ¿Por qué "1.real" es un error de sintaxis pero "1.real" válido en Python?
python wikipedia (3)
Entonces vi estas dos preguntas en Twitter . ¿Cómo es 1.real
un error de sintaxis pero 1 .real
no?
>>> 1.real
File "<stdin>", line 1
1.real
^
SyntaxError: invalid syntax
>>> 1 .real
1
>>> 1. real
File "<stdin>", line 1
1. real
^
SyntaxError: invalid syntax
>>> 1 . real
1
>>> 1..real
1.0
>>> 1 ..real
File "<stdin>", line 1
1 ..real
^
SyntaxError: invalid syntax
>>> 1.. real
1.0
>>> 1 .. real
File "<stdin>", line 1
1 .. real
^
SyntaxError: invalid syntax
1 .real funciona porque es el atributo .real llamado en el entero 1.
1.real no funciona, porque necesitas imperiosamente un espacio al final de un flotador. De lo contrario, es un error de sintaxis.
Con 1.real
Python está buscando un literal numérico de punto flotante como 1.0
y no puedes tener una r
en un flotador. Con 1 .real
Python ha tomado 1
como un entero y está haciendo la búsqueda de atributos en eso.
Es importante tener en cuenta que el manejo de errores de sintaxis de coma flotante ocurre antes que el .
búsqueda de atributos.
Supongo que el .
se analiza con avidez como parte de un número, si es posible, por lo que es el float
1.
, en lugar de ser parte de la llamada al método.
No se permiten espacios alrededor del punto decimal, pero puede tener espacios antes y después del .
en una llamada de método. Si el número es seguido por un espacio, el análisis del número se termina, por lo que no es ambiguo.
Veamos los diferentes casos y cómo se analizan:
>>> 1.real # parsed as (1.)real -> missing ''.''
>>> 1 .real # parsed as (1).real -> okay
>>> 1. real # parsed as (1.)real -> missing ''.''
>>> 1 . real # parsed as (1).real -> okay
>>> 1..real # parsed as (1.).real -> okay
>>> 1 ..real # parsed as (1)..real -> one ''.'' too much
>>> 1.. real # parsed as (1.).real -> okay
>>> 1 .. real # parsed as (1)..real -> one ''.'' too much