一、简介

  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的简单介绍的更多相关文章

  1. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

  2. 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 ...

  3. java中String、StringBuffer和StringBuilder的区别(简单介绍)

    简单介绍 java中用于处理字符串常用的有三个类: 1.java.lang.String 2.java.lang.StringBuffer 3.java.lang.StrungBuilder 三者共同 ...

  4. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  5. 简单介绍aspose-words-18.10-jdk16做导出word

    今天在搞那个用aspose words for java做导出word的功能,顺便简单介绍这个怎么用,我有两个版本的破解版,就都做简单介绍怎么用 警告:请勿用于商业用途,仅供学习研究使用,如有任何版权 ...

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

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

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

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

  8. 自动化工具之Appium工具简单介绍

    背景 自动化,性能测试,接口测试,开发平台等工作,到底测试的价值在哪里,其实价值来源不断充实与为大众服务,今天简单介绍ui小工具appium攻击. 简单介绍 Appium 是一个自动化测试开源工具,支 ...

  9. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

随机推荐

  1. 【Hi3516】 uboot下烧写BSP

    setenv serverip xx.xx.xx.xx setenv ipaddr xx.xx.xx.xx setenv ethaddr xx:xx:xx:xx:xx:xx setenv netmas ...

  2. TypeScript 之 函数

    https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Functions.html 为函数定义类型 为函数添加类型: fu ...

  3. 3、Sql-Ora-01033:oracle initialization or shutdown in progress

  4. 维护贴--验证可用--mysql给root开启远程访问权限,修改root密码(转)

    1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问. 这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架 ...

  5. Zookeeper Ha集群简介+jdbcClient访问Ha集群环境

    Hadoop-HA机制HA概述high available(高可用) 所谓HA(high available),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说 ...

  6. MobaXterm的一些介绍(Top 5 SSH Clients for Windows (Alternatives of PuTTY))

    Top 5 SSH Clients for Windows (Alternatives of PuTTY) http://tecadmin.net/top-5-ssh-clients-for-wind ...

  7. RTTI D7

    RTTI需要引用单元TypeInfo 至于RTTI的数据结构,大家可以参考TypeInfo单元的代码 看例子,先为大家介绍一下根据字符串找到属性,并且对其修改的例子 根据属性字符串找到属性,并修改属性 ...

  8. [1] 注解(Annotation)-- 深入理解Java:注解(Annotation)基本概念

    转载 http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html 深入理解Java:注解(Annotation)基本概念 什么是注解(An ...

  9. 分析Ajax请求并抓取今日头条街拍美图

    项目说明 本项目以今日头条为例,通过分析Ajax请求来抓取网页数据. 有些网页请求得到的HTML代码里面并没有我们在浏览器中看到的内容.这是因为这些信息是通过Ajax加载并且通过JavaScript渲 ...

  10. PI Square中文论坛: PI SDK 开发中级篇| PI Square

    注: 为了更好的利用站内资源营造一个更好的中文开发资源空间,本文为转发修正帖,原作者为OSIsoft技术工程师王曦(Xi Wang),原帖地址:PI SDK 中级篇 来源:https://d.gg36 ...