2013-07-30 10 views
13

defaultdict documentationには、項目が見つからない場合、default_factory "によって返された値がキーの辞書に挿入されて返されると記載されています。それは大部分の時間ですが、実際にはこの場合には値が返されますが、ではなく、がdefaultdictに挿入されています。欠けている値を挿入しないPythonのdefaultdict

私はおそらくサブクラスdefaultdictとオーバーライドできると思った...私は__missing__と思いますか?わからない。これについてはどうすればいいですか?

ありがとうございます。

答えて

13

あなたはdictをサブクラス化して実装することができ__missing__

class missingdict(dict): 
    def __missing__(self, key): 
     return 'default' # note, does *not* set self[key] 

デモ:あまりに

>>> d = missingdict() 
>>> d['foo'] 
'default' 
>>> d 
{} 

あなたでしサブクラスdefaultdict、あなたはでスロープラスコピーやピクルスのサポートを扱う工場を取得したいです:

from collections import defaultdict 

class missingdict(defaultdict): 
    def __missing__(self, key): 
     return self.default_factory() 

デモ:

>>> from collections import defaultdict 
>>> class missingdict(defaultdict): 
...  def __missing__(self, key): 
...   return self.default_factory() 
... 
>>> d = missingdict(list) 
>>> d['foo'] 
[] 
>>> d 
defaultdict(<type 'list'>, {}) 

しかし、あなたが見ることができるよう、__repr__はその名偽るん。

+0

これは完璧です。おそらく、defaultdictのルートを使ってコピーをサポートしています。ありがとう! – Chad

+0

'd.pop(" unloaded_key ")'のデフォルト値を設定できますか? – lerner

+1

@Lerner: 'dict.pop()'はデフォルトの第2引数をとります。 'dict.pop()'はほとんどの他のメソッドと同じように '__missing__'を参照しません。 'dict .__ getitem__'だけが行います(' d [missingkey] ')。 –

関連する問題