我在想,如果有使用的优势模板字符串 ,而不是新的先进的字符串格式化 ?
Answer 1:
模板是为了比通常的字符串格式化简单,在表现力的成本。 的理由PEP 292模板进行比较Python的%
样式的字符串格式化:
蟒目前支持基于C的一个字符串替换语法
printf()
“%”格式化字符。 虽然相当丰富,%-formatting代码也容易出错,即使对于有经验的Python程序员。 一个常见的错误就是离开关后格式字符,如s
在%(name)s
。此外,有什么可以遵循%符号的规则是相当复杂的,而一般的应用程序很少需要这种复杂性。 大多数脚本需要做一些字符串插值,而是那些最简单的使用
stringification' formats, ie
%Sor
%(名称)s`这种形式应该更加简单且不易出错。
虽然新.format()
好转的情况下,它仍然是真实的, 格式字符串的语法是相当复杂的,所以基本原理仍然有它的点。
Answer 2:
对于它的价值,从字典模板替换似乎是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倍左右。
Answer 3:
的字符串模板主要优点之一是,你只能代替部分使用的占位符的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
从字符串对象。
Answer 4:
它的主要语法偏好,这通常归结为懒惰/冗长的权衡和熟悉/习惯与现有的字符串模板系统的问题。 在这种情况下模板字符串是比较懒散/简单/快写,而.format()
是更详细和功能全面。
用PHP语言或神社家庭模板系统的程序员可能更喜欢的模板字符串。 使用“%S”位置风格的元组替代可能会吸引那些谁使用printf
式的字符串格式化或想要的东西快。 .format()
有一些更多的功能,但除非你需要特定的东西只有.format()
提供,没有什么错误使用任何现有的方案。
唯一要注意的是,名为string的模板更灵活,更需要比顺序相关的人少维护。 除此之外,这一切都归结到任何个人喜好或你正在从事的项目的编码标准;