在Python中捕获特定类别的警告?
我尝试使用建议的方法捕获警告并以用户友好的方式记录它们:在Python中捕获特定类别的警告?,python,python-3.x,Python,Python 3.x,我尝试使用建议的方法捕获警告并以用户友好的方式记录它们: import logging import warnings with warnings.catch_warning(record=True) as wlist: warnings.simplefilter("always", UserWarning) # do something that may `warn` for w in wlist: logging.warning("<
import logging
import warnings
with warnings.catch_warning(record=True) as wlist:
warnings.simplefilter("always", UserWarning)
# do something that may `warn`
for w in wlist:
logging.warning("<some nice message> (%s)", w.message)
但现在所有其他警告都被完全压制了。是否有方法/技巧将捕获警告限制为仅特定类别的警告
更新:我找到了一些接近于好的解决方案但仍然不完美的方法:
import logging
import warnings
import sys
def func(val):
if val < 0.5:
warnings.warn("`val` smaller than 0.5")
return val - 0.5
def dep(s):
warnings.warn("deprecated", DeprecationWarning, stacklevel=2)
return s
def run():
vals = [0.1, 0.2, 1]
for i, val in enumerate(vals):
print("S"*64)
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always", UserWarning)
print(dep(func(val)))
print(dep(func(-val)))
for warning in w:
if issubclass(warning.category, UserWarning):
logging.warning("Caught %s on value at index %d: %s",
warning.category, i, warning.message)
else:
sys.stderr.write(
warnings.formatwarning(warning.message,
warning.category,
warning.filename,
warning.lineno,
line=warning.line)
)
print("E"*64)
print('\n\n')
if __name__ == "__main__":
logging.basicConfig(level=logging.WARNING)
run()
导入日志
进口警告
导入系统
def func(val):
如果val<0.5:
警告。警告(`val`小于0.5”)
返回值-0.5
def部门:
warning.warn(“已弃用”,弃用警告,堆栈级别=2)
返回s
def run():
VAL=[0.1,0.2,1]
对于i,枚举中的val(val):
打印(“S”*64)
带有警告。捕获警告(记录=True)为w:
warnings.simplefilter(“始终”,UserWarning)
打印(dep(func(val)))
打印(dep(func(-val)))
对于w中的警告:
如果issubclass(warning.category,UserWarning):
日志记录。警告(“在索引%d:%s处的值上捕获%s”,
warning.category,i,warning.message)
其他:
sys.stderr.write(
warning.formatwarning(warning.message,
警告。类别,
warning.filename,
warning.lineno,
行=警告。行)
)
打印(“E”*64)
打印('\n\n')
如果名称=“\uuuuu main\uuuuuuuu”:
logging.basicConfig(级别=logging.WARNING)
运行()
运行上述命令将产生以下输出:
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-0.4
-0.6
WARNING:root:Caught <class 'UserWarning'> on value at index 0: `val` smaller than 0.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 0: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-0.3
-0.7
WARNING:root:Caught <class 'UserWarning'> on value at index 1: `val` smaller than 0.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 1: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
0.5
-1.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 2: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
-0.4
-0.6
警告:root:捕捉到索引0处的值:`val`小于0.5
warncatch.py:34:不推荐使用警告:不推荐使用
打印(dep(func(val)))
警告:root:捕捉到索引0处的值:`val`小于0.5
warncatch.py:35:不推荐使用警告:不推荐使用
打印(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-0.3
-0.7
警告:root:捕捉到索引1的值:`val`小于0.5
warncatch.py:34:不推荐使用警告:不推荐使用
打印(dep(func(val)))
警告:root:捕捉到索引1的值:`val`小于0.5
warncatch.py:35:不推荐使用警告:不推荐使用
打印(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
0.5
-1.5
warncatch.py:34:不推荐使用警告:不推荐使用
打印(dep(func(val)))
警告:root:捕捉到索引2的值:`val`小于0.5
warncatch.py:35:不推荐使用警告:不推荐使用
打印(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
在for
循环的每次迭代中,我都会得到我想要的行为UserWarning
s将在记录器中转换为警告消息(logging.warn
),其他警告将按默认方式处理。(为了进行测试,我们可以在dep()
例程中将stacklevel=2
更改为stacklevel=1
),并查看在for循环的每次迭代中只发出一个DeprecationWarning
)
但是,仍然不正确的是,在for
循环的连续迭代中重复了两个弃用警告
s,而如果没有任何警告捕捉装置,代码只会报告两个弃用警告
s
如果您有任何想法和帮助来解决最后一个问题,我们将不胜感激:-)我想这可能会对您有所帮助@DeepBhatt谢谢,但我已经阅读了文档,还没有找到解决方案。(正如我在问题中所写,我的方法确实基于您提到的文档页面中提出的内容。)
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-0.4
-0.6
WARNING:root:Caught <class 'UserWarning'> on value at index 0: `val` smaller than 0.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 0: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-0.3
-0.7
WARNING:root:Caught <class 'UserWarning'> on value at index 1: `val` smaller than 0.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 1: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
0.5
-1.5
warncatch.py:34: DeprecationWarning: deprecated
print(dep(func(val)))
WARNING:root:Caught <class 'UserWarning'> on value at index 2: `val` smaller than 0.5
warncatch.py:35: DeprecationWarning: deprecated
print(dep(func(-val)))
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE