我有一个很大的图书馆,里面有很多文档测试。所有文档测试都在我的计算机上通过。当我将更改推送到 GitHub 时,GitHub Actions 在 Python 3.8、3.9、3.10 和 3.11 中运行相同的测试。所有测试均正确运行 在 Python 3.8 上;但是,在 Python 3.9、3.10 和 3.11 上,我收到许多以下类型的错误:
Expected:
[13.0, 12.0, 7.0]
Got:
[np.float64(13.0), np.float64(12.0), np.float64(7.0)]
即,结果是正确的,但由于某种原因,它们显示在“np.float64”内。
在我的代码中,我根本不使用np.float64,所以我不知道为什么会发生这种情况。另外,当测试在我的计算机上通过时,我不知道如何调试错误,并且很难生成最小的工作示例。 有没有办法让文档测试再次通过,而无需更改每个单独的测试?
这个错误是因为Python 3.9改变了numpy数组的字符串表示方式,更具体地说,是标量的字符串表示。
你有几个选择来解决这个问题:
1. 使用
numpy.testing.assert_array_equal
:
这是推荐的解决方案,因为它直接比较数组的内容,而忽略类型表示的差异。例如:
```python import numpy as np from numpy.testing import assert_array_equal
expected = [13.0, 12.0, 7.0] result = some_function_that_returns_array() assert_array_equal(result, expected) ```
2. 将数组转换为列表 :
在比较之前将结果数组转换为Python列表,这样就绕过了numpy的字符串表示:
python
expected = [13.0, 12.0, 7.0]
result = some_function_that_returns_array()
assert result.tolist() == expected
3. 使用
np.testing.assert_equal
:
这个函数会递归地比较数组元素,忽略类型的差异:
```python import numpy as np
expected = [13.0, 12.0, 7.0] result = some_function_that_returns_array() np.testing.assert_equal(result, expected) ```
4. 使用自定义断言函数 :
你可以创建自定义的断言函数,使用
ast.literal_eval
将字符串表示转换为Python对象,然后进行比较:
```python import ast
def assert_array_equal_ignore_dtype(result, expected): result_list = ast.literal_eval(str(result)) assert result_list == expected, f"Expected {expected}, got {result_list}"
expected = [13.0, 12.0, 7.0] result = some_function_that_returns_array() assert_array_equal_ignore_dtype(result, expected) ```
注意
: 使用
ast.literal_eval
要谨慎,因为它可能存在安全风险,如果输入不可信的话。
选择最适合你需求的方案,并将其应用到你的所有doctest中。
标签:python,numpy,doctest,numpy-2.x From: 78630047