gpt4 book ai didi

python - 如何使用应用于值的 assertSequenceEqual 来实现 assertDictEqual

转载 作者:IT老高 更新时间:2023-10-28 21:04:11 29 4
gpt4 key购买 nike

我知道,在执行 assertEqual 时在字典上,assertDictEqual叫做。同样,assertEqual在一个序列上将执行 assertSequenceEqual .

但是,当 assertDictEqual正在比较值,似乎没有使用 assertEqual ,因此 assertSequenceEqual没有被调用。

考虑以下简单的字典:

lst1 = [1, 2]
lst2 = [2, 1]

d1 = {'key': lst1}
d2 = {'key': lst2}

self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><

如何测试 d1 等字典和 d2通过递归应用 assertEqual 来正确比较它们的相等性- 类似于值的语义?

如果可能的话,我想避免使用外部模块(如建议的 in this question ),除非它们是原生 django 扩展。


编辑

基本上,我所追求的是这个的内置版本:

def assertDictEqualUnorderedValues(self, d1, d2):
for k,v1 in d1.iteritems():
if k not in d2:
self.fail('Key %s missing in %s'%(k, d2))

v2 = d2[k]

if isinstance(v1, Collections.iterable) and not isinstance(v1, basestring):
self.assertValuesEqual(v1, v2)
else:
self.assertEqual(v1, v2)

上述代码的问题在于错误消息不如内置断言那么好,而且我可能忽略了一些边缘情况(因为我只是在脑海中写下)。

最佳答案

您为什么不首先对您的字典进行递归排序,而不是覆盖 assertDictEqual?

def deep_sort(obj):
"""
Recursively sort list or dict nested lists
"""

if isinstance(obj, dict):
_sorted = {}
for key in sorted(obj):
_sorted[key] = deep_sort(obj[key])

elif isinstance(obj, list):
new_list = []
for val in obj:
new_list.append(deep_sort(val))
_sorted = sorted(new_list)

else:
_sorted = obj

return _sorted

然后排序,使用普通的assertDictEqual:

    dict1 = deep_sort(dict1)
dict2 = deep_sort(dict2)

self.assertDictEqual(dict1, dict2)

这种方法的好处是不关心列表的深度。

关于python - 如何使用应用于值的 assertSequenceEqual 来实现 assertDictEqual,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18464095/

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