我在Python中使用了Google的PageSpeed Insights API,而且我遇到了一个令人困惑的问题。 API向我提供了格式字符串和该格式字符串的参数,我需要弄清楚如何实际格式化字符串。问题在于论证是以一种非常奇怪的方式给出的。
这就是格式字符串的参数呈现给我的方式(我将其显示为使其更清晰的赋值):
args = [
{
'type': 'INT_LITERAL',
'value': '21',
'key': 'NUM_SCRIPTS'
},
{
'type': 'INT_LITERAL',
'value': '20',
'key': 'NUM_CSS'
}
]
这是一个示例格式字符串,也由API提供给我:
format = 'Your page has {{NUM_SCRIPTS}} blocking script resources and {{NUM_CSS}} blocking CSS resources. This causes a delay in rendering your page.'
我知道有时人们会避免回答问题,而是提供一个适合他们对编码的信念的答案。并且'错误,'所以重申一下,API给出了参数和格式字符串。我不是自己创造它们,所以我不能以更直接的方式做到这一点。
我需要知道的是如何在args列表中提取dicts的关键字段,以便我可以将它们与"".format
一起使用,这样我就可以将值字段传递给命名参数。
修改
我想也许这个'一系列的词汇'谷歌的API或其他东西是常见的,也许有一种自动的方式来关联参数(如string.format_map
)。我最后只是以简单的方式做到了,没有string.format
。
for x in args:
format = format.replace('{{' + x['key'] + '}}', x['value'])
答案 0 :(得分:0)
如果你的格式字符串是这样的:
fmt = 'blah {NUM_SCRIPTS} foo {NUM_CSS} bar'
你有一个名为 args 的键和值字典,然后你可以使用字典格式化字符串,如下所示:
fmt.format(**arg)
这将打印:
"blah 21 foo 20 bar"
答案 1 :(得分:0)
假设您的format
字符串只有一组括号,您可以这样做:
format_dict = {}
for d in args:
format_dict[d['key']] = d['value']
str_to_format = 'Your page has {NUM_SCRIPTS} blocking script resources and {NUM_CSS} blocking CSS resources. This causes a delay in rendering your page.'
formatted = str_to_format.format(**format_dict)
print(formatted)
# Your page has 21 blocking script resources and 20 blocking CSS resources. This causes a delay in rendering your page.
但由于目前正在编写format
(每个替换变量有两个括号),我不确定如何让format()
玩得很好。如果你想在替换变量之后用括号围绕每个替换变量,你需要一个extra set of brackets:
format_dict = {}
for d in args:
format_dict[d['key']] = d['value']
str_to_format = 'Your page has {{{NUM_SCRIPTS}}} blocking script resources and {{{NUM_CSS}}} blocking CSS resources. This causes a delay in rendering your page.'
formatted = str_to_format.format(**format_dict)
print(formatted)
# Your page has {21} blocking script resources and {20} blocking CSS resources. This causes a delay in rendering your page.
因此,根据您的要求,添加或删除一组括号。要添加括号,您可以执行类似这样的操作
import re
str_to_format = re.sub('{{|}}', lambda x: x.group(0) + x.group(0)[0], str_to_format)