Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中捕获特定类别的警告?_Python_Python 3.x - Fatal编程技术网

在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