В 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. (Предоставлено Виктором Стиннером.)