2013-12-16 15 views
6

Gibt es eine Möglichkeit, Zeichenkette mit dict aber optional ohne Schlüsselfehler zu formatieren?Zeichenkettenformat mit optionalem dict-Schlüsselwert

Dies funktioniert:

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

Aber lassen Sie uns sagen, dass ich den Namen nicht kennen, und ich würde für 'greetings' nur über der Linie zu formatieren möchten.

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

Aber das gibt KeyError während

Auspacken Gibt es eine Möglichkeit: So etwas wie,

opening_line % {'greetings': 'hello'} 

Ausgang würde, selbst wenn in Ordnung sein?

+0

** Siehe auch: ** [py str.fo rmat fehlende Werte] (https://stackoverflow.com/questions/20248355/how-to-get-python-to-gracefully-format-none-and-none-existing-fields) – dreftymac

Antwort

10

Verwenden Sie defaultdict, damit Sie einen Standardwert für Schlüssel angeben können, die nicht im Wörterbuch vorhanden sind. Zum Beispiel:

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

Beachten Sie, dass dies nicht funktioniert 'str.format'. – jonrsharpe

2

Einige Alternativen zu 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 

Vielleicht noch kurz und bündig, erhalten Verwendung Wörterbuch pro Parameter standardmäßig eingestellt,

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

Ich würde die Gemeinsamkeit in 'if/else' extrahieren und stattdessen' fmt = '{grusses} {name}' falls 'name' in gruss_dict else '{gr}}; print (fmt.format (** gruß_dict)) '. –

1

Für das Protokoll:

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

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