在 Python 中,warnings
是一个内置模块,用于发出有关程序执行的警告信息,这些警告信息通常是关于程序行为的潜在问题。
不过,这些问题通常不是致命的错误,只不过是展示我们代码中潜在的问题,或不推荐的做法,但是不会影响到我们代码的运行。
以下是一些常见的警告类型:
DeprecationWarning:当使用的功能已经被弃用,可能会在未来版本中移除时发出。FutureWarning:当使用的功能或行为在未来版本中会有所改变,但目前仍然有效时发出。ImportWarning:当模块导入过程中出现问题时,例如,当使用相对导入而包不是作为模块导入时。PendingDeprecationWarning:与 DeprecationWarning 类似,但用于那些在当前版本中仍然有效,但将在下一个版本中被弃用的功能。RuntimeWarning:当程序运行时发生某些行为可能会影响程序的正确性或性能时发出。SyntaxWarning:当 Python 语法使用方式可能不正确时发出,例如,当在语法上存在一些不推荐的做法时。UnicodeWarning:当处理 Unicode 字符串时出现问题,例如,当处理字符串时可能会丢失信息。BytesWarning:当字节和字符串之间的操作可能导致数据丢失或意外行为时发出。ResourceWarning:当程序可能没有正确管理资源,例如,当文件或网络连接没有被正确关闭时发出。UserWarning:这是一个通用的警告类别,用于发出用户定义的警告信息。EnvironmentError:当环境问题可能影响程序运行时发出,例如,当环境变量设置不当时。Warning:这是所有警告的基类,通常不会直接使用,但可以捕获所有类型的警告。
warnings 模块定义了多种警告类别,例如 DeprecationWarning、FutureWarning、RuntimeWarning 等,我们可以通过指定这些 类别 来发出特定类型的警告,也可以指定警告信息,以及可选地指定文件和行号。
简单测试:
import warningswarnings.warn("This is a warning message.")
返回的结果:
如果我们要指定特定的警告,例如避免测试过程中,某个操作或函数调用可能对性能有负面影响,对服务器造成负担,可以使用警告来提醒:
import warnings
for data in range(10000):#如果想要测试这个方面,建议改数值再运行!if data > 1000:warnings.warn("Processing large data sets can lead to performance issues.")else:print(data)
如果我们正式运行的过程中,不想要警告报出(有时候确实挺烦的,实际上对运行没有影响但是确会报错),这时候可以通过 warnings.filterwarnings() 来设置过滤规则,决定哪些警告应该被显示或忽略。
使用warnings.filterwarnings
函数可以控制警告消息的显示行为。这个函数允许你指定一个过滤规则,以决定哪些警告应该显示,哪些应该被忽略。以下是一些使用warnings.filterwarnings
可能产生的效果:
-
忽略所有警告:
当你使用warnings.filterwarnings("ignore")
时,程序中所有的警告消息都不会显示在控制台上。这在生产环境中很常见,以避免警告信息干扰日志记录或用户界面。import warnings warnings.filterwarnings("ignore") #把这段代码放在上面测试的代码上,原本的报错就不会发生
-
默认行为(只显示一次警告):
如果不设置过滤规则,或者使用warnings.filterwarnings("once")
,每个警告只会显示一次。这是为了避免重复显示相同的警告信息。warnings.filterwarnings("once")
-
总是显示警告:
使用warnings.filterwarnings("always")
可以让每个警告在每次触发时都显示出来,不论它之前是否已经显示过。warnings.filterwarnings("always")
-
模块或类别特定的过滤:
你可以指定只忽略来自特定模块的警告,或者特定类型的警告(如弃用警告DeprecationWarning
)。# 忽略特定模块的所有警告 warnings.filterwarnings("ignore", module="numpy")# 忽略所有弃用警告 warnings.filterwarnings("ignore", category=DeprecationWarning)
-
错误处理:
将警告当作错误处理,可以通过warnings.filterwarnings("error")
实现。这意味着当触发警告时,程序将抛出一个异常。warnings.filterwarnings("error")
-
自定义过滤规则:
你可以定义自己的过滤函数,根据警告的消息、类别、发生的位置等信息来决定是否显示该警告。def my_filter(message, category, filename, lineno, line=None):# 根据需要自定义过滤逻辑return message == "Expected warning message"warnings.filterwarnings("ignore", filter=my_filter)
使用warnings.filterwarnings
的效果取决于我们自己设置的过滤规则。合理使用这些规则,可以有效管理程序中的警告信息,避免无关紧要的警告干扰程序的正常运行,同时也能在需要时获取重要的警告信息。