Я только что заметил в PEP 3127 (тот, который рационализировал расчеты системы счисления для литералов и int()
аргументов, так что, например, 010
больше не является допустимым литералом и вместо этого должен быть 0o10
, если требуется восьмеричный), что одна конкретная часть PEP была не реализована.
Я имею в виду конкретно цитируемый ниже раздел:
Обработка исключений Tokenizer
Если недопустимый токен содержит начальный 0, сообщение об ошибке исключения должно быть более информативным, чем текущее сообщение SyntaxError: недопустимый токен. Следует объяснить, что десятичные числа могут не иметь начального нуля и что восьмеричные числа требуют o после начального нуля.
Однако, когда я пытаюсь использовать этот (теперь недействительный) формат, я все еще вижу старую (менее информативную) ошибку, как показано в следующей расшифровке:
MyPromptHere> python3
Python 3.6.8 (default, Oct 7 2019, 12:59:55)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 010
File "<stdin>", line 1
x = 010
^
SyntaxError: invalid token
>>> int('010', 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: '010'
>>> _
Теперь меня не особо заботит тот факт, что это странная ошибка, так как большую часть своего вознаграждения я зарабатываю на загадочных ошибках :-) Однако, насколько я понимаю, PEP проходят через процессы пересмотра даже < em>после того, как они были спонсированы, поэтому мне любопытно, почему:
- эта часть PEP не была реализована; или
- PEP не был пересмотрен, чтобы отразить реальность реализации.
Или это просто использование слова «должен» имеет меньшую силу, чем обычные стандарты, требующие таких терминов, как «должен» или «должен»? Я не уверен в этом, поскольку, согласно расшифровке выше, в разделе, посвященном int()
, должно соблюдаться:
int()
обработка исключений
ValueError
, возникающее при любом вызовеint()
со строкой, должно как минимум явно содержать основание в сообщении об ошибке, например:ValueError: invalid literal for base 8 int(): 09
.