Pythonのunittest
モジュールを使用していて、2つの複雑なデータ構造が等しいかどうかを確認したいと思います。numpy
オブジェクトは、数値、文字列、Pythonコンテナ(リスト/タプル/ディクト)、配列など、あらゆる種類の値を持つdictのリストにすることができます。後者は私がただすることができないので質問をする理由です
self.assertEqual(big_struct1, big_struct2)
それは
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
私はこれのために私自身の平等テストを書く必要があると想像します。任意の構造で機能するはずです。私の現在のアイデアは、次のような再帰関数です。
- の現在の「ノード」
arg1
をの対応するノードと直接比較しようとしarg2
ます。 - 例外が発生しない場合は、次に進みます(「ターミナル」ノード/リーフもここで処理されます)。
- 捕まえられた場合
ValueError
、それが見つかるまで深くなりnumpy.array
ます; - 配列を比較します(たとえば、このように)。
少し問題があるように思われるのは、2つの構造の「対応する」ノードを追跡することですが、zip
ここで必要なのはおそらくそれだけです。
問題は、このアプローチの良い(より単純な)代替案はあるかということです。多分numpy
これのためのいくつかのツールを提示しますか?代替案が提案されていない場合は、このアイデアを実装し(より良いアイデアがない限り)、回答として投稿します。
PSこの問題に対処する質問を見たかもしれないと漠然と感じていますが、今は見つかりません。
PPS別のアプローチは、構造をトラバースしてすべてのをリストに変換する関数ですが、numpy.array
これは実装が簡単ですか?私には同じようです。
編集:サブクラス化numpy.ndarray
は非常に有望に聞こえますが、明らかに、比較の両側をテストにハードコードしていません。ただし、そのうちの1つは実際にハードコーディングされているため、次のことができます。
numpy.array
;のカスタムサブクラスを入力します。- jterraceの答えに変更
isinstance(other, SaneEqualityArray)
します;isinstance(other, np.ndarray)
- 比較では常にLHSとして使用してください。
この点に関する私の質問は次のとおりです。
- それは機能しますか(つまり、私には大丈夫に聞こえますが、いくつかのトリッキーなエッジケースは正しく処理されない可能性があります)?私のカスタムオブジェクトは、私が期待するように、再帰的な等価性チェックで常にLHSとして終了しますか?
numpy
繰り返しますが、より良い方法があります(実際の配列を持つ構造の少なくとも1つを取得した場合)。
編集2:試してみましたが、(一見)機能する実装がこの回答に示されています。