Реализованы ли PEP Python в том виде, в каком они были предложены/исправлены, или есть место для маневра?

Я только что заметил в 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.


person paxdiablo    schedule 20.02.2020    source источник


Ответы (1)


Это может быть разница в версии Python для вас.

Python 3.8.1 (default, Jan 13 2020, 22:28:48) 
>>> 010
  File "<stdin>", line 1
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

Кроме того, в разделе «Открытые вопросы» PEP 3127 говорится

По-прежнему есть сильные мнения, что «0123» следует разрешить в качестве буквального десятичного числа в Python 3.0. Если это правильно, это можно легко охватить в дополнительном PEP. Это предложение делает только первый шаг к тому, чтобы сделать «0123» недопустимым восьмеричным числом по причинам, изложенным в обосновании.

Для меня это означает, что не было жесткого требования изменить сообщение об ошибке. Это было предложение быть более информативным, что в конечном итоге было реализовано (см. вывод 3.8.1 выше).

person schillingt    schedule 20.02.2020
comment
Хорошая находка. Похоже, это было реализовано как отдельное исправление ошибки (см., например, bugs.python.org/issue20608), поскольку в doco уже в версии 3.0 указано, что восьмеричные числа 0<digit>+ недействительны. Лучшие сообщения об ошибках появляются где-то после 3.6.8. В любом случае изменения PEP сделали его незаконным, независимо от мнения людей по этому поводу, поэтому я подумал, что все равно потребуется лучшее сообщение об ошибке. Я могу только предположить, что разработчик был пьян в то время :-) - person paxdiablo; 20.02.2020
comment
Шутки и сарказм никогда не уходят в текст. Вам следует избегать этого, когда вы жалуетесь на добровольные пожертвования. - person schillingt; 20.02.2020