2012-03-18 12 views
14

dict.get(key[, default]) में डिफ़ॉल्ट क्यों है जब कुंजी शब्दकोश में है तो मूल्यांकन किया जाता है?dict.get() - डिफ़ॉल्ट तर्क भी सफलता पर मूल्यांकन किया गया

>>> key = 'foo' 
>>> a={} 
>>> b={key:'bar'} 
>>> b.get(key, a[key]) 
Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    b.get(key, a[key]) 
KeyError: 'foo' 

उत्तर

17

किसी भी फ़ंक्शन कॉल के रूप में, कॉल निष्पादित होने से पहले तर्कों का मूल्यांकन किया जाता है।
इस मामले dict.get() में कोई अपवाद नहीं है ...

+2

+1 - की ज़ेन पायथन: "नियमों को तोड़ने के लिए विशेष मामले पर्याप्त नहीं हैं।" पाइथन – Sake

+0

+1 जेन यह स्वीकार्य उत्तर होना चाहिए। – Doboy

+0

के –

3

क्योंकि आप इसे मूल्यांकन कर रहे हैं, तो get लिए एक तर्क के रूप में यह गुजर। यह होता है कि get तर्क का उपयोग कर समाप्त होता है या नहीं।

0
  1. a[key]a['foo'] है और आप a में है कि कुंजी नहीं है।
  2. इस
  3. b.get इसलिए त्रुटि कॉल करने से पहले मूल्यांकन किया जाता है
  4. "कुंजी शब्दकोश में है, भले ही" - कि anot सच है, b रिक्त है (लेकिन 2. अंक है, जैसा कि इस प्रासंगिक नहीं है)
6

आप उदाहरण आप

b.get(key, a.get(key)) 

के रूप में दे दी अपवाद से बचने के लिए पुनर्लेखन कर सकते हैं। यदि कुंजी न तो शब्दकोश में है तो यह None वापस आ जाएगी। आम तौर पर, यदि आप दूसरा तर्क के मूल्यांकन से बचना चाहते हैं, तो आप इस्तेमाल कर सकते हैं

try: 
    x = b[key] 
except KeyError: 
    x = a[key] # or whatever the default value is supposed to be 
5

उपयोग इस बजाय

x = b.get(key) or a.get(key) 

or और and शॉर्ट सर्किट ऑपरेटरों हैं, इसलिए यदि b कुंजी है यह a पर नहीं दिखेगा। लेकिन अगर आपके पास b में falsy मान हैं तो समस्याएं उत्पन्न होंगी। अगर ऐसा है तो आप क्या कर सकते हैं ..

x = b[key] if key in b else b.get(a) 
1

देखने आप कर सकते थे बचने के लिए:

value = b.get(key) 
if value is None: 
    value = a[key] 

या अगर None तो अनुमति दी है:

not_set = object() 
# ... 
value = b.get(key, not_set) 
if value is not_set: 
    value = a[key] 
+0

क्या होगा यदि '# ...' में, उपयोगकर्ता 'b [not_set] = 1' करता है। {trollface} – Doboy

+0

@Doboy: कुछ भी नहीं होता है। 'not_set' एक विशेष मान नहीं है, कुंजी नहीं। – jfs

+0

मेरा मतलब है .. 'बी [1] = not_set' – Doboy

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