高级字符串格式与模板字符串

时间:2012-07-24 11:41:32

标签: python string-formatting template-engine

我想知道使用template strings代替新advanced string formatting是否有优势?

4 个答案:

答案 0 :(得分:19)

模板意味着比通常的字符串格式更简单,代价是表现力。 PEP 292的基本原理将模板与Python的% - 样式字符串格式进行比较:

  

Python目前支持基于的字符串替换语法       C的printf()'%'格式化字符。虽然相当丰富,       %-formatting代码也容易出错,即使是       经验丰富的Python程序员。一个常见的错误是离开       尾随格式字符,例如s中的%(name)s

     

此外,%符号后面的规则是公平的       复杂,而通常的应用程序很少需要这样的复杂性。       大多数脚本需要进行一些字符串插值,但大部分都是       那些使用简单的stringification' formats, i.e.%s or%(名称)s`       这种形式应该更简单,更不容易出错。

虽然新的.format()改善了这种情况,但format string syntax仍然相当复杂,所以基本原理仍有其优点。

答案 1 :(得分:10)

对于它的价值,来自dict的模板替换似乎比格式替换慢4到10倍,具体取决于模板的长度。这是我在OS X上使用Python 3.5在2.3 GHz核心i7上运行的快速比较。

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倍。

答案 2 :(得分:6)

字符串模板的一个主要优点是,您只能使用safe_substitute method替换占位符的部分。如果占位符未传递值,则普通格式字符串将引发错误。例如:

"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对象。

答案 3 :(得分:2)

它主要是语法偏好问题,通常归结为现有字符串模板系统的懒惰/冗长权衡和熟悉/习惯。在这种情况下,模板字符串更加懒惰/简单/快速编写,而.format()更冗长,功能更丰富。

习惯于PHP语言或Jinja系列模板系统的程序员可能更喜欢模板字符串。使用“%s”位置样式元组替换可能会吸引那些使用printf的人 - 比如字符串格式或想要快速的东西。 .format()还有一些功能,但除非您需要仅.format()提供的特定内容,否则使用任何现有方案都没有错。

唯一需要注意的是,命名字符串模板比依赖顺序的字符串模板更灵活,所需维护更少。除此之外,这一切都归结为个人偏好或您正在进行的项目的编码标准;