Введение
Строковый модуль имеет класс 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 поднят, последующие 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. Итак, каков был бы правильный подход к этой проблеме?