Подтвердить что ты не робот

Получить следы предупреждений

В numpy мы можем сделать np.seterr(invalid='raise'), чтобы получить трассировку для предупреждений, в которых возникает ошибка (см. этот пост).

  • Есть ли общий способ отслеживания предупреждений?
  • Могу ли я заставить python давать трассировку, когда возникает предупреждение?
4b9b3361

Ответ 1

Вы можете получить то, что хотите, назначив warnings.showwarning. документация по модулям предупреждений сама рекомендует, чтобы вы это делали, так что это не значит, что вас соблазняет темная сторона источника.:)

Вы можете заменить эту функцию альтернативной реализацией, назначив warnings.showwarning.

Вы можете определить новую функцию, которая выполняет то, что делает warning.showwarning normaly, и дополнительно печатает стек. Затем вы помещаете его вместо оригинала:

import traceback
import warnings
import sys

def warn_with_traceback(message, category, filename, lineno, file=None, line=None):

    log = file if hasattr(file,'write') else sys.stderr
    traceback.print_stack(file=log)
    log.write(warnings.formatwarning(message, category, filename, lineno, line))

warnings.showwarning = warn_with_traceback

После этого каждое предупреждение будет печатать трассировку стека, а также предупреждающее сообщение. Однако учтите, что если предупреждение игнорируется, потому что оно не является первым, ничего не произойдет, поэтому вам все равно нужно выполнить:

warnings.simplefilter("always")

Вы можете получить аналогичный элемент управления, который один numpy.seterr передает с помощью фильтров модуля warning

Если вы хотите, чтобы python сообщал каждое предупреждение каждый раз, когда он запускается, и не только в первый раз, вы можете включить что-то вроде:

import warnings
warnings.simplefilter("always")

Вы можете получить другое поведение, передав разные строки в качестве аргументов. Используя ту же функцию, вы также можете указать разные типы поведения для предупреждений в зависимости от модуля, который их поднял, сообщения, которое они предоставляют, класса предупреждения, строки кода, вызывающей его и т.д....

Вы можете проверить список в документации

В качестве примера вы можете установить все предупреждения для создания исключений, кроме DeprecationWarnings, которые следует полностью игнорировать:

import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)

Таким образом вы получите полную трассировку для каждого предупреждения, поднятого как ошибка (только первая, так как выполнение остановится... но вы можете обращаться к ним один за другим и создавать фильтр, чтобы игнорировать те, которые вы не используете хочу снова услышать...

Ответ 2

Запустите свою программу, например

python -W error myprogram.py

Это делает все предупреждения фатальными, см. здесь для получения дополнительной информации