如何简化Scipy RuntimeWarning输出,仅保留警告存在提示?
替换Scipy插值模块的RuntimeWarning为简化提示
你可以通过自定义警告处理逻辑,实现保留警告通知但替换为简化文本的需求,以下是两种可行方案:
方案一:使用警告过滤器匹配替换
利用warnings.filterwarnings的replace动作,结合正则匹配Scipy插值模块的特定警告内容,替换为自定义简化提示:
import warnings import re # 匹配来自scipy.interpolate、包含knot/s/fp关键词的RuntimeWarning,替换为简化消息 warnings.filterwarnings( action='replace', category=RuntimeWarning, message=re.compile(r'.*(knot|s|fp).*'), module='scipy\.interpolate' ) # 设置简化后的警告文本 warnings.filterwarnings( action='always', category=RuntimeWarning, message='to see full warning comment out line 123', module='scipy\.interpolate' )
注:将上述代码的最后一行对应为你注释后可恢复原警告的代码行号(比如你实际设置过滤器的行是123,就写line 123)。
方案二:自定义警告输出函数
通过重写warnings.showwarning函数,精准拦截目标警告并修改输出内容,其他警告保持正常显示:
import warnings import scipy.interpolate # 保存原始的警告输出函数 original_showwarning = warnings.showwarning def custom_showwarning(message, category, filename, lineno, file=None, line=None): # 判定是否为目标警告:来自scipy.interpolate的RuntimeWarning,且包含指定参数关键词 is_target_warning = ( category is RuntimeWarning and filename.startswith(scipy.interpolate.__file__) and any(keyword in str(message) for keyword in ['knot', 's', 'fp']) ) if is_target_warning: # 输出简化提示 simplified_msg = "RuntimeWarning: to see full warning comment out line 123" original_showwarning(simplified_msg, category, filename, lineno, file, line) else: # 非目标警告按原始逻辑输出 original_showwarning(message, category, filename, lineno, file, line) # 替换默认的警告输出逻辑(注释此行即可恢复原警告) warnings.showwarning = custom_showwarning
两种方案都能实现你的需求:既收到警告存在的通知,又避免冗长的参数细节。当需要查看完整警告时,只需注释掉对应设置过滤器/替换showwarning的代码行即可。
内容的提问来源于stack exchange,提问作者Akut Luna
相关产品推荐
相关产品推荐

