Warum erlaubt Python 3 "00" als Literal für 0, aber nicht "01" als Literal für 1? Gibt es einen guten Grund? Diese Inkonsistenz verblüfft mich. (Und wir sprechen von Python 3, das absichtlich die Abwärtskompatibilität gebrochen hat, um Ziele wie Konsistenz zu erreichen.)
Beispielsweise:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
python
python-3.x
integer
literals
leading-zero
Walross
quelle
quelle
Antworten:
Per https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Wie hier erwähnt, sind führende Nullen in einer Nicht-Null- Dezimalzahl nicht zulässig.
"0"+
ist als ganz besonderer Fall legal, der in Python 2 nicht vorhanden war :SVN Commit r55866 hat PEP 3127 im Tokenizer implementiert, wodurch die alten
0<octal>
Nummern verboten werden. Seltsamerweise fügt es jedoch auch diesen Hinweis hinzu:mit einem speziellen
nonzero
Flag, das nur dann ein a auslöst,SyntaxError
wenn die folgende Ziffernfolge eine Ziffer ungleich Null enthält.Dies ist seltsam, da PEP 3127 diesen Fall nicht zulässt:
(Hervorhebung von mir)
Die Tatsache, dass mehrere Nullen zulässig sind, verstößt technisch gegen das PEP und wurde von Georg Brandl grundsätzlich als Sonderfall implementiert. Er nahm die entsprechende Dokumentationsänderung vor, um festzustellen, dass dies
"0"+
ein gültiger Fall wardecimalinteger
(zuvor unteroctinteger
).Wir werden wahrscheinlich nie genau wissen , warum Georg sich für die
"0"+
Gültigkeit entschieden hat - es kann für immer ein seltsamer Eckfall in Python bleiben.UPDATE [28. Juli 2015]: Diese Frage führte zu einem lebhaften Diskussionsthread über Python-Ideen, in dem Georg sich einmischte :
Später brachte der Thread diesen Fehlerbericht hervor , um diesen Sonderfall loszuwerden. Hier sagt Georg :
und so haben wir es: Der genaue Grund für diese Inkonsistenz geht mit der Zeit verloren.
Beachten Sie schließlich, dass der Fehlerbericht abgelehnt wurde: Führende Nullen werden für den Rest von Python 3.x weiterhin nur mit Ganzzahlen von Null akzeptiert.
quelle
octinteger
Fall gemacht haben"0" octdigit*
.0
ist ein oktales Literal in C / C ++.001
illegal ist, während Ihre Interpretation dies legal machen würde (da die Bedeutung von "sofort" ziemlich eindeutig sein sollte).Es ist ein Sonderfall (
"0"+
)2.4.4. Ganzzahlige Literale
Wenn Sie sich die Grammatik ansehen, ist es leicht zu erkennen,
0
dass ein Sonderfall erforderlich ist. Ich bin mir nicht sicher, warum das '+
' dort als notwendig erachtet wird. Zeit, die Entwickler-Mailingliste zu durchsuchen ...Interessant zu bemerken, dass in Python2 mehr als eine
0
als analysiert wurdeoctinteger
(das Endergebnis ist jedoch immer noch0
)quelle
"0"+
und nicht"0"
?Python2 verwendete die führende Null, um Oktalzahlen anzugeben:
Um dies zu vermeiden (? Irreführend) Verhalten erfordert Python3 explizite Präfixe
0b
,0o
,0x
:quelle
00
erlaubt? (Und000
,0000
etc.)01
ist das auch1
unabhängig von der Basis.can't be ambiguous
kein Argument ist, da es01
auch nicht mehrdeutig sein kann. IMO, der00
Fall ist nur ein Sonderfall, weil er0
nicht sein sollte.