2016-08-06 5 views
2

私は現在、コールバックに渡されたオブジェクトを辞書であり、返す必要があります。辞書:setdefaultを元に戻す/削除する

呼び出し元は辞書にobj.setdefault("Server", "Something")と呼ばれ、キーと値のペアが存在しない場合でもデフォルト値を持ちます。

これを元に戻したり削除したりするにはどうすればいいですか?(デフォルト値を削除しますか?)setdefault私は単純にそのキーと値のペアを必要としないことを意味し、キーが終了しなければ合併症はないようですが、デフォルトのために常に追加されます。

+3

ただ、他のどのようなエントリを削除しますか? 'del obj ['Server']'? – user2357112

+0

デフォルトの場合にのみ削除しますか? – zondo

+2

XY問題である可能性があります。 dictにデフォルト値を表示させたくない場合は、 'setdefault(key、default)'ではなく 'get(key、default)'を使ってください。 –

答えて

5

setdefaultメソッドは、Serverキーの値をSomethingに設定します(Serverキーが辞書にない場合)。あなたは、その値が異なる場合に行う、Somethingからサーバキーを削除したくない場合は

if 'Server' in obj: del obj['Server'] 

:あなたは、単に辞書からServerキーを削除することができます

if obj['Server'] == 'Something': del obj['Server'] 

ただし、することはできませんServerの値が辞書にデフォルト値として追加されたのか、それともキーと値のペアの単純な設定として追加されたのかを確認します。これは、setdefaultを呼び出した後、その辞書がどのように追加されたかについての指示なしに、キーと値のペアを保持するためです。

デモンストレーション:

>>>d = {} 
>>>d.setdefault("Server", "Something") 
>>>d 
{'Server': 'Something'} 
>>>del d['Server'] 
>>>d 
{} 
0

コールバックに渡されたときに値が辞書にないと仮定すると、dict.setdefaultは実際には問題ではありません。この操作は、Python辞書を変更するための多くの機能の1つです。具体的には、指定されたキーにSOMETHINGが格納されていることを確認します。これは、インデックス付きの割り当てで直接行うことができます。コードと呼び出し元の両方が同じ辞書への参照を保持している限り、実際の選択肢はありませんが、呼び出し元(およびこの辞書の他のすべての参照所有者)を信頼する必要があります。

辞書の可変性が問題であるため、可能な解決策はデザインの余裕の周りを向きます。私は考えることができます:それは、コールバックに渡されたとき

  • コピー辞書、および/またはコピーや辞書の(読み取り専用)ビューへ
  • 変更戻り値
+0

ポインタありがとう。ある時点で私はやったが、私は単純で簡単なことに固執することに決めた。編集されました。 –

関連する問題