Исходя из 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?!