这两段代码的效果是一样的:
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谁的历史更久? 为什么会出现功能一样的库呢? 是不是一个是另一个的替代品呢?
PHPz2017-04-18 09:31:24
题主在我的评论里提到%
,在str.format()
官方文档(str.format - python2)里有这么一段话:%
,在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
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__
模块里的内建函数,这是两者的根本区别。#🎜🎜#
#🎜🎜#既然是类,就可以继承并根据自己的需求重写里面的内容,譬如默认的定界符$
,我们就可以修改:#🎜🎜#
rrreee
#🎜🎜#输出结果:#🎜🎜#
rrreee
#🎜🎜#同理,我们还可以做更多自己想要的东西,这就是作为类可以做到的“私人订制”。#🎜🎜#
#🎜🎜#另外关于format
,它的应用范围其实非常广,除了你例子中说到的,我们常用的还有如下一些用法:#🎜🎜#
rrreee
#🎜🎜#以及非常重要的填充对齐、精度,甚至转化进制:#🎜🎜#
rrreee
#🎜🎜#所以Template
和format
的应用方向也是完全不同的。#🎜🎜#巴扎黑2017-04-18 09:31:24
你为什么不诧异为什么sorted函数和list.sort()同时存在呢?
作用类似的函数一般都是针对特殊的应用场景,例如soreted具有返回值而sort直接更改对象。
a = [1,3,2]
b = sorted(a)
b == [1,2,3]
a == [1,3,2]
a.sort()
a == [1,2,3]
对于string.Template 和str.format来说,string.Template如它的名称所述,适用于定义模板,可以延后使用,例如你在一个函数或者包里定义好模板,可以在任意时间方便的调用而不必知道它的细节。而str.format()一般用于单行的表达式,使用比较灵活。