Python中的子类化string.Template的示例?

问题描述:

我还没有找到一个很好的例子,在Python中继承了string.Template的子类,尽管我在文档中看到了多个引用。Python中的子类化string.Template的示例?

在网上有没有这样的例子?

我想更改$为不同的字符,也许更改标识符的正则表达式。

+0

请注意,您不应该尝试在Cython中执行此操作。它不起作用。我不确定原因。 – 2009-08-27 00:50:10

蟒蛇docs

高级应用:可以派生模板 子类来定制 占位符语法,分隔 字符,或用于分析模板 串整个正则表达式 。要做到这一点,您可以覆盖这些 类属性:

  • 分隔符 - 这是描述一个占位符 引入分隔符的文本字符串。默认值 值$。请注意,这不应该是 的正则表达式,因为 实现将根据需要在此字符串上调用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。

或者,您可以通过覆盖类属性模式来提供整个正则表达式模式 。如果您这样做,则值 必须是具有四个命名捕获组的正则表达式对象。 的捕获组对应于上面给出的规则,与 沿无效占位符规则:

  • 逃脱 - 该组中的转义序列,例如相匹配$$,采用默认模式。
  • named - 此组匹配未占用的占位符名称;它不应该在捕获组中包含分隔符。
  • braced - 此组匹配大括号括起来的占位符名称;它不应该包含捕获 组中的分隔符或大括号。
  • 无效 - 该组匹配任何其他分隔符模式(通常是单个分隔符),它应该最后出现在常规 表达式中。

实施例:

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-]' 

显然,它也可以只省略任何正则表达式组escapednamedbracedinvalid的禁用它。

+0

你知道这背景是怎么发生的吗?换句话说,如何将delimeter替换为'#'? – slopeofhope 2016-11-10 03:15:30