defaultdict(set)
非常に大きなデータ構造に内部マッピングを設定するために使用しています。データが取り込まれた後、構造全体 (マッピングを含む) がクライアント コードに公開されます。その時点で、誰もマッピングを変更したくありません。
そして、誰も意図的にそうしません。しかし、クライアント コードが存在しない要素を誤って参照する場合があります。その時点で、通常の辞書は を発生させますKeyError
が、マッピングはdefaultdict
であるため、そのキーで新しい要素 (空のセット) を作成するだけです。すべてが静かに行われるため、これを把握するのは非常に困難です。しかし、これが起こらないようにする必要があります (セマンティクスは実際には壊れませんが、マッピングは巨大なサイズに成長します)。
私は何をすべきか?これらの選択肢が表示されます:
マッピングでディクショナリ ルックアップが実行される現在および将来のクライアント コード内のすべてのインスタンスを検索し、
mapping.get(k, {})
代わりに変換します。これはただひどいです。defaultdict
データ構造が完全に初期化された後、それを に変換して「フリーズ」しdict
ます。(実際には凍結されていないことはわかっていますが、クライアント コードが実際にはmapping[k] = v
.インターフェイスにラップ
defaultdict
しdict
ます。それを行うエレガントな方法は何ですか?残念ながら、パフォーマンスへの影響は大きいかもしれません (このルックアップはタイトなループで頻繁に使用されます)。defaultdict
すべての機能を「シャットダウン」するメソッドをサブクラス化して追加しdefaultdict
、通常の のように動作させますdict
。上記の 3 の変形ですが、それより速いかどうかはわかりません。そして、実装の詳細に頼らずに実行できるかどうかはわかりません。データ構造でregular
dict
を使用し、そこにあるすべてのコードを書き直して、要素が辞書にあるかどうかを最初に確認し、そうでない場合は追加します。良くない。