- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我知道,在执行 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/
老实说,我一直使用 assertDictEqual,因为有时当我不使用它时,我得到的信息是,equal dicts 是不一样的。 但是...我知道字典可以通过 == 运算符进行比较: >>> {'a'
我知道,在执行 assertEqual 时在字典上,assertDictEqual叫做。同样,assertEqual在一个序列上将执行 assertSequenceEqual . 但是,当 asser
我是一名优秀的程序员,十分优秀!