由于Python 3.0和3.1是EOL'ed的,没有人使用它们,你可以并且应该使用str.format_map(mapping) (Python 3.2+):
类似于str.format(**mapping),只不过映射是直接使用的,而不是复制到字典中。例如,如果mapping是dict子类,这就很有用。
这意味着你可以使用一个defaultdict,它会为缺少的键设置(并返回)一个默认值:
>>> from collections import defaultdict
>>> vals = defaultdict(lambda: '<unset>', {'bar': 'baz'})
>>> 'foo is {foo} and bar is {bar}'.format_map(vals)
'foo is <unset> and bar is baz'
即使提供的映射是字典,而不是子类,这可能仍然会稍微快一些。
不过,考虑到这一点,差异并不大
>>> d = dict(foo='x', bar='y', baz='z')
然后
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)
大约10 ns(2%)比
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)
我的Python 3.4.3。当字典中有更多键时,差异可能会更大
注意,格式语言比这灵活得多;它们可以包含索引表达式,属性访问等等,所以你可以格式化整个对象,或者其中的两个:
>>> p1 = {'latitude':41.123,'longitude':71.091}
>>> p2 = {'latitude':56.456,'longitude':23.456}
>>> '{0[latitude]} {0[longitude]} - {1[latitude]} {1[longitude]}'.format(p1, p2)
'41.123 71.091 - 56.456 23.456'
从3.6开始,你也可以使用插值字符串:
>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'
您只需要记住在嵌套的引号中使用其他引号字符。这种方法的另一个优点是它比调用格式化方法快得多。