扩展 Python 模板字符串

Extending the Python Template strings

是否可以扩展 Template strings 以便我可以向标识符添加方法:

默认我可以替换简单变量:

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'

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

本质上,我正在寻找可以在格式化字符串文字 flexibility.[=16= 中提供模板字符串 syntax 的东西]

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

如果您使用的是 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

Genshi 正是这样做的,但它似乎没有使用 built-in string 模块。
其他有用的参考资料是 Chameleon and Mako.

我想自己做,想通了所以来更新我的 google 命中。

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
)
"""