在 numpy 中,我们可以执行np.seterr(invalid='raise')
以获取引发错误的警告的回溯(请参阅this post)。
是否有跟踪警告的一般方法?
我可以让 python 给一个回溯,当一个警告提出?
你可以通过分配给warnings.showwarning
来得到你想要的。warnings module documentation本身建议你这样做,所以这并不是说你受到了源黑暗面的。:)
您可以通过分配给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")
您可以通过warning
模块的过滤器获得一个类似的控制numpy.seterr
如果你想要的是 python 每次触发时报告每个警告,而不仅仅是第一次,你可以包括:
import warnings
warnings.simplefilter("always")
您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以为警告指定不同的行为,具体取决于引发它们的模块,它们提供的消息,警告类,导致它的代码行等等...
您可以在module documentation中检查列表
例如,您可以设置所有警告以引发异常,但应完全忽略的DeprecationWarnings
除外:
import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)
这样,您可以获得每个警告的完整回溯,因为错误(只有第一个,因为执行将停止...但是您可以一个接一个地解决它们,并创建一个过滤器以忽略您不想听到的那些再次...
您可以使用warnings.filterwarnings()
将选定的警告转换为异常并获取回溯,如下所示:
import warnings
warnings.filterwarnings(
'error', 'DateTimeField .* received a datetime',
RuntimeWarning, 'django.db.models.fields'
)
对于 Python3,请参阅warnings模块文档中的stacklevel
参数。当第三方警告隐藏在调用堆栈中时,这可能特别有用:将 warnings.warn 调用参数设置为stacklevel=2
,请参阅回溯,在必要时进行更改,将堆栈级别恢复 / 删除为原始状态。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(44条)