python - 检查python字典是否相等,允许浮点数有小的差异
问题描述
对于没有浮点数的字典,我们使用简单的a == b
wherea
和b
are python 字典。这很有效,直到我们最终在其中的某个地方包含a
并b
包含浮点数。它们是嵌套字典,所以我认为这会带来pytest.approx
麻烦。
我们想要的是告诉我们这两个字典相等(或近似相等,但不会仅在浮点近似上失败)的东西:
{"foo": {"bar": 0.30000001}} == {"foo": {"bar": 0.30000002}}
pytest.approx()
几乎是我想要的,但它不支持嵌套字典。有什么东西可以做我想做的吗?
解决方案
您可以定义自己的近似助手,并支持嵌套字典。不幸的是,pytest
不支持approx
使用自定义比较器进行增强,因此您必须编写自己的函数;但是,它并没有太复杂:
import pytest
from collections.abc import Mapping
from _pytest.python_api import ApproxMapping
def my_approx(expected, rel=None, abs=None, nan_ok=False):
if isinstance(expected, Mapping):
return ApproxNestedMapping(expected, rel, abs, nan_ok)
return pytest.approx(expected, rel, abs, nan_ok)
class ApproxNestedMapping(ApproxMapping):
def _yield_comparisons(self, actual):
for k in self.expected.keys():
if isinstance(actual[k], type(self.expected)):
gen = ApproxNestedMapping(
self.expected[k], rel=self.rel, abs=self.abs, nan_ok=self.nan_ok
)._yield_comparisons(actual[k])
for el in gen:
yield el
else:
yield actual[k], self.expected[k]
def _check_type(self):
for key, value in self.expected.items():
if not isinstance(value, type(self.expected)):
super()._check_type()
现在使用my_approx
代替pytest.approx
:
def test_nested():
assert {'foo': {'bar': 0.30000001}} == my_approx({'foo': {'bar': 0.30000002}})
推荐阅读
- c++ - 可以直接访问arrow::MemoryMappedFile的内存吗?
- ios - 在屏幕下方加载时,TableViewCell 按钮单击未注册
- php - str_replace 替换多个字符串 - php & laravel
- javascript - removeClass 不删除移动设备上的动画类?
- java - Web 服务 SOAP 客户端在 Tomcat 上工作,但在 IBM Web Sphere 上不工作 - 验证错误
- r - 如何将字符向量与 R 中 tibble 中的字符向量列表匹配?
- kubernetes - 获取 Helm Charts 中的文件夹列表
- postgresql - PostgreSQL plpgsql:生成系列不适用于 12 月
- javascript - 如何在不重新加载调试信息的情况下将值注入角度?
- php - 将 HTML 表转换为列数组 PHP