2013-12-16 26 views
6

के साथ स्ट्रिंग प्रारूप क्या स्ट्रिंग के साथ स्ट्रिंग को प्रारूपित करने का कोई तरीका है लेकिन वैकल्पिक रूप से महत्वपूर्ण त्रुटियों के बिना?वैकल्पिक dict key-value

यह ठीक काम करता है:

opening_line = '%(greetings)s %(name)s !!!' 
opening_line % {'greetings': 'hello', 'name': 'john'} 

लेकिन मान लीजिए कि मैं नाम पता नहीं है, और मैं केवल 'greetings' के लिए लाइन ऊपर फ़ॉर्मेट करने के लिए करना चाहते हैं। कुछ की तरह,

opening_line % {'greetings': 'hello'} 

आउटपुट ठीक होगा, भले ही:

'hii %(name)s !!!' # keeping name un-formatted 

लेकिन इस KeyError देता है, जबकि

वहाँ कोई तरीका है खोल?

+0

** यह भी देखें: ** [py str.fo रैमेट गुम मूल्य] (https://stackoverflow.com/questions/20248355/how-to-get-python-to-gracefully-format-none-and-non-existing-fields) – dreftymac

उत्तर

10

defaultdict का उपयोग करें, यह आपको कुंजी के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करने की अनुमति देगा जो शब्दकोश में मौजूद नहीं है। उदाहरण के लिए:

>>> from collections import defaultdict 
>>> d = defaultdict(lambda: 'UNKNOWN') 
>>> d.update({'greetings': 'hello'}) 
>>> '%(greetings)s %(name)s !!!' % d 
'hello UNKNOWN !!!' 
>>> 
+5

ध्यान दें कि यह काम नहीं करेगा 'str.format'। – jonrsharpe

2

defaultDict करने के लिए कुछ विकल्पों,

greeting_dict = {'greetings': 'hello'} 

if 'name' in greeting_dict : 
    opening_line = '{greetings} {name}'.format(**greeting_dict) 
else: 
    opening_line = '{greetings}'.format(**greeting_dict) 

print opening_line 

हो सकता है कि और भी अधिक संक्षेप, उपयोग शब्दकोश

'{greetings} {name}'.format(greetings=greeting_dict.get('greetings','hi'), 
          name=greeting_dict.get('name','')) 
+0

मैं 'if/else' और इसके बजाय, 'fmt =' {greetings} {name} 'में सामान्यता निकालता हूं, अगर' name 'ग्रीटिंग_डिक्ट और {ग्रीटिंग्स}' में होता है; प्रिंट (fmt.format (** greeting_dict)) '। –

1

रिकॉर्ड के लिए पैरामीटर डिफ़ॉल्ट प्रति स्थापित करने के लिए, मिलती है:

info = { 
    'greetings':'DEFAULT', 
    'name':'DEFAULT', 
    } 
opening_line = '{greetings} {name} !!!' 

info['greetings'] = 'Hii' 
print opening_line.format(**info) 
# Hii DEFAULT !!!