搜尋

首頁  >  問答  >  主體

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

迷茫迷茫2803 天前957

全部回覆(2)我來回復

  • PHPz

    PHPz2017-04-18 09:31:24

    題主在我的評論裡提到%,在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

    所以TemplateTemplateformat的應用方向也是完全不同的。

    回覆
    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
  • 取消回覆