0

私はサードパーティ製の素敵な小さな python モジュールを使用していますが、頭をひねったビットに出くわし、主にデータの整合性に関心があります。

簡単な要約: 大まかに次のようなクラス メソッドがあります。

def as_dict(self):
    ##adjust some attributes that don't make sense outside this scope        
    ##... ... ...
    return self.__dict__

このメソッドの結果を手動で使用していますが、それを渡す場所がいくつかあり、それらの関数が返された辞書に対して実際に何をしているのかわかりません。

さて、これはそのままで安全ですか、それともいくつかの迷子の関数が私のインスタンス属性をいじり始める可能性がありますか? 私は当初、「自己」が何らかの形でデータセットを保護していると考え、データのコピーを渡していましたが、インスタンス メモリへの参照を渡しているのだろうか? (内部にネストされたミュータブルがあります)

代わりにやるべきですか:return copy.deepcopy(self.__dict__)

4

2 に答える 2

2

その通りです。インスタンス dict は、他の dict と同様に完全に変更可能です。そのような口述を返すのは珍しいです。おそらく、何らかの理由でインスタンスの外部で変更することが意図されています。どうやら設計が悪いようです。

グローバル変数を使用するよりも優れていると考えて、そのような恐ろしいことをする人が時々います。

コピーは本当に良い修正ではありません。非常に遅くなる可能性があり、根本的な設計上の問題を隠しているだけです

コピーに代わる方法は、辞書をラップして、誤って変更できないようにすることです。

于 2013-04-03T00:11:20.880 に答える
1

コピーを渡すことを確認したい場合はcopy.deepcopy(self.__dict__)、行く方法です。

于 2013-04-03T00:09:43.993 に答える