2013-07-30 6 views
13

नहीं डालता है तो defaultdict documentation का उल्लेख है कि, यदि कोई आइटम गुम है, तो default_factory द्वारा लौटाया गया मान "कुंजी के लिए शब्दकोश में डाला गया है, और लौटाया गया है।" यह सबसे अच्छा समय है, लेकिन मैं वास्तव में इस मामले में जो चाहता हूं वह मूल्य लौटाया जा सकता है लेकिन डिफ़ॉल्ट डिक्शनरी में डाला गया है।पायथन डिफॉल्टडिक्ट जो अनुपलब्ध मान

मुझे लगा कि मैं शायद डिफॉल्ट डिक्ट और ओवरराइड कर सकता हूं ... मुझे लगता है कि __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

यह सही है। प्रतिलिपि समर्थन प्राप्त करने के लिए मैं शायद डिफ़ॉल्ट डिक्ट रूट के साथ जाऊंगा। धन्यवाद! – Chad

+0

क्या मैं 'd.pop (" unloaded_key ") के लिए डिफ़ॉल्ट मान सेट कर सकता हूं? – lerner

+1

@Lerner: 'dict.pop() 'डिफ़ॉल्ट के लिए दूसरा तर्क लेता है। 'dict.pop()' * * * __missing__' से परामर्श नहीं करेगा, जैसा कि अधिकांश अन्य तरीकों से है; केवल 'dict .__ getitem__' करता है (इसलिए' d [missingkey] ')। –

संबंधित मुद्दे