4

2 つの任意の python オブジェクトの等価性を判断するためのベスト プラクティスはありますか? ある種のオブジェクトのコンテナーを作成し、新しいオブジェクトがコンテナーに格納されている古いオブジェクトと等しいかどうかを判断する必要があるとします。

問題は、「is」を使用できないことです。これは、変数がまったく同じオブジェクトにバインドされているかどうかのみをチェックするためです (ただし、オブジェクトのディープ コピーが存在する可能性があり、これは私の意味では元のオブジェクトと同じです)。これらのオブジェクトの一部は、numpy 配列のように要素ごとに等しいものを返すため、「==」も使用できません。

あらゆる種類のオブジェクトの等価性を判断するためのベスト プラクティスはありますか? たとえば、

repr(objectA)==repr(objectB)

十分ですか?

または、使用するのが一般的ですか:

numpy.all(objectA==objectB)

objectA == objectB が "[]" に評価される場合、おそらく失敗します

乾杯、ロバート

編集:

3 番目のコメントについては、「「同等のオブジェクト」の定義は何ですか?」について詳しく説明します。

強い意味で、私は平等の定義を持っていません。むしろ、オブジェクトが等しいかどうかをオブジェクトに判断させます。問題は、私が理解している限り、それぞれeqまたは == について十分に合意された標準がないことです。ステートメントは、配列またはあらゆる種類のものを返すことができます。

私が念頭に置いているのは、 eqと "is"の間にある演算子を SEQ (強い等価性) と呼ぶようにすることです。SEQ は、常に単一のブール値に評価され (たとえば、すべての要素が等しいことを意味する numpy 配列の場合)、オブジェクトが自分自身を等しいと見なすかどうかを決定するという意味でeqよりも優れています。しかし、SEQ は、メモリ内で区別されるオブジェクトも同等である可能性があるという意味で、「is」より劣ります。

4

1 に答える 1

2

次のようなカスタムの再帰的等値チェッカーを作成することをお勧めします。

from collections import Sequence, Mapping, Set
import numpy as np

def nested_equal(a, b):
    """
    Compare two objects recursively by element, handling numpy objects.

    Assumes hashable items are not mutable in a way that affects equality.
    """
    # Use __class__ instead of type() to be compatible with instances of 
    # old-style classes.
    if a.__class__ != b.__class__:
        return False

    # for types that implement their own custom strict equality checking
    seq = getattr(a, "seq", None)
    if seq and callable(seq):
        return seq(b)

    # Check equality according to type type [sic].
    if isinstance(a, basestring):
        return a == b
    if isinstance(a, np.ndarray):
        return np.all(a == b)
    if isinstance(a, Sequence):
        return all(nested_equal(x, y) for x, y in zip(a, b))
    if isinstance(a, Mapping):
        if set(a.keys()) != set(b.keys()):
            return False
        return all(nested_equal(a[k], b[k]) for k in a.keys())
    if isinstance(a, Set):
        return a == b
    return a == b

ハッシュ可能なオブジェクトが等価性に影響を与える方法で変更可能ではないという仮定は、そのようなオブジェクトがキーとして使用された場合、辞書とセットを壊すため、かなり安全です。

于 2013-08-22T10:50:57.033 に答える