Sve*_*ach 20
模板意味着比通常的字符串格式更简单,代价是表达性.PEP 292的基本原理将模板与Python的%字符串格式进行比较:
Python目前支持基于C的
printf()'%'格式化字符的字符串替换语法.虽然相当丰富,但%格式化代码也容易出错,即使对于有经验的Python程序员也是如此.一个常见的错误是不使用尾随格式字符,例如sin%(name)s.此外,可以遵循%符号的规则相当复杂,而通常的应用程序很少需要这样的复杂性.大多数脚本需要进行一些字符串插值,但大多数脚本使用简单的
stringification' formats, i.e.%sor%(name)s`这种形式应该更简单,更不容易出错.
虽然新的.format()改进了情况,但格式字符串语法相当复杂仍然是正确的,因此理由仍然有其重点.
Mik*_*lis 12
对于它的价值,来自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)
Run Code Online (Sandbox Code Playgroud)
我测试的最糟糕的情况是13字符串的速度慢了大约10倍.我测试的最好的情况是71000字符串慢了大约4倍.
字符串模板的一个关键优势是您可以使用该方法仅替换部分占位符.如果占位符未传递值,则普通格式字符串将引发错误.例如:safe_substitute
"Hello, {first} {last}".format(first='Joe')
Run Code Online (Sandbox Code Playgroud)
提出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'last'
Run Code Online (Sandbox Code Playgroud)
但:
from string import Template
Template("Hello, $first $last").safe_substitute(first='Joe')
Run Code Online (Sandbox Code Playgroud)
生产:
'Hello, Joe $last'
Run Code Online (Sandbox Code Playgroud)
请注意,返回的值是字符串,而不是Template; 如果你想替换$last你需要Template从该字符串创建一个新对象.
| 归档时间: |
|
| 查看次数: |
28841 次 |
| 最近记录: |