2017-02-27 104 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)