模板

字符串模板将作为内置的拼接语法的替代用法。使用Template拼接时,要在名字前加前缀$来标识变量(例如,$var)。或者,如果有必要区分变量和周围的文本,可以用大括号包围变量(例如,${var})。

import string
values = {'var':'foo'}

t = string.Template("""
Variable    : $var
Escape      : $$
Variable in text: ${var}iable
""")

print('TEMPLATE:', t.substitute(values))

s = """
Variable    : %(var)s
Escape      : %%
Variable in text: %(var)siable
"""

print('INTERPOLATION:', s % values)

S = """
Variable    : {var}
Escape      : {{}}
Variable in text: {var}iable
"""

print('FORMAT:', S.format(**values))

___________________输出____________________________
TEMPLATE: 
Variable    : foo
Escape      : $
Variable in text: fooiable
INTERPOLATION: 
Variable    : foo
Escape      : %
Variable in text: fooiable
FORMAT: 
Variable    : foo
Escape      : {}
Variable in text: fooiable

前两种情况中,触发字符($和%)要重复两次来进行转义。在格式化语法中,需要重复{和}来进行转义。模板与字符串拼接或格式化的一个关键区别是,它不考虑参数的类型。值会转为字符串,再将字符串插入结果。这里没有提供格式化选项。例如,没有办法控制使用几位有效数字来表示一个浮点值。

通过safe_substitute()方法可以避免未能向模板提供所需的所有参数值可能产生的异常。

import string

values = {'var' : 'foo'}

t = string.Template('%var is here but %missing is not provided')

try:
    print('substitute()    :', t.substitute(values))
except KeyError as err:
    print('ERROR:', str(err))

print('safe_subtitute():', t.safe_substitute(values))


___________________输出_________________________________
ERROR :'missing'
safe_subtitute(): %var is here but %missing is not provided

由于字典中没有missing的值,所以substitute()会产生一个KeyError异常。safe_substitute()则不同,他不会抛出这个错误,而是会捕获这个错误并保留文本中的变量表达式。

高级模板:

可以调整string.Template在模板体重查找变量名所使用的正则表达式模式,以改变她的默认语法。修改delimiter和idpattern类属性。

import string 

class MyTemplate(string.Template):
    delimiter = '%'
    idpattern = '[a-z]+_[a-z]+'
   
template_text = '''
    Delimiter : %%
    Replaced  : %with_underscore
    Ignored   : %notunderscored
'''

d = {
    'with_underscore': 'replaced',
    'notunderscored' : 'not replaced',
}

t = MyTemplate(template_text)
print('Modified ID pattern')
print(t.safe_subtitute(d))


_______________________输出__________________________
Modified ID pattern

    Delimiter : %
    Replaced  : replaced
    Ignored   : %notunderscored

在上面这个例子中替换规则已经通过正则表达式改变,定界符是%而不是$,而且变量名中间的某个位置必须包含一个下划线。模式%notunderscored不会被替换成任何字符串,因为它不包含下划线符号。

完成更加复杂的修改,可以覆盖pattern属性并定义一个全新的正则表达式。所提供的模式必须包含4个命令组,分别捕获转义定界符、命名变量、加括号的变量名和不合法的定界符模式。

import string

t = string.Template('$var')
print(t.pattern.pattern)

___________________输出_____________________


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

t.pattern为一个已经编译正则表达式,不过可以通过它的pattern属性得到原来的字符串

创建一个新模式的新的模板类型,这里使用{{var}}作为变量语法

import re
import string

class MyTemplate(string.Template):
    delimiter ='{{'
    pattern = r'''
    \{\{(?:
    (?P<escaped>\{\{)|
    (?P<named>[_a-z][_a-z0-9]*)\}\}|
    (?P<braced>[_a-z][_a-z0-9]*)\}\}|
    (?P<invalid>)
    )
    '''

t = MyTemplate('''
{{{{
{{var}}
''')

print('MATCHES:', t.pattern.findall(t.template))
print('SUBSTITUTED:',t.safe_substitute(var='replacement'))

_________________________输出___________________________________
MATCHES: [('{{', '', '', ''), ('', 'var', '', '')]
SUBSTITUTED: 
{{
replacement

 

 posted on 2019-02-02 14:10  CircleYuan  阅读(256)  评论(0编辑  收藏  举报