Python中format_map(mapping)函數的作用與str.format(**mapping)類似,不過,format_map()函數中的mapping可以直接使用詞典,而不必再加“**”來解析詞典,在"{}"占位符中可以直接使用鍵名稱,不必使用詞典的變量來訪問。
Python中的format_map()函數是在3.2版中新增的函數,讀者在使用該函數時要注意所使用的Python版本。
關于Python中format()函數的使用方法,讀者可以參見以下三篇文章:
(1)Python中使用format()函數格式化字符串
(2)Python中使用format()函數對數字進行格式化
(3)Python中format()函數中的對齊與寬度問題
str.format_map(mapping)
str是包含占位符"{}"字符串對象,mapping是一個詞典對象。
該函數執行完后,將會返回一個新字符串,新字符串中把str中所有的keys(鍵)用其對應的value(值)來替換。
下面建立一個詞典,并用詞典作為format_map()函數的參數,來觀察該函數的具體使用方法:
dict1 = {"site_name":"武林網VEVB","site_url":"VeVb.com",
"subscription":"優雅的代碼"}
str_source = "{site_name}的網址是:{site_url},公眾號是:{subscription}"
str_result = str_source.format_map(dict1)
print(str_result)
輸出結果:
武林網VEVB的網址是:VeVb.com,公眾號是:優雅的代碼
在Python 3.8.2中的輸出形式截圖如下:
如果詞典中提供的鍵值對比實際需要的多會是是什么情況呢,下面通過一個例子來說明這種情況:
dict2 = {"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我當前在學{lang2}和{lang3}".format_map(dict2))
輸出結果如下:
我當前在學C#和Python
從實際情況看,詞典中的鍵值對多于使用情況并不影響實際的輸出,也不會產生任何異常,其在詞典中搜索鍵名并把對應的值替換鍵名處的值即可,不會產生任何問題。
如果詞典中未包含使用的鍵會怎么樣呢?下面這個例子將告訴你這種情況下的輸出信息:
dict3 = {"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我喜歡{lang4}".format_map(dict3))
輸出結果如下:
Traceback (most recent call last):
File "D:/PY/format_map.py", line 2, in <module>
print("我喜歡{lang4}".format_map(dict3))
KeyError: 'lang4'
從輸出結果可以看出,程序產生 KeyError 異常,即詞典dict3中并不包含鍵"lang4"。
也就是說,在正常情況下,詞典中若未定義某個鍵,而在格式字符串中使用了將會引發程序異常。
為了較好地解決上面這個問題,可以定義一個類和__missing__函數來處理:
class DealMissingValue(dict):
def __missing__(self, key):
return None
dict4 ={"lang1":"Java","lang2":"C#","lang3":"Python"}
print("我喜歡{lang4}".format_map(DealMissingValue(dict4)))
輸出結果
我喜歡None
可以看出,在使用__missing__函數處理后,可以在未找到對應的鍵值時,按照函數的返回值,將以None來替代。
在使用詞典作為映射關系來格式化字符串時,format_map函數是非常有用的,它不像format()函數那樣建立詞典的副本來進行操作,從某種程度上來講,在使用詞典作為參數時,其效率要比format()函數高。
新聞熱點
疑難解答