57

我想知道使用模板字符串而不是新的高级字符串格式是否有优势?

4

4 回答 4

25

模板旨在比通常的字符串格式更简单,但以牺牲表现力为代价。PEP 292的基本原理是将模板与 Python 的%-style 字符串格式进行比较:

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

此外,% 符号后面的规则相当复杂,而通常的应用程序很少需要这种复杂性。大多数脚本需要做一些字符串插值,但大多数都使用简单的“字符串化”格式,即%s%(name)s 这种形式应该更简单,更不容易出错。

虽然新的.format()改进了这种情况,但格式字符串语法仍然相当复杂,所以基本原理仍然有其要点。

于 2012-07-24T12:02:33.773 回答
20

字符串模板的一个关键优势是您可以使用该方法仅替换一些占位符。如果未向占位符传递值,普通格式字符串将引发错误。例如:safe_substitute

"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从该字符串创建一个新对象。

于 2017-04-10T23:11:58.193 回答
16

就其价值而言,从 dict 进行模板替换似乎比格式替换慢 4 到 10 倍,具体取决于模板的长度。这是我在 OS X 上运行的 2.3 GHz 内核 i7 和 Python 3.5 的快速比较。

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

于 2017-07-01T19:31:36.340 回答
3

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

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

唯一需要注意的是,命名字符串模板比顺序相关模板更灵活且需要更少的维护。除此之外,这一切都取决于个人喜好或您正在从事的项目的编码标准;

于 2012-07-24T12:04:01.013 回答