首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让Python的`warnings.warn()‘更别提自己了

让Python的`warnings.warn()‘更别提自己了
EN

Stack Overflow用户
提问于 2014-10-17 18:02:27
回答 3查看 3.5K关注 0票数 16

我的最小例子是

代码语言:javascript
复制
#!/usr/bin/python3

import warnings

warnings.warn('Run Forest run!', stacklevel=2)
warnings.warn('Run Forest run!')

它将输出

代码语言:javascript
复制
sys:1: UserWarning: Run Forest run!
./file.py:6: UserWarning: Run Forest run!
  warnings.warn('Run Forest run!')

第一行给我提供了一些小信息。第二行很完美,给我源文件和行号.但我想去掉多余的第三行。这有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-17 21:50:08

事实证明,让warnings.warn()收集所有信息并对信息的打印方式进行定制是可能的:

代码语言:javascript
复制
#!/usr/bin/python3

import warnings

def warning_on_one_line(message, category, filename, lineno, file=None, line=None):
    return '%s:%s: %s: %s\n' % (filename, lineno, category.__name__, message)

warnings.formatwarning = warning_on_one_line

warnings.warn('Run Forest run!', stacklevel=2)
warnings.warn('Run Forest run!')

输出:

代码语言:javascript
复制
sys:1: UserWarning: Run Forest run!
./file.py:15: UserWarning: Run Forest run!

资料来源: 每周Python模块

票数 13
EN

Stack Overflow用户

发布于 2014-10-17 18:25:15

获得“冗余”行的原因是,如果不提供stacklevel参数,默认的stacklevel是1,这基本上是告诉用户发出警告的确切代码行,即您的警告函数调用warnings.warn('Run Forest Run!')

如果您对它的工作方式不满意,可以使用warnings.warn_explicit()函数来自定义它。

https://docs.python.org/3.1/library/warnings.html#available-functions

票数 5
EN

Stack Overflow用户

发布于 2016-01-19 20:49:06

如果您试图捕获异常/错误,并且希望同时看到您的自定义警告消息和跟踪,您可能更喜欢使用traceback.print_exc():

代码语言:javascript
复制
import traceback
import warnings

def _formatwarning(msg, *a):
   try:
       traceback.print_exc()
   except:
       pass
   return str(msg)

warnings.formatwarning = _formatwarning

这将使warn(“您的消息”)打印回溯,而没有提到对warn()本身的调用。

更新:Python3.6上的需要将函数签名更改为:

代码语言:javascript
复制
def _formatwarning(message, category, filename, lineno, line='')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26430861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档