【发布时间】:2012-09-27 21:35:54
【问题描述】:
简介
字符串模块有一个模板类,它允许您使用映射对象在字符串中进行替换,例如:
>>> 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,则不会捕获后续的 KeyErrors:
>>> 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。那么,解决这个问题的正确方法是什么?
【问题讨论】:
-
模板有一个
safe_substitute方法,它忽略任何 ValueError 并继续进行替换。问题是它也忽略了 KeyErrors。 -
可能的
ValueError案例都与非法使用$字符有关,对吧?那么为什么不对字符串做一些预处理来避免非法使用$呢? -
@PedroRomano 这可行,但需要找出所有触发
ValueError的情况。