Pourquoi Python 3 autorise-t-il "00" comme littéral pour 0 mais pas "01" comme littéral pour 1? Y a-t-il une bonne raison? Cette incohérence me déroute. (Et nous parlons de Python 3, qui a délibérément brisé la compatibilité descendante afin d'atteindre des objectifs tels que la cohérence.)
Par exemple:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
Réponses:
Par https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Comme indiqué ici, les zéros non significatifs dans un nombre décimal différent de zéro ne sont pas autorisés.
"0"+
est légal en tant que cas très spécial, qui n'était pas présent dans Python 2 :SVN commit r55866 a implémenté PEP 3127 dans le tokenizer, qui interdit les anciens
0<octal>
numéros. Cependant, curieusement, il ajoute également cette note:avec un
nonzero
indicateur spécial qui ne lance un queSyntaxError
si la séquence de chiffres suivante contient un chiffre différent de zéro.C'est étrange car la PEP 3127 ne permet pas ce cas:
(c'est moi qui souligne)
Donc, le fait que plusieurs zéros soient autorisés viole techniquement le PEP, et a été fondamentalement implémenté comme un cas particulier par Georg Brandl. Il a fait le changement de documentation correspondant pour noter que
"0"+
c'était un cas valable pourdecimalinteger
(auparavant, cela était couvert paroctinteger
).Nous ne saurons probablement jamais exactement pourquoi Georg a choisi de rendre
"0"+
valide - cela peut rester à jamais un cas de coin étrange en Python.MISE À JOUR [28 juillet 2015]: Cette question a conduit à un fil de discussion animé sur les idées python dans lequel Georg est intervenu :
Plus tard, le fil a engendré ce rapport de bogue visant à se débarrasser de ce cas particulier. Ici, Georg dit :
et ainsi nous l'avons: la raison précise de cette incohérence est perdue dans le temps.
Enfin, notez que le rapport de bogue a été rejeté: les zéros non significatifs continueront à être acceptés uniquement sur les entiers zéro pour le reste de Python 3.x.
la source
octinteger
cas Python 2"0" octdigit*
.0
est un littéral octal en C / C ++.001
c'est illégal, alors que votre interprétation rendrait cela légal (puisque le sens de "immédiatement" devrait être assez clair).C'est un cas particulier (
"0"+
)2.4.4. Entiers littéraux
Si vous regardez la grammaire, il est facile de voir que cela
0
nécessite un cas particulier. Je ne sais pas pourquoi le «+
» est considéré comme nécessaire ici. Il est temps de parcourir la liste de diffusion des développeurs ...Il est intéressant de noter que dans Python2, plus d'un a
0
été analysé comme unoctinteger
(le résultat final est toujours0
cependant)la source
"0"+
et non"0"
?Python2 a utilisé le zéro non significatif pour spécifier les nombres octaux:
Pour éviter ce comportement (? Induire en erreur), python3 exige préfixes explicites
0b
,0o
,0x
:la source
00
autorisé? (Et000
,0000
etc.)01
c'est aussi1
indépendamment de la base.can't be ambiguous
n'est pas un argument car01
il ne peut pas non plus être ambigu. OMI, le00
cas n'est qu'un cas particulier car c'est0
ce qui ne devrait pas l'être.