Python 断言除一个属性外均等
Python assert equal except one attribute
已更新
谢谢大家的建议,但我遇到了一个新问题。
因为我正在比较两个 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
正如您从示例中看到的,除 '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')
已更新
谢谢大家的建议,但我遇到了一个新问题。
因为我正在比较两个 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
正如您从示例中看到的,除 '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')