介绍
string 模块有一个 Template 类,它允许您使用映射对象在字符串中进行替换,例如:
>>> string.Template('var is $var').substitute({'var': 1})
'var is 1'
如果尝试替换映射中缺少的元素,则替换方法可能会引发 KeyError 异常,例如
>>> string.Template('var is $var and foo is $foo').substitute({'var': 1})
KeyError: 'foo'
或者如果模板字符串无效,则可能引发 ValueError,例如它包含一个$
字符后跟一个空格:
>>> string.Template('$ var is $var').substitute({'var': 1})
ValueError: Invalid placeholder in string: line 1, col 1
问题
给定一个模板字符串和一个映射,我想确定模板中的所有占位符是否都将被替换。为此,我会尝试进行替换并捕获任何 KeyError 异常:
def check_substitution(template, mapping):
try:
string.Template(template).substitute(mapping)
except KeyError:
return False
except ValueError:
pass
return True
但这不起作用,因为如果模板无效并且引发了 ValueError,则不会捕获后续的 KeyError:
>>> check_substitution('var is $var and foo is $foo', {'var': 1})
False
>>> check_substitution('$ var is $var and foo is $foo', {'var': 1})
True
但我不关心ValueErrors。那么,解决这个问题的正确方法是什么?