eq__` を定義した型はハッシュ化できない?
2023-07-24 05:01:11
質問
私のプログラムのPython 3.1フォークに機能を移植する際に、奇妙なバグが発生しました。私はそれを次の仮説に絞り込みました。
Python 2.x とは対照的に、Python 3.x では、もしオブジェクトが
__eq__
メソッドを持つ場合、それは自動的にハッシュ化不可能になります。
これは本当ですか?
Python 3.1ではこうなっています。
>>> class O(object):
... def __eq__(self, other):
... return 'whatever'
...
>>> o = O()
>>> d = {o: 0}
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
d = {o: 0}
TypeError: unhashable type: 'O'
続いての質問は、私の個人的な問題をどのように解決するかということです。私はあるオブジェクト
ChangeTracker
を格納する
WeakKeyDictionary
を格納し、それぞれのオブジェクトに対して過去のある時点におけるピックルダンプの値を与えています。既存のオブジェクトがチェックインされるたびに、チェンジトラッカーはその新しいピクルスが古いものと同じかどうか、つまりそのオブジェクトがその間に変更されたかどうかを表示します。問題は、与えられたオブジェクトがライブラリにあるかどうかさえチェックできないことです。なぜなら、そのオブジェクトはハッシュ化できないという例外を発生させるからです。(それは
__eq__
メソッドを持っているからです)。どのように私はこれを回避することができますか?
どのように解決するのですか?
はい、もしあなたが
__eq__
を定義すると、デフォルトの
__hash__
(すなわち、メモリ上のオブジェクトのアドレスをハッシュする) がなくなります。これは、ハッシュが等価である必要があるため重要です。つまり、等しいオブジェクトは同じハッシュである必要があります。
解決策は簡単で、単に
__hash__
の定義と一緒に
__eq__
.
関連
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] Pythonの「名前付きタプル」とは何ですか?
-
[解決済み] 2次元配列の定義方法は?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのクラスで等価性(equality)をサポートするエレガントな方法
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Python 言語を決定するには?
-
[解決済み] Django filter queryset __in for *every* item in list