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()函数高。
新闻热点
疑难解答