Sve*_*ach 20

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

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

此外,可以遵循%符号的规则相当复杂,而通常的应用程序很少需要这样的复杂性.大多数脚本需要进行一些字符串插值,但大多数脚本使用简单的stringification' formats, i.e.%s or%(name)s`这种形式应该更简单,更不容易出错.

虽然新的.format()改进了情况,但格式字符串语法相当复杂仍然是正确的,因此理由仍然有其重点.

  • @ P3trus:基本上,是的.有时,不同的元字符也可能适合不同的情况.比方说,如果你把一段C代码写入一个替换了一些字符串的文件,那么模板字符串可能更好,因为你不需要加倍所有的括号来逃避它们,因为`$`没有任何特殊含义在C. (5认同)
  • 模板字符串可以更安全 https://realpython.com/python-string-formatting/#4-template-strings-standard-library (4认同)
  • 那么字符串模板的唯一优点是它不太复杂? (2认同)

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

  • @sandeep 这不是打字错误。ipython timeit 命令很聪明。它仅根据需要运行尽可能多的循环以获得准确的估计。模板版本慢了大约一个数量级,并且时间相应地需要更少的循环才能达到结果。 (2认同)

bwk*_*bwk 7

字符串模板的一个关键优势是您可以使用该方法仅替换部分占位符.如果占位符未传递值,则普通格式字符串将引发错误.例如: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从该字符串创建一个新对象.

  • 您确定这是优势吗? (2认同)
  • 在想要执行两层模板化的情况下,即想要从另一个模板字符串生成模板字符串并将剩余替换推迟到第二个模板的情况下,这可能是一个优点。我刚刚在代码审查中遇到了这样的情况,有人有理由增量地执行模板替换。 (2认同)
  • **对于使用“{variant_text}_\d{4}”类型语法的模板化正则表达式模式非常有用,因为典型的“str.format()”函数需要“4”的值。这解决了这个问题。如果可以的话我会投 10 票。 (2认同)