Python 多层字典的字符串格式化
一种常见的从模板字符串中渲染值的技术看起来是这样的:
>>> num = 7
>>> template = 'there were {num} dwarves'
>>> print template.format(**locals())
there were 7 dwarves
这种方法适用于任何有 __str__
方法的数据类型,比如字典(dict):
>>> data = dict(name='Bob', age=43)
>>> template = 'goofy example 1 {data}'
>>> print template.format(**locals())
goofy example 1 {'age': 43, 'name': 'Bob'}
但是,当通过键引用字典中的某个项时,这种方法就不管用了:
>>> template = 'goofy example 2 {data["name"]}'
>>> print template.format(**locals())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: '"name"'
在格式字符串内,能在外部代码中使用的标识符却不能用,这让人觉得不方便,也有点奇怪。我是不是漏掉了什么?有没有办法解决这个问题?
我希望能够引用嵌套字典结构中几层深的元素,比如 somedict['level1key']['level2key']['level3key']
。到目前为止,我唯一能用的方法就是为了字符串格式化而把这些值复制到一个标量变量里,这样做感觉很麻烦。
1 个回答
3
你可以用 {data[name]}
来代替 {data["name"]}
,这样在字符串中就能使用了。
在格式字符串中,你能指定的内容是有限制的。你不能随便写表达式,键的使用也比较简单,具体的规则可以参考官方文档:
在格式字符串中,不能随便指定字典的键(比如字符串
'10'
或':-]'
)。
在这个例子中,你可以使用你的键,因为它是一个简单的字母数字字符串。但是,正如文档所说的那样,并不是所有情况下都能这样做。如果你的字典键比较奇怪,你可能需要先修改它们,才能在格式字符串中使用,或者可以考虑用其他方法(比如用 +
明确地连接字符串值)。