先进的字符串格式化VS模板字符串(advanced string formatting vs tem

2019-07-30 14:13发布

我在想,如果有使用的优势模板字符串 ,而不是新的先进的字符串格式化 ?

Answer 1:

模板是为了比通常的字符串格式化简单,在表现力的成本。 的理由PEP 292模板进行比较Python的%样式的字符串格式化:

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

此外,有什么可以遵循%符号的规则是相当复杂的,而一般的应用程序很少需要这种复杂性。 大多数脚本需要做一些字符串插值,而是那些最简单的使用stringification' formats, ie %S or %(名称)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的模板更灵活,更需要比顺序相关的人少维护。 除此之外,这一切都归结到任何个人喜好或你正在从事的项目的编码标准;



文章来源: advanced string formatting vs template strings