除了一个属性之外,Python断言相等

时间:2015-07-22 15:54:20

标签: python assert

更新

谢谢大家的建议,但我在这里有一个新问题。

由于我正在比较两个datetime.datetime个对象,并且我没有意识到它没有迭代的属性itemskeys,因此下面提供的一些有效答案不再工作。我在这里重构我的虚拟数据以更好地反映我的用例,

# 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

从示例中可以看出,除了“微秒”之外的每个属性都是相等的。无论如何循环遍历属性并进行比较?

谢谢你们!

3 个答案:

答案 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')