strings - python numbers




Por que o Python 3 permite “00” como um literal para 0, mas não permite “01” como um literal para 1? (2)

Por que o Python 3 permite "00" como um literal para 0, mas não permite "01" como um literal para 1? Existe um bom motivo? Essa inconsistência me deixa perplexa. (E estamos falando sobre o Python 3, que propositadamente quebrou a compatibilidade com versões anteriores 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
>>>

É um caso especial ( "0"+ )

https://docs.python.org/3/reference/lexical_analysis.html#integer-literals https://docs.python.org/3/reference/lexical_analysis.html#integer-literals

Integer literals are described by the following lexical definitions:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"+
nonzerodigit   ::=  "1"..."9"
digit          ::=  "0"..."9"
octinteger     ::=  "0" ("o" | "O") octdigit+
hexinteger     ::=  "0" ("x" | "X") hexdigit+
bininteger     ::=  "0" ("b" | "B") bindigit+
octdigit       ::=  "0"..."7"
hexdigit       ::=  digit | "a"..."f" | "A"..."F"
bindigit       ::=  "0" | "1"

Se você olhar a gramática, é fácil ver que 0 precisa de um caso especial. Não sei por que o ' + ' é considerado necessário. Hora de vasculhar a lista de discussão dev ...

Interessante notar que no Python2, mais de um 0 foi analisado como um octinteger (o resultado final ainda é 0 embora)

decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+

O Python2 usou o zero inicial para especificar números octais:

>>> 010
8

Para evitar esse comportamento (enganoso?), Python3 requer prefixos explícitos 0b , 0o , 0x :

>>> 0o10
8






leading-zero