私はオブジェクトをPython辞書のキーとして使用しようとしていますが、それは私がかなり理解できないように動作しています。Python辞書のキーとしてのオブジェクト
まず私は、キーとしての私のオブジェクトと辞書を作成します。
package_disseminators = {
ContentType("application", "zip", "http://other/property") : "one",
ContentType("application", "zip") : "two"
}
は今の鍵であるものと「同じ」である別のオブジェクトを作成します。
content_type = ContentType("application", "zip", "http://other/property")
IカスタムたContentTypeオブジェクト__eq__
方法は__str__
値を比較するように__eq__
およびカスタム__str__
方法を与えています。今
、いくつかの対話的なPython:
>>> for key in package_disseminators:
... if key == content_type:
... print "match"
... else:
... print "no match"
...
no match
match
>>> content_type in package_disseminators.keys()
True
オクラホマので、それはそう、私の物のように見える間違いなくキーとして適切に識別されている:
>>> package_disseminators[content_type]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property"))
のErを... OK?したがって、content_typeはpackage_disseminators.keys()リストにありますが、キーではありませんか?
>>> package_disseminators.has_key(content_type)
False
明らかにそうではありません。
私は、リストの真の "in"ステートメントと実際にはdictのキーを調べることの間で、Pythonが等価性を判定するために使う比較プロセスが異なると推測します。任意のヒントや洞察?
さらに詳しい説明:あなたのオブジェクトにはすでに 'object'から継承された' __hash__'メソッドがあります。しかし、デフォルトの実装では各インスタンスに固有の値が返されるため、より良い実装を提供しない限り、2つの等しいインスタンスは異なるハッシュを持ちます。 'has_key'はハッシュ値を比較し、' in'チェックが等しいかどうかチェックするので、 'has_key'は失敗し、inは成功します。 –
こんにちは。大変、ありがとう、大変感謝しています! –