3

这是一个测试问题,而不是实施问题。

我有一个生成 JSON 的程序,我希望能够一致地比较输出,所以我将我所有的 dicts 转换为 OrderedDicts。

我已经搜索过了,我非常有信心我得到了所有这些,但是好的编程仍然需要测试。我不确定如何实际测试我的字典是否以相同的顺序出现,因为我告诉他们这样做,而他们只是碰巧以相同的顺序出现......

有没有办法强制 Python 随机化它的非有序字典?

ETA:我使用的是 python 2.7。我还有 18 个月的时间来转换这个东西……它在列表中……

4

1 回答 1

2

我不确定您是否真的需要对此进行测试,但如果您这样做……</p>

在 CPython 2.7 中,测试这一点真的没有意义。元素的顺序是任意的——这意味着它们可以任意地以与插入顺序相同的顺序结束,并且没有办法强制它们不这样做。

在 CPython 3.3-3.5 中,情况更糟。每次运行测试时,元素不仅会以任意顺序排列,而且会以不同的任意顺序排列。这意味着您的测试可能看起来像是在工作,因为它恰好有3!-1 / 3!机会工作,然后您将签入一个不稳定且无用的测试。

然而,在 CPython 3.6-3.7 中,顺序实际上类似于,但并不OrderedDict完全相同,这意味着您可以可靠地测试一些东西。如果您从字典中删除然后插入,则旧插槽将被重用。当然,这对. 所以:OrderedDict

>>> d1, d2 = {}, collections.OrderedDict()
>>> for i in range(10):
...     d1[i] = d2[i] = i
>>> del d1[2]
>>> del d2[2]
>>> d1[2] = d2[2] = 1000
>>> d1
{0: 0, 1: 1, 2: 1000, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9
>>> d2
OrderedDict([(0, 0),
         (1, 1),
         (3, 3),
         (4, 4),
         (5, 5),
         (6, 6),
         (7, 7),
         (8, 8),
         (9, 9),
         (2, 1000)])

但是,这依赖于 CPython 3.6-3.7 的实现细节,这几乎是您尝试测试但没有做的事情。在那个测试中这样做可以接受吗?

于 2018-05-22T20:37:21.703 回答