首页 > 开发 > Python > 正文

Python中format_map()函数的使用方法

2023-04-25 12:32:02
字体:
来源:转载
供稿:网友

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()函数中的对齐与宽度问题

Python中的format_map()函数

format_map()函数的语法格式

str.format_map(mapping)

str是包含占位符"{}"字符串对象,mapping是一个词典对象。

该函数执行完后,将会返回一个新字符串,新字符串中把str中所有的keys(键)用其对应的value(值)来替换。

format_map()函数的基本使用方法

下面建立一个词典,并用词典作为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中的输出形式截图如下:

Python中format_map()函数使用案例

词典中的项比格式化串多的情况

如果词典中提供的键值对比实际需要的多会是是什么情况呢,下面通过一个例子来说明这种情况:

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()函数高。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表