你可以通过分配来得到你想要的warnings.showwarning
. The 警告模块文档 https://docs.python.org/3/library/warnings.html#warnings.showwarning它本身建议你这样做,所以这并不是说你受到了诱惑源头的阴暗面. :)
您可以通过分配给替代实现来替换此函数warnings.showwarning
.
您可以定义一个新函数来执行以下操作warning.showwarning
通常情况下,它还会打印堆栈。然后你将它代替原来的:
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")
您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以指定不同的警告行为,具体取决于引发警告的模块、它们提供的消息、警告类、导致警告的代码行等等...
您可以在列表中查看模块文档 http://docs.python.org/3/library/warnings.html#the-warnings-filter
例如,您可以设置所有警告以引发异常,除了DeprecationWarnings
应该完全忽略:
import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)
通过这种方式,您可以获得作为错误引发的每个警告的完整回溯(只有第一个警告,因为执行将停止......但您可以逐个解决它们,并创建一个过滤器来忽略您不想听到的警告又关于...