Python 断言除一个属性外均等

Python assert equal except one attribute

已更新

谢谢大家的建议,但我遇到了一个新问题。

因为我正在比较两个 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

正如您从示例中看到的,除 'microsecond' 之外的每个属性都是相等的。无论如何遍历属性并进行比较?

谢谢大家!

编辑:对于您修改后的问题,您可以使用:

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

(但您需要确保两个词典中的键相同)。

只需遍历要比较的属性,然后为每个属性断言。

compared_keys = foo.pop('attr3').keys()
for k in compared_keys:
    assert(foo[k] == bar[k])

这应该适合你。

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