谢谢大家的建议,但我在这里有一个新问题。
由于我正在比较两个datetime.datetime
个对象,并且我没有意识到它没有迭代的属性items
或keys
,因此下面提供的一些有效答案不再工作。我在这里重构我的虚拟数据以更好地反映我的用例,
# Two datetime that I want to assert equal as long as they are equal to the 'second'
now = datetime.datetime(2015, 7, 22, 11, 36, 49, 811000)
then = datetime.datetime(2015, 7, 22, 11, 36, 49, 811099)
assert now == then # this for sure will return false
从示例中可以看出,除了“微秒”之外的每个属性都是相等的。无论如何循环遍历属性并进行比较?
谢谢你们!
答案 0 :(得分:2)
编辑:对于修改后的问题,您可以使用:
assert now.replace(microsecond=0) == then.replace(microsecond=0)
或
assert now.strftime("%Y-%m-%d %H:%M:%S") == then.strftime("%Y-%m-%d %H:%M:%S")
要明确地明确排除attr3
(并确保其值在每个词典中不相同
assert all([foo[k] == bar[k] for k in bar.keys() if k != 'attr3']) and foo['attr3'] != bar['attr3']
也许以下内容会有所帮助:
assert sum([foo[k]!=v for (k,v) in bar.items()]) == 1
(但您需要确保两个词典中的键都相同)。
答案 1 :(得分:2)
只需遍历要比较的属性,并为每个属性进行断言。
compared_keys = foo.pop('attr3').keys()
for k in compared_keys:
assert(foo[k] == bar[k])
答案 2 :(得分:0)
这对你有用。
foo = {
'attr1': 1,
'attr2': 2,
'attr3': 3
}
bar = {
'attr1': 1,
'attr2': 2,
'attr3': 3
}
assert (sum([foo[k] == v for k, v in bar.items() if k != 'attr3'])) == 2
print('Works')
foo = {
'attr1': 1,
'attr2': 2,
'attr3': 3
}
bar = {
'attr1': 1,
'attr2': 2,
'attr3': 300
}
assert (sum([foo[k] == v for k, v in bar.items() if k != 'attr3'])) == 2
print('Works')