scipy.signal的butterworth滤波器函数返回值解包异常问题咨询
问题成因
scipy.signal.butter的返回值数量由入参output决定:
- 默认
output='ba'时,返回滤波器的分子系数b、分母系数a两个值,所以第一种写法运行时完全正常。 - 只有当显式指定
output='zpk'时,才会返回零点、极点、增益3个值。
编辑器的高亮报错是静态类型检查工具的误报,导致问题的常见原因有两个:
- 你使用的scipy版本内置的类型注解不完整,没有正确关联
output参数和返回值数量的对应关系,静态检查时默认按3个返回值的规则做校验。 - 你的编辑器对应的Python静态检查插件(比如Pylance、Pyright)版本过低,无法正确识别多返回值分支的类型注解。
解决方法
优先方案:显式指定output参数
在调用函数时主动声明output='ba',既消除静态检查误报,也让代码逻辑更明确,不会出现歧义:
b, a = butter(order, normal_cutoff, btype='low', analog=False, output='ba')
其他可选方案
- 升级scipy到1.8.0及以上版本,同时升级编辑器的Python静态检查插件,新版本已经修复了该函数的类型注解错误,不会再出现误报。
- 如临时不想修改代码,可在对应代码行添加静态检查忽略标记(不推荐,会覆盖其他真实的类型错误提示):
b, a = butter(order, normal_cutoff, btype='low', analog=False) # type: ignore
补充说明
第二种写法运行报错的原因是,仅修改了接收返回值的变量数量,没有同步修改output参数,函数仍然按默认规则返回2个值,自然会出现返回值数量不匹配的运行时错误。如果需要接收3个返回值,需要同步指定output='zpk':
z, p, k = butter(order, normal_cutoff, btype='low', analog=False, output='zpk')
内容的提问来源于stack exchange,提问作者Joe Baltzly
相关产品推荐
相关产品推荐

