3

これはテストの問題であり、実装の問題ではありません。

JSON を生成するプログラムがあります。出力を一貫して比較できるようにしたいので、すべての辞書を 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いますが、まったく同じではありません。これは、確実にテストできるものがあることを意味しますdict から削除してから挿入すると、古いスロットが再利用されます。もちろん、これは には当てはまりません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 に答える