Сообщить об ошибке.

Улучшения сообщений об ошибках в Python 3.12

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