2012-07-24 45 views

回答

16

模板的意思是比通常的字符串格式更簡單,代價是表現力。的PEP 292的理由模板進行比較Python的%風格的字符串格式化:

的Python目前支持基於 C'S printf()「%」格式化字符的字符串替換語法。儘管相當豐富,但 %格式的代碼也容易出錯,即使對於有經驗的Python程序員也是如此。一個常見的錯誤是將尾部格式字符,例如 s%(name)s

此外,遵循%符號的規則相當複雜,而通常的應用程序很少需要這種複雜性。大多數腳本需要進行一些字符串插值,但大多數腳本使用簡單的stringification' formats, i.e.or%(name)s` 這種形式應該變得更簡單並且不易出錯。

雖然新.format()好轉的情況下,它仍然是真實的,format string syntax是相當複雜的,所以基本原理仍然有它的點。

+0

所以字符串模板的唯一優點是它不那麼複雜? – P3trus 2012-07-24 13:06:09

+5

@ P3trus:基本上,是的。有時候不同的元字符也可能適合不同的情況。如果你將一段C代碼寫入一個替換了一些字符串的文件中,那麼模板字符串可能會更好,因爲你不需要將所有的大括號加倍以避免它們,因爲'$'沒有任何特殊含義在C. – 2012-07-24 13:12:19

2

它主要是語法偏好問題,通常歸結爲現有字符串模板系統的懶惰/冗長折衷和熟悉度/習慣。在這種情況下,模板字符串更懶惰/簡單/快速寫入,而.format()更詳細且功能完備。

用於PHP語言或Jinja系列模板系統的程序員可能更喜歡模板字符串。使用「%s」位置樣式元組替換可能會吸引那些使用類似printf的字符串格式的用戶或想要快速的東西。 .format()有幾個更多的功能,但除非您需要特定的東西,只有.format()提供,使用任何現有的方案沒有任何問題。

唯一需要注意的是命名字符串模板比依賴順序的命名字符串模板更加靈活,所需維護更少。除此之外,這一切都歸結爲個人喜好或您正在進行的項目的編碼標準;

+0

但是可以在'.format'中使用命名的字段。 – P3trus 2012-07-24 13:05:42

+0

@ P3trus你誤會了我。我在說,儘管這兩種方法都提供了有序的*和*命名字段作爲一項功能,但無論您使用的模板API如何,命名字段都可以更靈活更健壯地進行更改。這是對兩種方法共同特徵的價值判斷,而不是方法本身。 – 2012-07-24 15:32:36

+0

我看不到模板的格式要比format()少, 'string.Template('bob is $ age years old')。substitute(age = age)'vs''bob is {age} years old'.format(age)' – danio 2017-02-01 12:20:58

4

字符串模板的一個關鍵優勢是您只能使用safe_substitutemethod替換的一些佔位符。如果佔位符未傳遞值,則正常格式字符串將引發錯誤。例如:

"Hello, {first} {last}".format(first='Joe') 

提出:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'last' 

但是:

from string import Template 
Template("Hello, $first $last").safe_substitute(first='Joe') 

產地:

'Hello, Joe $last' 

注意,返回的值是一個字符串,而不是一個Template;如果您要替換$last,則需要從該字符串中創建一個新的Template對象。

+0

你確定這是一個優勢嗎? – mcepl 2017-11-07 15:56:31

+0

模板(「Hello,$ first $ last」)。safe_substitute(first ='Joe')只產生任何東西。你必須打印它。 :) – Apostolos 2018-01-08 17:59:19

8

對於什麼是值得的,根據模板的長度,字典中的模板替換看起來比格式替換慢4到10倍。下面是我在Python 3.5下運行在2.3 GHz核心i7上的OS X下的一個快速比較。

from string import Template 
lorem = "Lorem ipsum dolor sit amet {GIBBERISH}, consectetur adipiscing elit {DRIVEL}. Expectoque quid ad id, quod quaerebam, respondeas." 
loremtpl = Template("Lorem ipsum dolor sit amet $GIBBERISH, consectetur adipiscing elit $DRIVEL. Expectoque quid ad id, quod quaerebam, respondeas.") 
d = dict(GIBBERISH='FOOBAR', DRIVEL = 'RAXOOP') 

In [29]: timeit lorem.format(**d) 
1.07 µs ± 2.13 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

In [30]: timeit loremtpl.substitute(d) 
8.74 µs ± 12.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

我測試的最糟糕的情況是13字符串慢10倍左右。我測試的最好情況是71000字符串慢4倍左右。

+0

感謝您分享演出成績,這正是我一直在尋找的。 – 2017-08-16 06:46:53