Подстановки строк с использованием шаблонов в Python
Строковый модуль имеет класс 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
The Problem
Учитывая строку шаблона и сопоставление, я хочу определить, будут ли заменены все заполнители в шаблоне. Для этого я бы попытался сделать замену и перехватить любое исключение 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
но яdon't care о ValueErrors. Итак, каков будет правильный подход к этой проблеме?