关于string.Template的简单介绍
一、简介
string模块定义了一种新字符串类型Template,它简化了特定的字符串置换操作。
何谓“简化”?我们可以先想一下我们之前比较常用的有关字符串的“置换”操作有哪些:一种是利用%操作符实现,另外一种是格式化字符串format实现。那么,相比于这两种方法,string.Template究竟简化在何处呢?
那我们就以下面的代码为例简单说明一下string.Template的用法与上述两种方式的区别:
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
import string values = {'var':3.3333333}
#
t1 = string.Template("""
Variable : $var
Escape : $$
Variable in text: ${var}iable
""")
print('TEMPLATE:',t1.substitute(values))
print('############################')
#
s = """
Variable : %(var)s
Escape : %%
Variable in text: %(var)siable
"""
print('INTERPOLATION:',s % values)
print('############################') #
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 string values = {'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 string class MyTemplate(string.Template):
#操作符
delimiter = '%'
#id模式
idpattern = '[a-z]+_[a-z]+' if __name__ == '__main__':
template_text = '''
Delimiter : %%
Replaced : %with_underscore
Ignored : %notunderscored
'''
d = {
'with_underscore':'replaced',
'notunderscored':'not replaced'
} t = MyTemplate(template_text)
print('Modified ID pattern:')
print(t.safe_substitute(d))
结果如下:

上例中,由于代表key的字符串‘notunderscored’没有下划线,没有匹配到,所以结果中只能得出%notunderscored,不能取到具体的值。
需要注意的是:这种方法在实际中非常常用!在实际中我们需要根据具体的需求灵活的“更改”模块中某个对象的某个属性去实现具体的需求!
关于string.Template的简单介绍的更多相关文章
- c++string类的简单介绍
#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...
- Brief introduction to Java String Split 【简单介绍下Java String Split】
Split is a common function in Java. It split a full string to an array based on delimeter. For examp ...
- java中String、StringBuffer和StringBuilder的区别(简单介绍)
简单介绍 java中用于处理字符串常用的有三个类: 1.java.lang.String 2.java.lang.StringBuffer 3.java.lang.StrungBuilder 三者共同 ...
- Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)
Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...
- 简单介绍aspose-words-18.10-jdk16做导出word
今天在搞那个用aspose words for java做导出word的功能,顺便简单介绍这个怎么用,我有两个版本的破解版,就都做简单介绍怎么用 警告:请勿用于商业用途,仅供学习研究使用,如有任何版权 ...
- ES6, Angular,React和ABAP中的String Template(字符串模板)
String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...
- Spring boot自定义拦截器和拦截器重定向配置简单介绍
大家好: 本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题. 开发工具:jdk1.8 idea2017(付费版,网上找的破解教程) 1,首先使用idea创建一个Sp ...
- 自动化工具之Appium工具简单介绍
背景 自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击. 简单介绍 Appium 是一个自动化测试开源工具,支 ...
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
随机推荐
- struts2拦截器执行模拟 参考马士兵老师
public class ActionProxy { public static void main(String[] args) { //模拟ActionProxy调用invoke()方法 Acti ...
- day16 Hbase day17
这个HBase学习了第二遍也不是太透彻PS:启动Hbase之前先启动Zookeeper.HDFS.yarn 1. hbase简介(是基于HDFS.相当于是一个缓存层) 1.1. 什么是hbase(列式 ...
- day 26 网络通讯流程 初识socke
一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...
- windows删除文件或目录CMD命令
rd/s/q 盘符:\某个文件夹 (强制删除文件文件夹和文件夹内所有文件)del/f/s/q 盘符:\文件名 (强制删除文件,文件名必须加文件后缀名)
- 突破本地离线存储的JS库 localforage
localforage 简介 项目地址 https://github.com/localForage/localForage API中文地址 https://localforage.docschina ...
- node api 之:process - 进程
process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程. 因为是全局变量,所以无需使用 require().
- LOJ 2587 「APIO2018」铁人两项——圆方树
题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...
- 9、后记:公司管理经验总结 - CEO之公司管理经验谈
在前期的公司管理经验谈中,笔者已经将相关考虑到的公司经营的问题做了一些思考和总结,希望能够对广大的想自己创业的IT从业者们提供参考. 这里提供一个连接,能够对广大的初期创业者们有个开公司流程的帮助:h ...
- Go hashcode 输入一个字符串,得到一个唯一标识码
如何输入一个字符串,得到一个唯一的hashcode? 例子如下: package main import ( "fmt" "hash/crc32" ) // S ...
- Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(6)
Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis>(6) 1.创建工程与开启GUI 2.调试 查看关于 ...