【问题标题】:Python assert equal except one attributePython断言除一个属性外相等
【发布时间】:2015-10-12 14:58:47
【问题描述】:

更新

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

由于我正在比较两个 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

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

谢谢各位!

【问题讨论】:

  • 除了任何一个都需要吗?还是除了特定的一个之外的所有?
  • 除一个特定的,本例attr3
  • 你看过这个:stackoverflow.com/questions/7999935/… -- 试试assert now.strftime("%Y-%m-%d %H:%M:%S") == then.strftime("%Y-%m-%d %H:%M:%S")
  • @xnx 成功了!我只需要声明then.strftime("%Y-%m-%d %H:%M:%S") == now.strftime("%Y-%m-%d %H:%M:%S")!如果有人想要断言等于天、小时、分钟等,这也可能很有用。请在下面编辑您的答案,我会将其作为正确答案。谢谢!
  • 用另一个建议编辑了我的答案。

标签: python assert


【解决方案1】:

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

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

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

【讨论】:

  • 我假设这是为了得到所有断言失败的总和?如果有foo[attr2] != bar[attr2]foo[attr3] == bar[attr3] 的情况怎么办?这里的总和是一样的,但这不是我想要的。
【解决方案2】:

只需遍历您要比较的属性,并为每个属性进行断言。

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

【讨论】:

  • {'attr3': 3}.keys().pop('attr3') -> TypeError: an integer is required
  • @warvariuc 正确,已更正 - 首先从字典中弹出,然后获取键列表。谢谢。
【解决方案3】:

这应该适合你。

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

【讨论】:

  • 如果他们的attr3 意外等于,这将不起作用
  • 会的。它只是完全忽略了 attr3。
  • 哦,我刚刚看到了 k != 'attr3'
  • @benjaminz 是的,它告诉列表理解忽略任何名为“attr3”的键。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2017-11-07
  • 2011-03-19
  • 2017-12-29
  • 2017-11-08
相关资源
最近更新 更多