我还没有找到一个在python中对string.template进行子类化的好例子,尽管我在文档中看到过多次这样做的引用。
在网上有这样的例子吗?
我想将$更改为不同的字符,并可能更改标识符的regex。

最佳答案

来自pythondocs
高级用法:可以派生
要自定义的模板子类
占位符语法,分隔符
字符或整个规则
用于分析模板的表达式
串。要执行此操作,可以重写
这些类属性:
分隔符–这是描述占位符的文本字符串
引入分隔符。违约
价值美元。注意这不应该是
正则表达式,如
实现将调用re.escape()。
根据需要在此字符串上。
idpattern–这是描述
无支撑的占位符(大括号
将自动添加为
适当)。默认值是
正则表达式[_a-z][_a-z0-9]*。
例子:

from string import Template

class MyTemplate(Template):
    delimiter = '#'
    idpattern = r'[a-z][_a-z0-9]*'

>>> s = MyTemplate('#who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes $what'

在python 3中:
3.2版新增。
或者,您可以提供整个正则表达式模式
通过重写类属性模式。如果你这样做,价值
必须是具有四个命名捕获组的正则表达式对象。
捕获组与上面给出的规则以及
无效的占位符规则:
转义–此组与默认模式中的转义序列(如$$)匹配。
命名–此组与无标记的占位符名称匹配;它不应在捕获组中包含分隔符。
BRACKED–此组与大括号内的占位符名称匹配;它不应在捕获中包含分隔符或大括号。
组。
无效–此组与任何其他分隔符模式(通常为单个分隔符)匹配,并且应在常规中最后出现
表达式。
例子:
from string import Template
import re

class TemplateClone(Template):
    delimiter = '$'
    pattern = r'''
    \$(?:
      (?P<escaped>\$) |   # Escape sequence of two delimiters
      (?P<named>[_a-z][_a-z0-9]*)      |   # delimiter and a Python identifier
      {(?P<braced>[_a-z][_a-z0-9]*)}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
    '''

class TemplateAlternative(Template):
    delimiter = '[-'
    pattern = r'''
    \[-(?:
       (?P<escaped>-) |            # Expression [-- will become [-
       (?P<named>[^\[\]\n-]+)-\] | # -, [, ], and \n can't be used in names
       \b\B(?P<braced>) |          # Braced names disabled
       (?P<invalid>)               #
    )
    '''

>>> t = TemplateClone("$hi sir")
>>> t.substitute({"hi": "hello"})
'hello sir'

>>> ta = TemplateAlternative("[-hi-] sir")
>>> ta.substitute({"hi": "have a nice day"})
'have a nice day sir'
>>> ta = TemplateAlternative("[--[-hi-]-]")
>>> ta.substitute({"hi": "have a nice day"})
'[-have a nice day-]'

显然,也可以省略任何regex组来禁用它。

关于python - 在Python中继承string.Template的示例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1336786/

10-12 21:16