html tool

2019年5月13日星期一

pytest-warnigs模块


概述: waring.warn -默认使用, err,filter定义,fromat定义


https://www.quxihuan.com/python-module-warnings
https://pymotw.com/2/warnings/

- 定义:

模块 warnings 在程序运行中,向用户报告非严重错误,它是由 Python 3.0 版本引入的。使用的情况包括向库调用者警告一些函数将来可能废弃,或者提示一些错误的配置信息,不支持的特性等等。[popexizhi: 2.7的doc中就有此方法,这里引入版本3.0的说法是不对的 , https://docs.python.org/2/library/warnings.html#available-functions]

-- 目的:

因为报告的不是严重的错误,一个程序可能会遇到多个重复的问题。warnings 可以抑制重复的错误信息,使你不用多次看到他们。方法是可以通过命令行传递参数或者调用 warnings 内的函数。

- 使用:

1) 生成 warnings,依然执行,默认的方式:

最简单的生成 warning 是调用 warn() 函数,传递的参数为消息内容。
# warnings-gen.py
import warnings

print('warnings generate')
warnings.warn('warning message')
print('warnings end')
执行:
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 warnings-gen.py 
warnings generate
warnings-gen.py:5: UserWarning: warning message
  warnings.warn('warning message')
warnings end
可以看到,虽然 warning 调用了,但是程序还是继续往下运行,默认的行为会继续运行下去。

2) 将warnings 的执行转变为异常 : warnings.simplefilter('error', UserWarning)


可以调用函数 simplefilter() 改变这种行为。
# warnings-filter.py
import warnings

warnings.simplefilter('error', UserWarning)

print('warnings generate')
warnings.warn('warning message')
print('warnings end')
执行:
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 warnings-filter.py 
warnings generate
Traceback (most recent call last):
  File "warnings-filter.py", line 7, in <module>
    warnings.warn('warning message')
UserWarning: warning message
在这个例子中,使用 simplefilter() 函数告诉 warnings 模块内部当发生警告 UserWarning时,触发异常。查看输出,最后打印数据的语句没有执行,程序中途停止运行了。

3)warnings.warn的stacklevel的作用:

参见:https://pymotw.com/2/warnings/
You’ll notice that by default the warning message includes the source line that generated it, when available. It’s not all that useful to see the line of code with the actual warning message, though. Instead, you can tell warn() how far up the stack it has to go to find the line the called the function containing the warning. That way users of a deprecated function see where the function is called, instead of the implementation of the function
import warnings

def old_function():
    warnings.warn(
        'old_function() is deprecated, use new_function() instead', 
        stacklevel=2)

def caller_of_old_function():
    old_function()
    
caller_of_old_function()
Notice that in this example warn() needs to go up the stack 2 levels, one for itself and one for old_function().
$ python warnings_warn_stacklevel.py

warnings_warn_stacklevel.py:18: UserWarning: old_function() is deprecated, use new_function() instead
  old_function()

4) 模式过滤

filterwarnings() 过滤更复杂的匹配
还可以通过函数 filterwarnings() 过滤更复杂的匹配,例如设定一个正则表达式过滤消息内容。
# warnings-re.py
import warnings

warnings.filterwarnings('ignore', '.*hello.*')

warnings.warn('hello python')
warnings.warn('hi python')
执行:
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 warnings-re.py 
warnings-re.py:7: UserWarning: hi python
  warnings.warn('hi python')
本例忽略包含 hello 消息的警告,还可以通过命令行修改过滤行为,查看下面的例子。
# warnings-cmd.py
import warnings

warnings.warn('hello python')
warnings.warn('hi python')
执行:
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 -W "ignore:hello:UserWarning::0" warnings-cmd.py 
warnings-cmd.py:5: UserWarning: hi python
  warnings.warn('hi python')
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 -W "ignore:hi:UserWarning::0" warnings-cmd.py 
warnings-cmd.py:4: UserWarning: hello python
  warnings.warn('hello python')

5) 格式化消息

如果想自定义消息格式,可以修改模块函数 formatwarning() [popexizhi:这个对自定义的log类是不是会有帮助呢?!]
如果想自定义消息格式,可以修改模块函数 formatwarning()
# warnings-format.py
import warnings

def my_format(message, category, filename, lineno,
    file=None, line=None):
    return ': {}:{} {}:{}\n'.format(
        filename, lineno,
        category.__name__, message
        )

warnings.warn('a warning')
warnings.formatwarning = my_format
warnings.warn('a warning')
执行:
alexdeMacBook-Pro:quxihuan-python-code alex$ python3 warnings-format.py 
warnings-format.py:11: UserWarning: a warning
  warnings.warn('a warning')
: warnings-format.py:13 UserWarning:a warning

没有评论:

发表评论