扩展 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
)
"""
是否可以扩展 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
)
"""