Реализованы ли Python ПКП, как предложено / исправлено, или есть место для маневра? - PullRequest
0 голосов
/ 20 февраля 2020

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

1 Ответ

1 голос
/ 20 февраля 2020

Это может быть разница 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. Если это правильно, это можно легко покрыть дополнительным ПКП. Это предложение только на первом этапе превращает '0123' в недопустимое восьмеричное число по причинам, указанным в обосновании.

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

...