2012-07-24 41 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