Как подавить печать исходного контекста по warnings.warn? - PullRequest
0 голосов
/ 09 апреля 2020

Если я помещаю следующий фрагмент в файл annoying.py:

import warnings
message = 'I know!  How about if we are just maximally annoying?!'
warnings.warn(message)

... и запускаю его в оболочке Unix, я получаю следующее:

% python annoying.py
annoying.py:3: UserWarning: I know!  How about if we are just maximally annoying?!
  warnings.warn(message)

(я получаю тот же вывод с Python 3.7.3 и 2.7.16.)

Я хочу, чтобы была напечатана только первая строка этого вывода.

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

Как я могу подавить вторую / беспорядочную линию?

1 Ответ

1 голос
/ 09 апреля 2020

Исходя из warnings.py исходного кода, кажется, что msg.line контролирует, нужно ли печатать эту дополнительную строку или нет. Обезьяна может исправить патч WarningMessage init так, чтобы self.line был "" вместо None, как показано ниже

import warnings

#modify the __init__ so that self.line = "" instead of None
def new_init(self, message, category, filename, lineno, file=None,
                 line=None, source=None):
        self.message = message
        self.category = category
        self.filename = filename
        self.lineno = lineno
        self.file = file
        self.line = ""
        self.source = source
        self._category_name = category.__name__ if category else None

warnings.WarningMessage.__init__ = new_init

message = 'I know!  How about if we are just maximally annoying?!'
warnings.warn(message)

Это приводит к:

annoying.py:19: UserWarning: I know!  How about if we are just maximally annoying?!

Другой Хакерский способ, возможно, сделать так, чтобы предупреждения стали ошибками, используя опцию -W:

% python -Werror::UserWarning annoying.py

, если у вас есть следующие annoying.py

import warnings
message = 'I know!  How about if we are just maximally annoying?!'
try:
    warnings.warn(message)
except Exception as error:
    print(error) 

приводит к

I know!  How about if we are just maximally annoying?!

Чтобы получить имя файла, номер белья, тип предупреждения и предупреждающее сообщение, мне пришлось сделать следующее

import warnings
import sys, os
message = 'I know!  How about if we are just maximally annoying?!'
try:
    warnings.warn(message)
except Exception as error:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print('{}:{}: {}: {}'.format(fname, exc_tb.tb_lineno,exc_type.__name__,exc_obj))

, в результате чего

annoying.py:5: UserWarning: I know!  How about if we are just maximally annoying?!
...