Я только что заметил в PEP 3127 (тот, который рационализировал вычисления оснований для литералов и аргументов int()
, так что, например, 010
больше не является допустимым литералом и должен вместо этого быть 0o10
, если требуется восьмеричное) , что одна конкретная часть PEP не была реализована.
Я имею в виду конкретно приведенный ниже раздел:
Обработка исключений токенизатора
Если неверный токен содержит начальный «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 go через процессы пересмотра даже после были спонсированы, поэтому мне интересно, почему либо:
- эта часть PEP не была реализована; или
- PEP не был пересмотрен, чтобы отразить реальность реализации.
Или это просто использование слова «должен», имеющего меньшую силу, чем нормальные стандарты «требуемые» термины как "должен" или "должен"? Я не уверен в этом, поскольку, согласно приведенной выше расшифровке, «следует» следует соблюдать в разделе, касающемся int()
:
int()
исключение обработка
ValueError
, поднятая для любого вызова int()
со строкой, должна как минимум явно содержать основание в сообщении об ошибке, например: ValueError: invalid literal for base 8 int(): 09
.