皆さん。私は最近Python 2から3.5.1に切り替わり、書き直すことができないアサーション関数がありました。一般的に注文なしでdictsで2つのリストをアサートする方法はありますか?
def assertEqualUnordered(self, data1, data2):
"""
compare that data are similar
i.e.:
[d1, d2] == [d2, d1]
or
{'a': [d1, d2]} == {'a': [d2, d1]}
or
[{'a': [d1, d2]}, {'b': [d3, d4]}] == [{'b': [d4, d3]}, {'a': [d2, d1]}]
"""
if isinstance(data1, list) or isinstance(data1, tuple):
self.assertEqual(len(data1), len(data2))
for d1, d2 in zip(sorted(data1), sorted(data2)):
self.assertEqualUnordered(d1, d2)
elif isinstance(data1, dict):
data1_keys = sorted(data1.keys())
data2_keys = sorted(data2.keys())
self.assertListEqual(data1_keys, data2_keys)
for key in data1_keys:
self.assertEqualUnordered(data1[key], data2[key])
else:
self.assertEqual(data1, data2)
このコードは、正常に動作しますが、私が持っているよりも、D1およびD2は、dictsある場合:
TypeError: unorderable types: dict() < dict()
は、どのように私はpy3kで動作するように書き直すことができますか?
EDIT 1: 簡素化コードの例:
def assertEqualUnordered(data1, data2):
assert len(data1) == len(data2)
for d1, d2 in zip(sorted(data1), sorted(data2)):
assert d1 == d2
data1 = [{'a': 'a'}, {'b': 'b'}]
data2 = [{'b': 'b'}, {'a': 'a'}]
assertEqualUnordered(data1, data2)
あなたが見ている障害をより詳しく調べるためにこれを簡略化できますか?これはリストの代わりにビューを返すkeys()と関係があると仮定します。 https://docs.python.org/3.0/whatsnew/3.0.html また、完全なスタックトレースを含めることはできますか? – jgritty
例外をスローするコードを表示します。このコードでは、どこでも '<'は使用されません。 –
@jgrittyコード例 – vanadium23