Python模块简介--warnings
Python 通过调⽤ warnings 模块中定义的 warn() 函数来发出警告。警告消息通常⽤于提⽰⽤户⼀些错误或者过时的⽤法,当这些情况发⽣时我们不希望抛出异常或者直接退出程序。警告消息通常写⼊ sys.stderr,对警告的处理⽅式可以灵活的更改,例如忽略或者转变为为异常。警告的处理可以根据警告类别,警告消息的⽂本和发出警告消息的源位置⽽变化。对相同源位置的特定警告的重复通常被抑制。
警告控制分为两个阶段:⾸先,警告被触发时,确定是否应该发出消息;接下来,如果要发出消息,则使⽤⽤户可设置的钩⼦来格式化和打印消息。
警告过滤器可以⽤来控制是否发出警告消息,警告过滤器是⼀些匹配规则和动作的序列。可以通过调⽤ filterwarnings() 将规则添加到过滤器,并通过调⽤ retwarnings() 将其重置为默认状态。
警告消息的输出是通过调⽤ showwarning() 函数来完成的,其可以被覆盖;该函数的默认实现通过调⽤ formatwarning() 格式化消息,这也可以由⾃定义实现使⽤。
警告类别
內建警告类型:
类描述
Warning所有警告类别类的基类,它是 Exception 的⼦类
UrWarning函数 warn() 的默认类别
DeprecationWarning⽤于已弃⽤功能的警告(默认被忽略)
SyntaxWarning⽤于可疑语法的警告
RuntimeWarning⽤于有关可疑运⾏时功能的警告
FutureWarning对于未来特性更改的警告
PendingDeprecationWarning对于未来会被弃⽤的功能的警告(默认将被忽略)
ImportWarning导⼊模块过程中触发的警告(默认被忽略)
UnicodeWarning与 Unicode 相关的警告
BytesWarning与 bytes 和 bytearray 相关的警告 (Python3)
ResourceWarning与资源使⽤相关的警告(Python3)
可以通过继承內建警告类型来实现⾃定义的警告类型,警告类型必须始终是 Warning 类的⼦类
警告过滤器
警告过滤器⽤于控制警告的⾏为,如忽略,显⽰或转换为错误(引发异常)。警告过滤器维护着⼀个有序的过滤规则列表,匹配规则⽤于确定如何处理警告,任何特定警告都将依次与列表中的每个过滤规则匹配,直到找到匹配为⽌。过滤规则类型为⼀个元组
aek(action,message,category,module,lineno),其中:
action 为以下值:
值处理⽅式
"error"将匹配警告转换为异常
"ignore"忽略匹配的警告(经常⽤)
freezing
"always"始终输出匹配的警告
"default"对于同样的警告只输出第⼀次出现的警告
"module"在⼀个模块中只输出第⼀次出现的警告
"once"输出第⼀次出现的警告,⽽不考虑它们的位置
值处理⽅式
message 是包含正则表达式的字符串,警告消息的开始必须匹配,不区分⼤⼩写
category 是⼀个警告类型(必须是 Warning 的⼦类)
module 是包含模块名称的正则表达式字符串,区分⼤⼩写options
lineno 是⼀个整数,警告发⽣的⾏号,为 0 则匹配所有⾏号
默认警告过滤器
默认情况下,Python 设置了⼏个警告过滤器,可以通过 -W 命令⾏选项和调⽤ filterwarnings() 函数来覆盖它们。
DeprecationWarning 和 PendingDeprecationWarning 和 ImportWarning 被默认忽略。
除⾮ -b 选项给出⼀次或两次,否则忽略 BytesWarning;在这种情况下,此警告或者被输出(-b)或者变成异常(-bb)。
除⾮ Python 是在调试模式下构建的,否则将忽略 ResourceWarning。
在 3.2 版中的调整: 除 PendingDeprecationWarning 之外,默认情况下将忽略DeprecationWarning
可⽤函数
warn
warnings.warn(message, category=None, stacklevel=1, source=None)
触发异常。category 参数默认为 UrWarning。message 参数为警告消息,可以是 Warning 实例,在这种情况下,将忽略 category 并使⽤ message.__class__,消息⽂本则为 str(message)。
这是 warn() 函数的低级接⼝,明确传递消息,类别,⽂件名和⾏号,以及可选的模块名称和注册表(应该是模块
的 __warningregistry__ 字典)
showwarning
warnings.showwarning(message, category, filename, lineno, file=None, line=None)
写⼊警告到⽂件。默认调⽤ formatwarning(message, category, filename, lineno, line) 并将结果字符串写⼊ file,默认为 sys.stderr。line 是包含在警告消息中的⼀⾏源代码;如果未提供则尝试读取由 filename 和 lineno 指定的⾏。
formatwarning
warnings.formatwarning(message, category, filename, lineno, line=None)
格式化警告,返回⼀个字符串。可能包含嵌⼊的换⾏符,并以换⾏符结束。 line 是包含在警告消息中的⼀⾏源代码;如果不提供则尝试读取由 filename 和 lineno 指定的⾏。
filterwarnings
warnings.filterwarnings(action, message='', category=Warning, module='', lineno=0, append=Fal)
过滤警告,在 警告过滤器规则 列表中插⼊⼀个条⽬。默认情况下,条⽬插⼊在前⾯;如果 append 为
真,则在末尾插⼊。它检查参数的类型,编译 message 和 module 的正则表达式,并将它们作为警告过滤器列表中的元组插⼊。如果多个地⽅都匹配特定的警告,那么更靠近列表前⾯的条⽬会覆盖列表中后⾯的条⽬,省略的参数默认为匹配⼀切的值。
simplefilter
warnings.simplefilter(action, category=Warning, lineno=0, append=Fal)
whitenoi简单易⽤的过滤器,类似 filterwarnings() 函数,但是不需要正则表达式。
retwarnings
重置警告过滤器。这会丢弃所有以前对 filterwarnings() 调⽤的影响,包括 -W 命令⾏选项和对 simplefilter() 的调⽤的影响。
可⽤的上下⽂管理器
class warnings.catch_warnings(*, record=Fal, module=None)
捕获警告,在退出上下⽂时恢复警告过滤器和 showwarning() 函数功能。如果 record 参数是 Fal (缺省值),则上下⽂管理器在⼊⼝处返回 None。如果 record 是 True,则返回⼀个列表,该列表元素为 showwarning() 函数所见的对象,列表中的每个元素都具有与showwarning() 的参数具有相同名称的属性。
服装剪裁
import warnings
hennywarnings.simplefilter("always")
google sky
def fxn():
鸡尾酒调酒配方warnings.warn("this is a warning", Warning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
fxn()
with warnings.catch_warnings(Warning):
warnings.warn("this is a warning2", Warning)
warnings.warn("this is a warning3", Warning)
def fxn2():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings(record=True) as w:
# Cau all warnings to always be triggered.
warnings.simplefilter("always")
# Trigger a warning.
fxn2()
# Verify some things
web开发培训
asrt len(w) == 1
asrt issubclass(w[-1].category, DeprecationWarning)
asrt "deprecated" in str(w[-1].message)
可以从命令⾏通过传递 -Wd 参数到解释器(即为 -W default 的速记)。这将为所有警告启⽤默认处理,包括默认情况下忽略的警告。要更改遇到的警告所采取的操作,只需更改传递给 -W 的参数即可,如 -W error。可以⽤ python --help 来查看 -W 参数的详细使⽤。
在代码中实现 -Wd 的功能为:
warnings.simplefilter('default')
publish这样的代码应该在程序开始被执⾏,否则有些警告可能仍然会被触发。