当前位置: 首页 > 科技观察

每日一技能:StringFormat忽略缺失字段

时间:2023-03-19 02:18:14 科技观察

在一些大型项目的开发中,我们需要创建很多字符串模板,然后在需要的时候填写相应的信息。例如:template_1='缺少参数:{field_name}'template_2='网页请求失败,url:{url},状态码:{status},返回信息:{resp}'template_3='其他未知错误:{e}'当我们在代码中遇到异常时,以字典的形式返回格式化字符串所需的字段,然后将错误信息组装到一个特殊的函数中,例如:defmake_request(url):resp=requests.get(url)ifresp.status!=200:err_msg_field={'url':url,'status':status,'resp':resp.text}raiseRequestFail(err_msg_field=err_msg_field)returnresp.json()尝试:result=make_request(url)exceptRequestFailase:msg=template_2.format(**e.err_msg_field)...使用日志或其他方法输出错误信息...exceptExceptionase:msg=template_3.format(e=e)但是.format有一个问题:参数中的字段可以比字符串实际需要的多,但不能少。例如:也可以直接使用字典传入:如果字符串模板中需要一个key,但是.format传入的参数没有这个key,代码会报错。当项目代码变大时,传入的字典很容易缺值。有没有办法让Python在遇到.format参数缺失值时自动忽略它?如果使用Python3,可以使用.format_map配合defaultdict来实现:fromcollectionsimportdefaultdicttemplate_2='网页请求失败,url:{url},状态码:{status},返回信息:{resp}'data=defaultdict(str,{'url':'https://www.kingname.info','status':500})msg=template_2.format_map(data)print(msg)运行效果如下图所示:如果你使用的是Python2,那么你可以这样写:fromcollectionsimportdefaultdictimportstringstring.Formatter().vformattemplate_2='网页请求失败,url:{url},状态码:{status},返回信息:{resp}'data=defaultdict(str,{'url':'https://www.kingname.info','status':500})msg=string.Formatter().vformat(template_2,(),data)打印msg运行效果如下图所示:本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。