python string模块template_python - string.Template与str.format()为什么同时存在

问 题

这两段代码的效果是一样的:

from string import Template

template = Template('hi, ${name}')

msg = template.substitute(name=u'张三')

print msg

msg = u'hi, {name}'

msg = msg.format(name=u'张三')

print msg

我的问题是, string.Template与str.format谁的历史更久? 为什么会出现功能一样的库呢? 是不是一个是另一个的替代品呢?

解决方案

题主在我的评论里提到%,在str.format()官方文档(str.format - python2)里有这么一段话:

This method of string formatting is the new standard in Python 3, and should be preferred to the % formatting described in String Formatting Operations in new code.

大概意思是说:

这个方法在Python 3中是新标准,开发人员应该首先使用它,而不是%,来对字符串进行格式化操作。(format是2.6版本加入的方法)

所以题主原问题里提到Template和format是不是有替代关系,实际情况是,那俩家伙并没有,反而format却真的是%的替代品。

既然官方都这么说了,所以我建议以后涉及到字符串格式化操作的时候,能用format就不要用%了。

原答案:

Template是string模块里的类,format是__buildin__模块里的内建函数,这是两者的根本区别。

既然是类,就可以继承并根据自己的需求重写里面的内容,譬如默认的定界符$,我们就可以修改:

from string import Template

class MyTemp(Template):

delimiter = '#'

tem = MyTemp('hi, #{name}')

msg = tem.substitute(name='Jake')

print msg

输出结果:

hi, Jake

同理,我们还可以做更多自己想要的东西,这就是作为类可以做到的“私人订制”。

另外关于format,它的应用范围其实非常广,除了你例子中说到的,我们常用的还有如下一些用法:

print 'Hi, {0}, {1}.'.format('Jake', 'Tom')

ppl = ['Jake', 'Tom']

print 'Hi, {0[0]}, {0[1]}.'.format(ppl)

# 输出结果都是 Hi, Jake, Tom.

以及非常重要的填充对齐、精度,甚至转化进制:

print '{:>5}'.format(100)

print '{:x>10}'.format(100)

print '{:.2f}'.format(100.02111)

print '{:b}'.format(15)

# 输出结果:

100

xxxxxxx100

100.02

1111

所以Template和format的应用方向也是完全不同的。

扫一扫关注IT屋

微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值