如何强制dicts无序(用于测试)?

时间:2017-08-08 15:56:31

标签: python python-3.x unit-testing

我只花了半天的时间追踪一个错误到一个字典,我在迭代时忘了排序。尽管测试了那部分代码,但是测试没有提到它,因为测试期间dict具有可重复的顺序。 只有当我拖拽dict时,测试才会失败!(我使用了中间random.shuffle'列表并构建了OrderedDict

这有点让我感到害怕,因为整个地方可能会有类似的错误!

有没有办法在测试过程中全局强制所有dicts无序?

更新:我想我至少弄明白是什么导致了这个错误。如here所述,带有int键的dicts通常是排序的,但可能并不总是如此。我的假设:在我的测试中,整数总是很小(10阶),因此总是有序。然而,在实际运行中,整数更大(订单10 ^ 13),因此并不总是有序。我能够在交互式会话中重现此行为:对于小键,list(foo.keys()) == sorted(foo.keys())始终为True,但对于每个具有非常大键的dict,Sub Example1() Dim wksht As Worksheet For Each wksht In Worksheets If wksht.CodeName Like "S#" Then 'do something End If Next wksht End Sub 都不是。{/ p>

1 个答案:

答案 0 :(得分:1)

截至3.6,dicts maintain key insertion order。如果您希望它们以特定方式运行,您可以创建一个继承自dict的类并为其提供所需的行为(例如,确保在返回之前将其重新排列)。

无论您使用的是哪个版本的python,如果您想尝试依赖于dict实现的特定行为,请务必查看实现细节。更好的是,为了便于携带,只需编写一个解决方案,确保它们按照您的预期行事,或者如上所述,或者通过在键列表上使用随机播放或其他内容。