【问题标题】:Example of subclassing string.Template in Python?在 Python 中子类化 string.Template 的示例?
【发布时间】:2009-08-26 18:54:53
【问题描述】:

我一直无法找到在 Python 中对 string.Template 进行子类化的好示例,尽管我在文档中看到了多个这样做的参考。

网络上有这样的例子吗?

我想将 $ 更改为不同的字符,并可能更改标识符的正则表达式。

【问题讨论】:

  • 请注意,您不应尝试在 Cython 中执行此操作。它不起作用。我不确定原因。

标签: python stringtemplate


【解决方案1】:

来自pythondocs

高级用法:可以派生 要自定义的模板的子类 占位符语法,分隔符 字符,或整个正则 用于解析模板的表达式 字符串。为此,您可以覆盖 这些类属性:

  • delimiter – 这是描述占位符的文字字符串 引入分隔符。默认 价值$。请注意,这不应该是 一个正则表达式,作为 实现将调用 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 版中的新功能。

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

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

例子:

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 来禁用它。

【讨论】:

  • 你知道这在后台是怎么发生的吗?换句话说,分隔符如何替换为“#”?
  • @slopeofhope 这对我来说听起来像是一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多