2017-02-27 78 views
1

我在Python中使用Google的PageSpeed Insights API,并且遇到了一个令人困惑的问题。 API向我呈现格式字符串和该格式字符串的参数,我需要弄清楚如何实际格式化字符串。问题在于争论是以非常奇怪的方式给出的。Python - 字符串作为命名变量格式字符串的关键字

这是怎样的参数格式字符串提交给我(我展示它作为一个任务,使其更清晰):

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列表中的字典的关键字段,以便我可以以允许将值字段传递给命名参数的方式与"".format一起使用它们。

我很抱歉,如果这在某种程度上是非常明显的;我对Python相当陌生,对于小细节我不太了解。我确实尽了我的尽职调查并在询问之前寻找答案,但我没有发现任何问题,也不是一个容易搜索的问题。

编辑: 我想,也许这件事情“的类型的字典列表”是司空见惯的与谷歌的API或什么的,也许还有的论据(如string.format_map)关联自动方式。我以最简单的方式完成了这个任务,没有string.format

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

这是你想要的吗?对于NUM_CSS'(args中item的项目如果item [“key”] ==“NUM_CSS”)。next()['value']'和NUM_SCRIPTS'(args中item的项目,如果item [“key”] = =“NUM_SCRIPTS”)。next()['value']' – Rohanil

+0

坦率地说,这个清单是无稽之谈。你的目标是查找'NUM_SCRIPTS'和'NUM_CSS'的值,但是该列表只允许你搜索某个键的值,而某个键与另一个键有不同的键值。它应该是'args = {'NUM_SCRIPTS':21,'NUM_CSS':20}'甚至可以在没有大量错误代码的情况下远程使用。 – TigerhawkT3

+0

@Rohanil - 不,不同的格式字符串有不同的类型和数量的变量,我不能硬编码名称。 – bpunsky

回答

0

如果你的格式字符串像这样:

fmt = 'blah {NUM_SCRIPTS} foo {NUM_CSS} bar' 

而且你叫ARGS键和值的字典,那么你可以使用字典作为这样格式化字符串:

fmt.format(**arg) 

这将打印:

"blah 21 foo 20 bar" 
+0

除了值存储在列表中的单独字符串中,不一定是有序的,所以我需要以某种方式使用每个字典的关键字段将其与命名参数相关联。 – bpunsky

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)