2

是否可以扩展模板字符串,以便我可以向标识符添加方法:

默认情况下,我可以替换简单的变量:

from string import Template
t = Template("${noun}ification")
t.substitute(dict(noun='Egg'))  # Output: 'Eggification'

但我希望使用自定义方法(例如as_b)扩展标识符:

t = Template("${noun.as_b}ification")  # Desired output: '<b>Egg</b>ification'

我知道我可以轻松地使用格式化字符串文字做类似的事情,但是否可以使用模板字符串,就像上面一样?我不能使用格式化字符串文字,因为它不能在脚本、JSON 文件或任何包含花括号的文本中工作。

本质上,我正在寻找可以在格式化字符串文字灵活性中提供模板字符串语法的东西。

4

3 回答 3

2

不是直接的答案,但我建议不要使用模板字符串。

如果您使用的是 Python 3.6 或更新版本,请使用 f-strings:

def bold(t):
    return f"<b>{t}</b>"

noun = 'Egg'

print(f"{bold(noun)}ification")

运行时:

<b>Egg</b>ification

如果你更喜欢更强大的模板机制,我强烈推荐Jinja2

于 2017-12-12T13:14:26.440 回答
0

想自己做这个,想通了所以来更新我的谷歌命中。

from string import Template
class MyTemplate(Template):
    idpattern = r'(?a:[_a-z][_.a-z0-9]*)'
    
s = MyTemplate("$myvar $my.var and ${myvar} and ${my.var}")
s.safe_substitute({'myvar': 'aaaa', 'my.var': 'bbbb'})

结果:

'aaaa bbbb and aaaa and bbbb'

其他覆盖选项为delimiter( $) 或braceidpattern( None) 或pattern

pattern = fr"""
{delim}(?:
  (?P<escaped>{delim})  |   # Escape sequence of two delimiters
  (?P<named>{id})       |   # delimiter and a Python identifier
  {{(?P<braced>{bid})}} |   # delimiter and a braced identifier
  (?P<invalid>)             # Other ill-formed delimiter exprs
)
"""
于 2021-08-20T18:16:07.417 回答
-1

Genshi正是这样做的,但它似乎没有使用内置string模块。
其他有用的参考资料是ChameleonMako

于 2018-03-19T00:03:42.687 回答