gpt4 book ai didi

python - 检查 python 字典是否相等,允许 float 的小差异

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:33 29 4
gpt4 key购买 nike

对于没有 float 的字典,我们使用简单的 a == b 其中 ab 是 python 字典。这很好用,直到我们在 ab 中某处包含 float 为止。它们是嵌套字典,所以我认为这会给 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}})

关于python - 检查 python 字典是否相等,允许 float 的小差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56046524/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com