首页  >  问答  >  正文

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谁的历史更久? 为什么会出现功能一样的库呢? 是不是一个是另一个的替代品呢?

迷茫迷茫2764 天前921

全部回复(2)我来回复

  • PHPz

    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中是新标准,开发人员应该首先使用它,而不是%,来对字符串进行格式化操作。(format2.6版本加入的方法)

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

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

    原答案:

    Templatestring模块里的类,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

    所以Templateformat

    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中是新标准,开发人员应该首先使用它,而不是%,来对字符串进行格式化操作。(format2.6版本加入的方法)#🎜🎜#
    #🎜🎜#所以题主原问题里提到Templateformat是不是有替代关系,实际情况是,那俩家伙并没有,反而format却真的是%的替代品。#🎜🎜# #🎜🎜#既然官方都这么说了,所以我建议以后涉及到字符串格式化操作的时候,能用format就不要用%了。#🎜🎜#

    原答案:

    #🎜🎜#Templatestring模块里的类,format__buildin__模块里的内建函数,这是两者的根本区别。#🎜🎜# #🎜🎜#既然是类,就可以继承并根据自己的需求重写里面的内容,譬如默认的定界符$,我们就可以修改:#🎜🎜# rrreee #🎜🎜#输出结果:#🎜🎜# rrreee #🎜🎜#同理,我们还可以做更多自己想要的东西,这就是作为类可以做到的“私人订制”。#🎜🎜# #🎜🎜#另外关于format,它的应用范围其实非常广,除了你例子中说到的,我们常用的还有如下一些用法:#🎜🎜# rrreee #🎜🎜#以及非常重要的填充对齐、精度,甚至转化进制:#🎜🎜# rrreee #🎜🎜#所以Templateformat的应用方向也是完全不同的。#🎜🎜#

    回复
    0
  • 巴扎黑

    巴扎黑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()一般用于单行的表达式,使用比较灵活。

    回复
    0
  • 取消回复