带有可选dict键值的字符串格式

时间:2013-12-16 10:24:38

标签: python string-formatting

有没有办法用dict格式化字符串,但可选择没有键错误?

这很好用:

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

有什么办法吗?

5 个答案:

答案 0 :(得分:10)

使用defaultdict,这将允许您为字典中不存在的键指定默认值。例如:

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

答案 1 :(得分: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',''))

答案 2 :(得分:1)

记录:

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

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

答案 3 :(得分:0)

我遇到了与您相同的问题,因此决定创建一个图书馆来解决此问题:pyformatting
这是pyformatting问题的解决方案:

newCourse.setCategory(body.categories)

唯一的问题是pyformatting不支持python2。pyformatting支持python 3.1+ 如果我对需要2.7支持有任何反馈,我想我会添加该支持。

答案 4 :(得分:0)

您可以继承UserDict并根据自己的喜好使用__missing__自定义.format_map()

from collections import UserDict


class FormatMapper(UserDict):
    def __missing__(self, key):
        return f'{key=} is MISSING'


info = FormatMapper({'greetings': 'hello', 'not_name': 'john'})
opening_line = '{greetings}  {name} !!!'

print(opening_line.format_map(info))

输出:

hello  key='name' is MISSING !!!