¿Por qué es “1.real” un error de syntax pero “1 .real” válido en Python?

Así que vi estas dos preguntas en twitter . ¿Cómo es 1.real un error de syntax pero 1 .real no lo es?

 >>> 1.real File "", line 1 1.real ^ SyntaxError: invalid syntax >>> 1 .real 1 >>> 1. real File "", line 1 1. real ^ SyntaxError: invalid syntax >>> 1 . real 1 >>> 1..real 1.0 >>> 1 ..real File "", line 1 1 ..real ^ SyntaxError: invalid syntax >>> 1.. real 1.0 >>> 1 .. real File "", line 1 1 .. real ^ SyntaxError: invalid syntax 

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 de . en una llamada de método. Si al número le sigue un espacio, el análisis del número se termina, por lo que es inequívoco.

Echemos un vistazo a 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 

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á realizando la búsqueda del atributo en eso.

Es importante tener en cuenta que el control de errores de syntax de punto flotante ocurre antes de . búsqueda de atributos.

1 .real funciona porque es el atributo .real llamado en el entero 1.

1.real no funciona, porque se necesita imperativamente un espacio al final de un flotador. De lo contrario es un error de syntax.