Formato de cadena con valor-clave dict opcional

¿Hay alguna forma de formatear la cadena con dict pero opcionalmente sin errores clave?

Esto funciona bien:

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

Pero digamos que no conozco el nombre, y me gustaría formatear la línea superior solo para 'greetings' . Algo como,

  opening_line % {'greetings': 'hello'} 

La salida estaría bien incluso si:

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

Pero esto le da a KeyError al desempaquetar

¿Hay alguna manera?

Use defaultdict , esto le permitirá especificar un valor predeterminado para las claves que no existen en el diccionario. Por ejemplo:

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

Algunas alternativas a 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 

Tal vez aún más sucintamente, use el diccionario para establecer los valores predeterminados de cada parámetro,

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

Para el registro:

 info = { 'greetings':'DEFAULT', 'name':'DEFAULT', } opening_line = '{greetings} {name} !!!' info['greetings'] = 'Hii' print opening_line.format(**info) # Hii DEFAULT !!!