¿Por qué Python 3 permite "00" como literal para 0 pero no permite "01" como literal para 1? ¿Existe una buena razón? Esta inconsistencia me desconcierta. (Y estamos hablando de Python 3, que deliberadamente rompió la compatibilidad con versiones anteriores para lograr objetivos como la coherencia).
Por ejemplo:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>

Respuestas:
Según https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Como se indica aquí, no se permiten ceros a la izquierda en un número decimal distinto de cero .
"0"+es legal como un caso muy especial, que no estaba presente en Python 2 :SVN commit r55866 implementó PEP 3127 en el tokenizador, que prohíbe los
0<octal>números antiguos . Sin embargo, curiosamente, también agrega esta nota:con una
nonzerobandera especial que solo arroja unSyntaxErrorsi la siguiente secuencia de dígitos contiene un dígito distinto de cero.Esto es extraño porque PEP 3127 no permite este caso:
(énfasis mío)
Entonces, el hecho de que se permitan múltiples ceros está violando técnicamente el PEP, y fue básicamente implementado como un caso especial por Georg Brandl. Hizo el correspondiente cambio de documentación para señalar que
"0"+era un caso válido paradecimalinteger(anteriormente que se había cubierto enoctinteger).Probablemente nunca sabremos exactamente por qué Georg eligió hacer
"0"+válido: puede seguir siendo para siempre un caso extraño en Python.ACTUALIZACIÓN [28 de julio de 2015]: Esta pregunta dio lugar a un animado hilo de discusión sobre las ideas de Python en el que Georg intervino :
Más tarde, el hilo generó este informe de error con el objetivo de deshacerse de este caso especial. Aquí, Georg dice :
y así lo tenemos: la razón precisa detrás de esta inconsistencia se pierde en el tiempo.
Finalmente, tenga en cuenta que el informe de error fue rechazado: los ceros iniciales seguirán siendo aceptados solo en números enteros cero para el resto de Python 3.x.
fuente
octintegercaso de Python 2"0" octdigit*.0es un literal octal en C / C ++.001es ilegal, mientras que su interpretación lo haría legal (ya que el significado de "inmediatamente" debe ser bastante inequívoco).Es un caso especial (
"0"+)2.4.4. Literales enteros
Los literales enteros se describen mediante las siguientes definiciones léxicas: integer :: = decimalinteger | octinteger | hexinteger | bininteger decimalinteger :: = dígito que no es de cero dígitos * | "0" + nonzerodigit :: = "1" ... "9" dígito :: = "0" ... "9" octinteger :: = "0" ("o" | "O") octdigit + hexinteger :: = "0" ("x" | "X") hexdigit + bininteger :: = "0" ("b" | "B") bindigit + octdigit :: = "0" ... "7" hexdigit :: = dígito | "a" ... "f" | "A" ... "F" bindigit :: = "0" | "1"Si observa la gramática, es fácil ver que
0necesita un caso especial. Sin+embargo, no estoy seguro de por qué el " " se considera necesario allí. Es hora de buscar en la lista de correo de desarrolladores ...Es interesante notar que en Python2, más de uno
0fue analizado como unoctinteger(0aunque el resultado final sigue siendo )decimalinteger :: = dígito que no es de cero dígitos * | "0" octinteger :: = "0" ("o" | "O") octdigit + | "0" octdigit +fuente
"0"+y no"0"?Python2 usó el cero a la izquierda para especificar números octales:
Para evitar este comportamiento (? Engañosa), python3 requiere prefijos explícitas
0b,0o,0x:fuente
00permitido? (Y000,0000etc.)01también lo es1independientemente de la base.can't be ambiguousno es un argumento ya01que tampoco puede ser ambiguo. En mi opinión, el00caso es solo un caso especial porque es0lo que no debería ser.