如何在Python中使用字典来使用str.format()函数?

21

这段代码有什么问题?

dic = { 'fruit': 'apple', 'place':'table' }
test = "I have one {fruit} on the {place}.".format(dic)
print(test)

>>> KeyError: 'fruit'

1
可能是https://dev59.com/tG025IYBdhLWcg3whWdm的重复问题。 - Frank
3个回答

42

应该是这样的

test = "I have one {fruit} on the {place}.".format(**dic)

注意 **format() 不接受单个字典,而是关键字参数。


谢谢,它起作用了。你能更新答案并解释为什么我必须在字典前面添加 ** 吗? - bogdan
4
@bogdan,“**”表示将字典扩展为关键字参数列表。format方法不接受字典作为参数,但它可以接受关键字参数。 - Mark Ransom
@bogdan:在我的回答中添加了两个链接。基本原因是“因为文档是这么说的”。 - Sven Marnach
1
@bogdan 这只是告诉Python你正在提供一个字典给函数,以便它可以提供字典中的值,而不是字典本身。当调用任何函数时都可以这样做。如果函数'f'需要参数'a'、'b'和'c',你可以使用dic = {'a':1,'b':2,'c':3}并调用f(**dic) - Michael Smith
4
原因是 "我在{0[place]}上有一个{0[fruit]}。".format(dic) 也可以运行 - 这里的 dic 是第0个位置参数,你可以在模板中访问它的键。 - Jochen Ritzel

11

自Python 3.2开始,就有了 ''.format_map() 函数

test = "I have one {fruit} on the {place}.".format_map(dic)

这样做的好处是它可以接受任何映射,例如一个带有__getitem__方法且能够动态生成值的类或collections.defaultdict,它允许您使用不存在的键。

在旧版本上可以模拟实现:

from string import Formatter

test = Formatter().vformat("I have one {fruit} on the {place}.", (), dic)

1

3
根据 Python 文档,新代码中不应再使用 % 运算符。 - Mark Ransom
请问您能否给我一个参考资料,这样我就可以更深入地了解这个问题了吗? - Artsiom Rudzenka
非常感谢,我会尽量避免以后使用它。 - Artsiom Rudzenka
@Mark:% 在 Python 3.1 中应该被弃用,但他们从未这样做。它不会很快消失(或者可能根本不会消失),所以仍然可以使用它。 - Sven Marnach
@Sven,好的了解,谢谢。不过我还是会先选择format,因为它被推荐使用,其次因为它看起来更简洁。 - Mark Ransom
@MarkRansom 在许多情况下,使用“%”格式是绝对必要的。一个例子是:logging.debug("Message with %(expensive_out)s" % expensive_out=expensive_func()) 如果使用f-string格式,则只会调用expensive_func()以将构造的字符串丢弃(假设已禁用调试日志记录)。 - Ajay M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接