В Python 3.12. были реализованы следующие улучшения сообщений об ошибках:
Когда исключение NameError
поднимается на верхний уровень, то модули из стандартной библиотеки теперь потенциально предлагаются как часть сообщений об ошибках, отображаемых интерпретатором (Предоставлено Пабло Галиндо).
>>> sys.version_info # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # NameError: name 'sys' is not defined. Did you forget to import 'sys'?
Улучшено сообщение об ошибке для исключений NameError
для экземпляров классов. Теперь, если в методе вызывается NameError
и экземпляр имеет атрибут, который в точности равен имени в исключении, то предложение будет включать self.<ИМЯ>
вместо ближайшего совпадения в области действия метода. (Автор: Пабло Галиндо)
class A: def __init__(self): self.blech = 1 def foo(self): somethin = blech >>> A().foo() # Traceback (most recent call last): # File "<stdin>", line 1 # somethin = blech # ^^^^^ # NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
Улучшено сообщение об ошибке SyntaxError
, когда пользователь вводит команду import x from y
вместо from y import x
. (Предоставлено Пабло Галиндо)
>>> import a.y.z from b.y.z # Traceback (most recent call last): # File "<stdin>", line 1 # import a.y.z from b.y.z # ^^^^^^^^^^^^^^^^^^^^^^^ # SyntaxError: Did you mean to use 'from ... import ...' instead?
Исключения ImportError
, возникающие из-за ошибочных имен модулей используемых в импорте, теперь включают предложения по значению имени на основе доступных имен в модуле. (Предоставлено Пабло Галиндо)
>>> from collections import chainmap # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
Анализатор теперь выдает SyntaxError
при анализе исходного кода, содержащего нулевые байты. (Предоставлено Пабло Галиндо.)
Пара символов обратной косой черты, которая не является допустимой escape-последовательностью, теперь генерирует SyntaxWarning
вместо DeprecationWarning
. Например, re.compile('\d+\.\d+')
теперь выдает SyntaxWarning
('\d'
- недопустимая escape-последовательность, используйте необработанные строки для регулярного выражения: re.compile(r'\d+\.\d+')
). В будущей версии Python вместо SyntaxWarning в конечном итоге будет выдаваться SyntaxError. (Предоставлено Виктором Стиннером.)
Восьмеричные escape-последовательности со значением больше 0o377
(например: '\477'
), устаревшие в Python 3.11, теперь выдают SyntaxWarning
вместо DeprecationWarning
. В будущей версии Python они в конечном итоге станут SyntaxError
. (Предоставлено Виктором Стиннером.)