一、简介

  string模块定义了一种新字符串类型Template,它简化了特定的字符串置换操作。

  何谓“简化”?我们可以先想一下我们之前比较常用的有关字符串的“置换”操作有哪些:一种是利用%操作符实现,另外一种是格式化字符串format实现。那么,相比于这两种方法,string.Template究竟简化在何处呢?

  那我们就以下面的代码为例简单说明一下string.Template的用法与上述两种方式的区别:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import stringvalues = {'var':3.3333333}
#1
t1 = string.Template("""
Variable        : $var
Escape          : $$
Variable in text: ${var}iable
""")
print('TEMPLATE:',t1.substitute(values))
print('############################')
#2
s = """
Variable        : %(var)s
Escape          : %%
Variable in text: %(var)siable
"""
print('INTERPOLATION:',s % values)
print('############################')#3
s1 = """
Variable         {var}
Escape          : {{}}
Variable in text: {var}iable
"""
print('FORMAT:',s1.format(**values))

结果如下:

  上面的代码分别利用string.Template方法、%操作符以及format方法进行了字符串的置换操作。这里我们可以看出string.Template是利用$符号进行“关联”,用substitute方法取值的。

  这里直接给出结论:利用string.Template方法是不需要考虑参数的数据类型的!这是string.Template方法与后面两种方法最重要的不同之处。string.Template方法直接将参数转换为字符串格式,然后将转换后的字符串直接插入结果中去。没有可用的格式化选项供我们选择,例如,对于一个浮点数(如上述例子所示)来讲,我们没办法控制代表这个浮点数数值的位数。

  二、safe_substitute方法

  上例中我们利用substitute取值。大家肯定会问了:如果$关联的字符串在前面定义的values中不存在怎么办?难道会报错吗?

  答案是肯定的!为了避免上述问题的产生我们利用safe_substitute方法取值,当然可以跟原生的substitute方法对比一下:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import stringvalues = {'var':'foo'}t = string.Template('$var is here but $missing is not provided')try:print('substitute()     :',t.substitute(values))
except KeyError as err:print('ERROR:',str(err))print('safe_substitute():',t.safe_substitute(values))

  结果如下:

  大家可以看到:values中并没有代表key的字符串'missing',而我们在Template中却试图利用$missing取其对应的值。因此substitute方法会报错,而safe_substitute方法可以巧妙的“避免”这个错误,保证程序的流畅性。

  三、进阶:模块功能的“修改”

  在实际中,大家可能习惯利用%操作符去进行字符串的置换了,那么,如果我们既想利用string.Template方法的便捷性,又想按照自己的意愿与需求定义额外的功能,这就需要我们新定义一个继承自string.Template的类(例如命名为MyTempate),在这里修改其中的某些属性去满足我们的需求。

  下面代码中MyTemplate类继承自string.Template,修改了操作符delimiter与id模式idpattern,实现了利用%关联代表key的字符串,然后利用正则表达式使safe_substitute()只能匹配出带下划线的且由a-z组成的字符串:

# -*- coding: utf-8  -*-
# -*- Author: WangHW -*-
import stringclass MyTemplate(string.Template):#操作符delimiter = '%'#id模式idpattern = '[a-z]+_[a-z]+'if __name__ == '__main__':template_text = '''Delimiter : %%Replaced  : %with_underscoreIgnored   : %notunderscored'''d = {'with_underscore':'replaced','notunderscored':'not replaced'}t = MyTemplate(template_text)print('Modified ID pattern:')print(t.safe_substitute(d))

  结果如下:

  上例中,由于代表key的字符串‘notunderscored’没有下划线,没有匹配到,所以结果中只能得出%notunderscored,不能取到具体的值。

  需要注意的是:这种方法在实际中非常常用!在实际中我们需要根据具体的需求灵活的“更改”模块中某个对象的某个属性去实现具体的需求!

转载于:https://www.cnblogs.com/paulwhw/p/9231884.html

