2009-10-13 9 views
6

私は__eq__メソッドを作成したいコレクションクラスに取り組んでいます。それは私が思ったよりも微妙なものになってきています。組み込みのコレクションクラスがどのように機能するかについては、いくつかの複雑さに気がつきました。コレクションクラスの__eq__メソッドの良い例は何ですか?

本当に私を助けてくれるものが良い例です。標準ライブラリまたはサードパーティライブラリのいずれかで、__eq__メソッドの純粋なPython実装がありますか?

答えて

1

「collections.py」をご覧ください。最新バージョン(バージョンコントロールから)は、__eq__でOrderedDictを実装しています。また、__eq__がsets.pyにあります

+0

ありがとうございます。私は、コレクションがC言語で実装されていると思っていました。 –

+0

Python 2.5および2.6では、C拡張モジュールです。 2.7(バージョンコントロールから)では、C拡張モジュール_collectionsからdequeとdefaultdiectをインポートするPythonモジュールです。 OrderedDictは3.1で新しく、2.7にバックポートしました。 –

7

部品が固いです。部品は単純な委任でなければなりません。

def __eq__(self, other): 
    if len(self) != len(other): 
     # Can we continue? If so, what rule applies? Pad shorter? Truncate longer? 
    else: 
     return all(self[i] == other[i] for i in range(len(self))) 
+0

私はそれを試しましたが、ここにはいくつかのニュアンスがあります。たとえば、False: '(1,2,3)== [1,2,3]'と比較します。だからこそ、私は例を望んでいた:コーナーケースとそれ以外のものすべてについて知っていることを確認すること。 –

+0

(1,2,3)は異なるタイプなので[1,2,3]と等しくありません。あなたがどのようなタイプ強制ルールを適用すべきだと思いますか?それはかなり複雑です。それは「もっと一般的な」タイプですか? –

+0

すべてのコレクションがセットなどのインデックス可能なわけではなく、同じコレクションが同じ順序でアイテムを持つという保証はありません。 – PaulMcG

関連する問題