Por que o Python 3 permite "00" como literal para 0, mas não permite "01" como literal para 1? Existe uma boa razão? Essa inconsistência me deixa perplexo. (E estamos falando sobre Python 3, que quebrou a compatibilidade com versões anteriores de propósito para atingir objetivos como consistência.)
Por exemplo:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
Respostas:
Por https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Conforme observado aqui, zeros à esquerda em um número decimal diferente de zero não são permitidos.
"0"+
é legal como um caso muito especial, que não estava presente no Python 2 :O commit do SVN r55866 implementou o PEP 3127 no tokenizer, o que proíbe os
0<octal>
números antigos . No entanto, curiosamente, também adiciona esta nota:com um
nonzero
sinalizador especial que só lança umSyntaxError
se a seguinte sequência de dígitos contiver um dígito diferente de zero.Isso é estranho porque o PEP 3127 não permite este caso:
(ênfase minha)
Portanto, o fato de que vários zeros são permitidos está tecnicamente violando o PEP e foi basicamente implementado como um caso especial por Georg Brandl. Ele fez a alteração da documentação correspondente para observar que
"0"+
era um caso válidodecimalinteger
(anteriormente coberto poroctinteger
).Provavelmente nunca saberemos exatamente por que Georg escolheu tornar
"0"+
válido - pode permanecer para sempre um caso estranho em Python.ATUALIZAÇÃO [28 de julho de 2015]: Esta questão levou a um animado tópico de discussão sobre ideias de python em que Georg concordou :
Mais tarde, o tópico gerou este relatório de bug com o objetivo de se livrar deste caso especial. Aqui, Georg diz :
e assim o temos: a razão precisa por trás dessa inconsistência se perdeu no tempo.
Finalmente, observe que o relatório de bug foi rejeitado: zeros à esquerda continuarão a ser aceitos apenas em inteiros zero para o resto do Python 3.x.
fonte
octinteger
caso do Python 2"0" octdigit*
.0
é um literal octal em C / C ++.001
é ilegal, enquanto sua interpretação tornaria isso legal (já que o significado de "imediatamente" deve ser bastante inequívoco).É um caso especial (
"0"+
)2.4.4. Literais inteiros
Se você olhar para a gramática, é fácil perceber que
0
precisa de um caso especial. Não tenho certeza porque o '+
' é considerado necessário lá. É hora de vasculhar a lista de discussão dev ...É interessante notar que no Python2, mais de um
0
foi analisado como umoctinteger
(o resultado final ainda é0
)fonte
"0"+
e não existe"0"
?Python2 usava o zero à esquerda para especificar os números octais:
Para evitar esse comportamento (? Enganosa), Python3 requer prefixos explícitas
0b
,0o
,0x
:fonte
00
permitido? (E000
,0000
etc.)01
também é1
independente da base.can't be ambiguous
não é um argumento, pois01
também não pode ser ambíguo. IMO, o00
caso é apenas um caso especial porque é o0
que não deveria ser.