Inteiros decimais (isto é, não prefixados) em Python parecem ter menos recursos do que inteiros prefixados.
Se eu fizer isso, 1.real
recebo um SyntaxError: invalid decimal literal
. No entanto, se o fizer 0x1.real
, não recebo nenhum erro e 1
é o resultado. (O mesmo para 0b1.real
and 0o1.real
, embora em Python2 01.real
forneça um erro de sintaxe como).
Isso ocorre porque a
1.
introdução está sendo tratada como um literal de ponto flutuante er
não é um dígito decimal válido.Literais hexadecimais, da forma que você mostra, são inteiros, portanto não são ambíguos ao serem tratados como um possível ponto flutuante (não há
0x1.1
).Se você usar
(1).real
para especificar que o literal é apenas ,1
funciona bem.A seguinte transcrição (anotada) pode ajudar:
Para completar, os tokens lexicais para numéricos (integral e flutuante) podem ser encontrados na documentação do Python :
Você pode ver aí que os carros alegóricos não permitem prefixos hexadecimais, e é por isso que podemos assumir com segurança que
.
in0x1.real
não faz parte do valor literal.Esse não é o caso
1.real
, ele assume que.
precede uma parte fracionária de um float.Um lexer inteligente poderia , é claro, detectar um dígito decimal inválido imediatamente após
.
e, portanto, assumir que é um método para chamar um número inteiro. Mas isso introduz complexidade e pode ter outros casos extremos problemáticos.