一、简介
warnings 模块是 Python 标准库中的一个模块,用于处理警告信息。它提供了一种机制,可以让开发者在代码中发出警告,以提醒用户潜在的问题或不推荐的用法。使用
warnings 模块可以帮助开发者在代码中标记潜在的问题,并提供一些控制警告行为的选项。
二、方法
- warnings.warn(*args, **kwargs):用于发出警告。
- *args 的位置参数如下:
- message:作为第一个位置参数,可以是一个字符串,用于指定警告消息的内容。
- category:作为第二个位置参数(可选),用于指定警告的类别。如果未提供,默认为 Warning 类别。
- **kwargs的关键字参数如下:
- category:指定警告的类别。可以是一个警告类的实例,用于自定义警告类别。默认为 Warning。
- filename:指定发出警告的文件名。
- lineno:指定发出警告的行号。
- module:指定发出警告的模块名。
- source:指定发出警告的源代码。
import warnings
def divide(a, b):
if b == 0:
warnings.warn("Dividing by zero is not recommended.", category=RuntimeWarning)
return a / b
result = divide(10, 0)
print(result)
- warnings.warn_explicit(*args, **kwargs):函数用于显式地发出警告,提供了更详细的控制选项。
- *args 的位置参数如下:
- message:作为第一个位置参数,可以是一个字符串,用于指定警告消息的内容。
- category:作为第二个位置参数(可选),用于指定警告的类别。如果未提供,默认为 Warning 类别。
- **kwargs的关键字参数如下:
- category:指定警告的类别。可以是一个警告类的实例,用于自定义警告类别。默认为 Warning。
- filename:指定发出警告的文件名。
- lineno:指定发出警告的行号。
- module:指定发出警告的模块名。
- source:指定发出警告的源代码。
def divide(a, b):
if b == 0:
filename = "example.py" lineno = 10 category = UserWarning warnings.warn_explicit("Dividing by zero is not recommended.", category, filename, lineno)
return a / bresult = divide(10, 0)
print(result)
- warnings.filterwarnings(action, message=“”, category=Warning, module=“”, lineno=0, append):用于控制警告行为。
- action:字符串,表示要执行的操作。可以是以下值之一:
- ‘error’:将警告视为错误,抛出 Warnings 异常。
- ‘ignore’:忽略警告,不显示警告信息。
- ‘always’:始终显示警告信息。
- ‘default’:使用默认的警告显示方式,通常是显示一次。
- ‘module’:只显示来自指定模块的警告。
- ‘once’:只显示每个警告类型的第一次出现的警告。
- message:字符串,用于指定要匹配的警告消息。如果不指定,则匹配所有警告消息。
- category:警告类别。默认为 Warning 类。
- module:字符串,用于指定要匹配的模块名。如果不指定,则匹配所有模块。
- lineno:整数,用于指定要匹配的行号。如果不指定,则匹配所有行号。
import warnings
# 定义一个自定义的警告类
class CustomWarning(Warning):
pass
# 设置警告过滤器
warnings.filterwarnings('error', category=CustomWarning, module='my_module', lineno=10)
# 抛出一个警告
warnings.warn('This is a custom warning', category=CustomWarning, module='my_module', lineno=10)
- warnings.formatwarning(message, category, filename, lineno, line):用于自定义警告消息的格式。
- message:字符串,表示警告消息。
- category:警告类别。
- filename:字符串,表示发出警告的文件名。
- lineno:整数,表示发出警告的行号。
- line:字符串,表示发出警告的源代码行。
import warnings
# 自定义警告格式化函数
def custom_formatwarning(message, category, filename, lineno, line):
return f"Custom Warning: {message} ({filename}:{lineno})\n"
# 设置警告格式化函数
warnings.formatwarning = custom_formatwarning
# 抛出一个警告
warnings.warn("This is a custom warning", category=UserWarning)
- warnings.simplefilter(action, category=Warning, lineno=0, append=False):filterwarnings() 函数的简化版本
- warnings.resetwarnings():用于重置警告设置为默认值。
三、警告类别
- Warning:所有警告类的基类。
- UserWarning:用户定义的警告类。
- DeprecationWarning:关于已弃用功能的警告。
- PendingDeprecationWarning:关于即将弃用功能的警告。
- SyntaxWarning:语法相关的警告。
- RuntimeWarning:运行时警告,通常指示潜在的问题或错误。
- FutureWarning:关于可能在未来版本中更改的警告。
- ImportWarning:关于导入模块时的警告。
- UnicodeWarning:与 Unicode 相关的警告。
- BytesWarning:与字节序列相关的警告。
- ResourceWarning:与资源管理相关的警告。
四、其他
- warnings.WarningMessage.ssage:警告消息的文本内容。
- warnings.WarningMessage.line:警告消息所在的源代码行的文本内容。
- warnings.WarningMessage.lineno:警告消息所在的源代码行号。
- warnings.WarningMessage.filename:包含警告消息的源代码文件名。
- warnings.WarningMessage.file:包含警告消息的源代码文件对象。
- warnings.WarningMessage.category:警告消息的类别。
- warnings.WarningMessage.source:警告消息的源代码文本内容。
- warnings.catch_warnings(record=False, module=None,action=None, category=Warning, lineno=0, append):上下文管理器,用于捕获并记录警告消息
- record:指定是否记录捕获的警告消息。如果设置为 True,则警告消息将被记录在一个列表中,可以通过 warnings.catch_warnings() 返回的上下文管理器的 warnings 属性访问。如果设置为 False,则警告消息将只是简单地被捕获,而不会记录下来。
- module:指定要应用警告过滤器的模块对象。如果设置为 None,则默认为当前模块。
- action:指定警告处理的动作。可以是一个函数或字符串。如果是一个函数,它将被调用以处理每个捕获的警告消息。如果是一个字符串,它可以是以下值之一:
- ‘error’:将警告消息视为异常,并引发 Warning 类型的异常。
- ‘ignore’:忽略警告消息,不进行任何处理。
- ‘always’:始终打印警告消息,而不管警告过滤器的设置。
- category:指定要捕获的警告类别。可以是一个警告类别或警告类别的元组。如果设置为 Warning,则捕获所有警告。
- lineno:指定警告消息所在的源代码行号。如果设置为 0,则不进行行号匹配。
- append:指定是否将警告消息追加到警告列表的末尾。如果设置为 True,则新的警告消息将追加到列表末尾。如果设置为 False,则新的警告消息将插入到列表的开头。
- warnings.filters.count(value):返回过滤器列表中等于 value 的元素的数量。
- warnings.filters.index(value, start, stop):返回过滤器列表中第一个等于 value 的元素的索引。可以指定搜索的起始位置 start 和结束位置 stop。
import warnings
def custom_warning_function():
warnings.warn("This is a custom warning")
with warnings.catch_warnings(record=True) as warning_list:
custom_warning_function()
warning = warning_list[0]
print(warning.message)
print(warning.line)
print(warning.lineno)
print(warning.filename)
print(warning.file)
print(warning.category)
print(warning.source)
# 获取警告过滤器列表中的数量和索引
filter_count = warnings.filters.count()
filter_index = warnings.filters.index('default')
print(filter_count)
print(filter_index)