有两条格言:旧的和更新的。我想检查他们是否相等,除了status
,latitude
和longitude
键。
assert old_dict['status'] != updated_dict['status']
assert old_dict['latitude'] != updated_dict['latitude']
assert old_dict['longitude'] != updated_dict['longitude']
for field in ('status', 'latitude', 'longitude'):
updated_dict.pop(field)
old_dict.pop(field)
assert old_dict == updated_dict
更像Python的方法是什么?
8条答案
按热度按时间neekobn81#
你可以Assert两个dict的项之间的对称差是三个键:
mum43rcc2#
有点非正统的建议,但听我说完:
对于每个
key
,我们Assert当且仅当键是不同的键之一时,值不同。ee7vknir3#
您可以通过字典解析过滤两个字典,然后检查是否相等:
nwlls2ji4#
我假设完整的测试要求 exception 或
excluded
dict键必须不同,并且这两个字典可能不具有所有共同的键。一些测试用例可编写如下:
其中
old_dict
基本上是base_dict
,而unequal_dict
、equal_dict
、partial_dict
、identical_dict
和not_same_keys_dict
涵盖了不同的极端情况。然后,我们定义一些辅助函数来同时测试不同的输入。
函数化后的原始代码如下所示:
假设要比较的字典有一些不相同的键,那么这就是生成的测试所能达到的最快速度。所有其他方法都要慢得多,尽管可能更干净,在某些情况下甚至可能更快,例如,当要排除的键的数量很大时,等等。另外,如果不需要
not_same_key
用例,即,Dict总是具有相同的密钥,则基于X1 M9 N1 X的解决方案将更快,因为它们将具有显式短路,并且它们可以通过改变以下各项来转换:例如
并删除其他健全性检查,如
if key in dict1 and key in dict2
。为了完整起见,我报告了我测试的所有其他选项:
使用显式测试的自己的解决方案
@blhsing溶液的功能化
@L3viathan解决方案的##变体
以及
改编自@jpp答案:
pprl5pva5#
试试这个:
如果
update_dict
密钥是update_dict
密钥的子集,则它将为真。6rqinv9w6#
几行,但应该相当快,因为它不会改变要比较的dict对的结构。
pcww981p7#
不如
这将在dict上迭代一次(我不认为有办法绕过它)。
kqhtkvqz8#
有一个名为deepdiff的库
它会将所有差异输出为字典,如下所示
然后,可以在传入之前删除所需的字段。如果输入字典相同,则将返回空字典
下面是您案例示例