Python - 字符串作为命名变量格式字符串

时间:2017-02-27 02:10:07

标签: python string google-api string-formatting pagespeed

我在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一起使用,这样我就可以将值字段传递给命名参数。

如果这在某种程度上非常明显,我道歉;我对Python很新,我对这些细节不太了解。我做了尽职调查并在询问之前寻找答案,但我没有找到任何答案,而且这不是一个容易搜索的问题。

修改 我想也许这个'一系列的词汇'谷歌的API或其他东西是常见的,也许有一种自动的方式来关联参数(如string.format_map)。我最后只是以简单的方式做到了,没有string.format

for x in args:
    format = format.replace('{{' + x['key'] + '}}', x['value'])

2 个答案:

答案 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)