¿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
nonzero
bandera especial que solo arroja unSyntaxError
si 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
octinteger
caso de Python 2"0" octdigit*
.0
es un literal octal en C / C ++.001
es 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
Si observa la gramática, es fácil ver que
0
necesita 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
0
fue analizado como unoctinteger
(0
aunque el resultado final sigue siendo )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
00
permitido? (Y000
,0000
etc.)01
también lo es1
independientemente de la base.can't be ambiguous
no es un argumento ya01
que tampoco puede ser ambiguo. En mi opinión, el00
caso es solo un caso especial porque es0
lo que no debería ser.