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



我刚刚花了半天时间将一个错误追踪到一个字典,我在迭代它时忘记了排序。即使测试了这部分代码,测试也没有拾取它,因为该字典在测试期间具有可重复的顺序。只有当我洗牌字典时,测试才失败!(我使用了一个中间random.shuffle列表并构建了一个OrderedDict(

这有点吓到我,因为到处可能都有类似的错误!

有没有办法在测试期间全局强制所有字典无序?

更新:我想我至少弄清楚了导致错误的原因。如此处所述,带有 int 键的字典通常会被排序,但可能并不总是如此。我的假设:在我的测试中,整数总是很小(10 阶(,因此总是有序的。然而,在实际运行中,整数要大得多(顺序 10^13(,因此并不总是有序的。我能够在交互式会话中重现这种行为:list(foo.keys()) == sorted(foo.keys())总是True小键,但不是每个具有非常大键的字典。

从 3.6 开始,字典保持键插入顺序。 如果您希望它们以特定的方式运行,则可以创建一个从字典继承的类,并为其提供所需的行为(例如,确保它在返回键列表之前对其进行洗牌(。

无论您使用哪个版本的 python,如果您想尝试依赖 dict 实现的特定行为,请务必查看实现详细信息。 更好的是,为了可移植性,只需编写一个解决方案,确保它们的行为符合您的预期,无论是我上面提到的,还是通过在键列表上使用 shuffle 或其他东西。

最新更新