Dlaczego Python 3 dopuszcza „00” jako literał dla 0, ale nie dopuszcza „01” jako dosłownego dla 1? Czy jest dobry powód? Ta niekonsekwencja wprawia mnie w zakłopotanie. (I mówimy o Pythonie 3, który celowo złamał kompatybilność wsteczną, aby osiągnąć cele takie jak spójność).
Na przykład:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
Odpowiedzi:
Na https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Jak zauważono tutaj, zera wiodące w niezerowej liczbie dziesiętnej są niedozwolone.
"0"+
jest legalny jako bardzo szczególny przypadek, którego nie było w Pythonie 2 :Zatwierdzenie SVN r55866 zaimplementowało PEP 3127 w tokenizerze, który zabrania starych
0<octal>
numerów. Jednak, co ciekawe, dodaje również tę notatkę:ze specjalną
nonzero
flagą, która rzuca a tylkoSyntaxError
wtedy, gdy następująca sekwencja cyfr zawiera cyfrę niezerową.To dziwne, ponieważ PEP 3127 nie zezwala na ten przypadek:
(podkreślenie moje)
Tak więc fakt, że dozwolone jest wielokrotne zerowanie, technicznie narusza PEP i został w zasadzie zaimplementowany jako przypadek specjalny przez Georga Brandla. Dokonał odpowiedniej zmiany w dokumentacji, aby zauważyć, że
"0"+
jest to uzasadnionedecimalinteger
(poprzednio był objęty zakresemoctinteger
).Prawdopodobnie nigdy nie dowiemy się dokładnie, dlaczego Georg zdecydował się zrobić
"0"+
poprawnym - może to na zawsze pozostać dziwnym przypadkiem narożnym w Pythonie.AKTUALIZACJA [28 lipca 2015 r.]: To pytanie doprowadziło do ożywionej dyskusji na temat pomysłów na Pythona, do której dołączył Georg :
Później w wątku pojawił się ten raport o błędzie, mający na celu pozbycie się tego specjalnego przypadku. Tutaj, mówi Georg :
i tak to mamy: dokładna przyczyna tej niespójności jest zagubiona w czasie.
Na koniec zwróć uwagę, że raport o błędzie został odrzucony: wiodące zera będą nadal akceptowane tylko w przypadku zerowych liczb całkowitych w pozostałej części Pythona 3.x.
źródło
octinteger
przypadku Pythona 2"0" octdigit*
.0
jest literałem ósemkowym w C / C ++.001
jest to nielegalne, podczas gdy Twoja interpretacja uczyniłaby to legalnym (ponieważ znaczenie „natychmiast” powinno być dość jednoznaczne).To jest szczególny przypadek (
"0"+
)2.4.4. Literały całkowite
Jeśli spojrzysz na gramatykę, łatwo zauważysz, że
0
wymaga specjalnego przypadku. Nie wiem jednak, dlaczego „+
” jest tam uważane za konieczne. Czas przejrzeć listę mailingową deweloperów ...Warto zauważyć, że w Pythonie2 więcej niż jeden
0
został przeanalizowany jako anoctinteger
(wynik końcowy jest0
jednak nadal )źródło
"0"+
i nie ma"0"
?Python2 użył wiodącego zera do określenia liczb ósemkowych:
Aby uniknąć tego (? Mylące) zachowanie, Python3 wymaga wyraźnej prefiksy
0b
,0o
,0x
:źródło
00
dozwolone? (I000
,0000
itp.)01
to też1
niezależnie od bazy.can't be ambiguous
nie jest argumentem, ponieważ też01
nie może być niejednoznaczny. IMO,00
sprawa to tylko szczególny przypadek, ponieważ tak0
nie powinno być.