[解決済み] Pythonのデータクラスをイミュータブルにせずにハッシュ化するには?
質問
Python3でデータクラスを持っているとします。私はこれらのオブジェクトをハッシュし、順序付けることができるようにしたい。私はこれらが不変であることを望んでいない。
私はidで順序付け/ハッシュ化したいだけです。
私はdocsで私がちょうど実装することができることを参照してください_。 ハッシュ _ などと書いてありますが、datacalsesはこれを処理することを目的としているので、その作業をやってもらいたいと思います。
from dataclasses import dataclass, field
@dataclass(eq=True, order=True)
class Category:
id: str = field(compare=True)
name: str = field(default="set this in post_init", compare=False)
a = sorted(list(set([ Category(id='x'), Category(id='y')])))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Category'
どのように解決するのですか?
から ドキュメント :
の暗黙の生成に関する規則を以下に示します。
__hash__()
メソッドの暗黙の生成に関する規則を示します。[...]
もし
eq
とfrozen
は両方とも真で、デフォルトではdataclass()
は を生成します。__hash__()
メソッドを生成します。もしeq
が真でfrozen
は偽です。__hash__()
に設定されます。None
にセットされ、ハッシュ不可能であることを示します。 (に設定され、ハッシュ不可能であることを示します(これはミュータブルであるためです)。もしeq
が偽の場合__hash__()
はそのままにされ、つまり__hash__()
メソッドが使用されます。 メソッドが使用されます (スーパークラスがオブジェクトの場合、これはつまり はidベースのハッシュにフォールバックすることを意味します)。
を設定したので
eq=True
を設定し
frozen
をデフォルトのままにしておきました (
False
) の場合、データクラスはハッシュ不可能になります。
3つのオプションがあります。
-
設定
frozen=True
(さらにeq=True
を追加)、これによりクラスがイミュータブルでハッシュ化できるようになります。 -
設定する
unsafe_hash=True
を作成します。__hash__
メソッドを作成しますが、クラスは変更可能なままなので、クラスのインスタンスがdictやsetに格納されている間に変更された場合に問題が発生する危険性があります。cat = Category('foo', 'bar') categories = {cat} cat.id = 'baz' print(cat in categories) # False
-
手動で
__hash__
メソッドを実装します。
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] Pythonスクリプトのプロファイリングはどのように行うのですか?
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み] リストを反転させるには?
-
[解決済み] Pythonで'Enum'を表現するにはどうしたらいいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
最新
-
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のインスタンス変数とクラス変数
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。