2013-12-16 49 views
6

有没有什么方法可以用字典格式化字符串,但可以选择没有键错误?带可选字典键值的字符串格式

这工作得很好:

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 rmat缺少值](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'中提取了通用性,而在greeting_dict else'{greetings}'中如果'name',则提取'fmt ='{greetings} {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 !!!