关于string.Template的简单介绍相关推荐

  1. String简单介绍

    Java–String简单介绍 一.String是什么? String 是Java中的字符串类,属于引用类型,底层是char数组. 字符串 是有一个或多个字符组成,用" "双引号包 ...

  2. 【C++】STL——string的简单介绍、string类的访问和遍历、operator[] 、begin+ end begin 、rbegin + rend begin 、范围for

    文章目录 1.string类 1.1string类对象的访问及遍历操作 (1)operator[] (2)begin+ end begin (3)rbegin + rend begin (4)范围fo ...

  3. [C++ STL] 各容器简单介绍

    [C++ STL] 各容器简单介绍 目录 一.什么是STL? 二.容器(Containers) 2.1 vector 2.2 deque 2.3 list 2.4 set 2.5 map 2.6 容器 ...

  4. ES6, Angular,React和ABAP中的String Template(字符串模板)

    String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...

  5. 个人空间的编辑个人资料案例(简单介绍 仅供参考)

    1.本次效果会用  Element UI  Vue脚手架来完成 2.看一下本次的效果展示图:  下面这张是保存后的状态本次主要说上图的效果 3.对用到的组件进行一个简单说明  补充: 上传图片的效果在 ...

  6. Spring boot自定义拦截器和拦截器重定向配置简单介绍~!

    大家好: 本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题. 开发工具:jdk1.8   idea2017(付费版,网上找的破解教程) 1,首先使用idea创建一个Sp ...

  7. TF 在ROS基本作用和简单介绍

    摘自:https://www.cnblogs.com/li-yao7758258/p/7672521.html TF 在ROS基本作用和简单介绍 学之之博未若知之之要知之之要未若行之之实 2019-0 ...

  8. docker简单介绍、安装使用、常用命令、docker构建springboot项目、k8s安装

    docker简单介绍 docker的意义 把事情简单化 Docker友好的基于CLI的工作流使各种技能水平的开发人员都可以访问构建,共享和运行容器化应用程序. 快速移动 从单个软件包安装即可在几分钟内 ...

  9. jinja2简单介绍

    转载自: jinja2模块使用教程 - 迎风而来 - 博客园 模板 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码 ...

最新文章

  1. 为数字资产交易设计安全的钱包架构
  2. web框架flask(12)——国际化和本地化
  3. 高德地图和百度地图接口封装遇到的问题(三):参数集中插入参数以及引用未定义参数
  4. 关于SparkMLlib的基础数据结构Spark-MLlib-Basics
  5. akka应用_处理Akka应用程序中的每个事件
  6. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
  7. 三招提升数据不平衡模型的性能(附python代码)
  8. 算法高级(6)-共识(Raft)算法
  9. 医疗器械信号输入输出部分,以及电气绝缘图,环境试验后的标准
  10. kali linux 密码错误,Kali Linux系统密码BUG解决教程
  11. 麦克风和扬声器选型介绍
  12. 现场总线与计算机网络的最大区别,现场总线与局域网的区别是什么
  13. cocos2dx 通用性能优化方案
  14. big code: Toward Deep Learning Software Repositories [MSR 2015]
  15. 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字
  16. 禁用win10系统的Cortana小娜进程,笔记本散热风扇冷静了
  17. Unity Debug.Log输出带颜色的日志,告别黑白冷色
  18. 长尾理论 推荐系统长尾理论
  19. Revit链接CAD
  20. HTML基础-笔记1标签

热门文章

  1. Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化
  2. 【MongoDB】增删改查基本操作
  3. 【转载】ogre内存管理
  4. 设计模式理解(二)创建型——单例、原型
  5. Linux系列:Ubuntu/fedora实用小技巧—禁止自动锁屏、设置免密码自动登录、免密码执行sudo操作...
  6. Tcpdump使用详解
  7. stm32cubeide ST-LINK_gdbserver _ZTINSt8ios_base7failureB5cxx11E libstdc++.so.6问题解决
  8. Linux下Nginx、MySQL、PHP5、phpMyAdmin安装与配置
  9. 云原生,开发者的黄金时代
  10. 同样是查询语言,它和 SQL 竟然有这么多不同