Почему Python 3 допускает «00» в качестве литерала для 0, но не допускает «01» в качестве литерала для 1? Есть ли веская причина? Это противоречие меня сбивает с толку. (И мы говорим о Python 3, который намеренно нарушил обратную совместимость для достижения таких целей, как согласованность.)
Например:
>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
File "<stdin>", line 1
time(16, 01)
^
SyntaxError: invalid token
>>>
Ответы:
Согласно https://docs.python.org/3/reference/lexical_analysis.html#integer-literals :
Как отмечено здесь, ведущие нули в ненулевом десятичном числе не допускаются.
"0"+
является законным как особый случай, которого не было в Python 2 :SVN commit r55866 реализовал PEP 3127 в токенизаторе, который запрещает старые
0<octal>
номера. Однако, что любопытно, он также добавляет это примечание:со специальным
nonzero
флагом, который выдает a, толькоSyntaxError
если следующая последовательность цифр содержит ненулевую цифру.Это странно, потому что PEP 3127 не допускает этого случая:
(курсив мой)
Таким образом, допускаются несколько нулей. технически нарушает PEP и был в основном реализован Георгом Брандлом как особый случай. Он внес соответствующие изменения в документацию, чтобы отметить, что
"0"+
это действительный случайdecimalinteger
(ранее это было описано в разделеoctinteger
).Мы, вероятно, никогда не узнаем точно, почему Георг решил сделать
"0"+
действительным - это может навсегда остаться странным случаем в Python.ОБНОВЛЕНИЕ [28 июля 2015 г.]: этот вопрос привел к оживленной дискуссии по идеям Python, в которую вмешался Георг :
Позже поток породил этот отчет об ошибке с целью избавиться от этого особого случая. Здесь Георг говорит :
и, таким образом, мы имеем: точная причина этого несоответствия потеряна со временем.
Наконец, обратите внимание, что отчет об ошибке был отклонен: ведущие нули по-прежнему будут приниматься только для нулевых целых чисел для остальной части Python 3.x.
источник
octinteger
корпус Python 2"0" octdigit*
.0
является восьмеричным литералом в C / C ++.001
это незаконно, тогда как ваша интерпретация сделает это законным (поскольку значение слова «немедленно» должно быть совершенно однозначным).Это особый случай (
"0"+
)2.4.4. Целочисленные литералы
Если посмотреть на грамматику, легко увидеть, что
0
нужен особый случай. Я не уверен, почему "+
" считается там необходимым. Пора покопаться в списке рассылки разработчиков ...Интересно отметить, что в Python2 более одного
0
анализировалось какoctinteger
(0
хотя конечный результат все еще остается )источник
"0"+
а почему нет"0"
?Python2 использовал начальный ноль для указания восьмеричных чисел:
Чтобы избежать этого (? Вводящие в заблуждение) поведение, Python3 требует явных префиксов
0b
,0o
,0x
:источник
00
разрешено? (И000
,0000
и т.д.)01
тоже1
независимо от базы.can't be ambiguous
это не аргумент, поскольку01
тоже не может быть двусмысленным. ИМО,00
случай - это просто особый случай, потому0
что так быть не должно.