如何阻止NumPy浮点数在doctest中显示为np.float64?
解决Doctest中Numpy类型显示不匹配的问题
方法1:自定义Doctest输出转换函数
不用逐个修改测试用例,直接给doctest加个输出转换器,自动把numpy类型的字符串替换成原生Python类型格式:
在你的测试入口文件(比如run_doctests.py)里加这段代码:
import doctest import numpy as np def normalize_numpy_output(got_output): # 替换np.float64(xx)为xx got_output = got_output.replace('np.float64(', '').replace(')', '') # 如需处理其他numpy类型,比如np.int64,继续加替换规则 got_output = got_output.replace('np.int64(', '').replace(')', '') return got_output # 自定义输出检查器 class NumpyFriendlyChecker(doctest.OutputChecker): def check_output(self, want, got, optionflags): # 先统一处理实际输出的格式 normalized_got = normalize_numpy_output(got) return super().check_output(want, normalized_got, optionflags) # 替换默认的检查器 doctest.OutputChecker = NumpyFriendlyChecker
之后用这个文件启动doctest,所有numpy类型的输出都会被自动适配成测试用例里的预期格式。
方法2:修改Numpy打印配置
从根源上让numpy输出原生类型的字符串,在测试启动时添加配置:
import numpy as np # 让numpy浮点数打印时直接输出为普通浮点数格式 np.set_printoptions(formatter={'all': lambda x: str(float(x)) if isinstance(x, np.floating) else str(x)})
这个配置会覆盖numpy默认的类型打印规则,让输出和本地环境一致。
方法3:锁定CI环境的依赖版本
本地和CI的numpy版本差异可能是问题根源,直接在CI的依赖配置(比如requirements.txt或者GitHub Actions的安装步骤)里锁定numpy版本,和本地一致:
numpy==1.24.3
消除版本差异后,输出格式自然会对齐。
内容的提问来源于stack exchange,提问作者Erel Segal-Halevi
相关产品推荐
相关产品推荐

