Шаблонные строки — это инструмент, предоставляемый встроенным модулем стандартной библиотеки Python. Чтобы начать с ним работать, вам нужно импортировать класс Template
, так как шаблоны находятся не в основном синтаксисе Python, а в модуле, потому что, они используются не для повседневных задач, а для более конкретных задач. Они имеют довольно ограниченный функционал, но могут быть тонко настроены.
Импорт Template:
from string import Template
Давайте рассмотрим пример работы шаблонных строк:
from string import Template
pattern_string = Template('Лучше поздно, чем $never')
prepared_string = pattern_string.substitute(never='никогда')
print(prepared_string)
Результат:
>>> Лучше поздно, чем никогда
Пояснение:
- Мы импортировали класс
Template
из модуля string. - Определяем шаблон, а за идентификатор, в котором будет подставлено значение вводим как
$never
. - Добавляем к строке метод
sutstitute()
, в который передаем аргумент нашего идентификатора и его строку.
В идентификатор можно передать любой тип данных, при преобразовании он будет приведен к типу строки.
Идентификатор шаблона:
Рассмотрим требования к идентификатору шаблона для построения правильной шаблонной строки:
- Всегда начинается с символа «$»
- Содержит буквы и/или цифры и/или символы подчеркивания. Невозможно начать с числа. Не могут использоваться в идентификаторах шаблонов: кириллица и другие символы, отличные от ASCII.
- Идентификатор считается завершенным, когда встречается первый символ, не соответствующий требованиям предыдущего пункта.
- Идентификатор может быть заключен в фигурные скобки.
Примечание: если вам нужно использовать символ «$» вне идентификатора, вам нужно экранировать, т.е. поставить другой такой же символ впереди, иначе Python вернет исключение:
Неправильно:
from string import Template
pattern_string = Template('Лучше поздно заработать $money$, чем никогда')
prepared_string = pattern_string.substitute(money='1000000')
print(prepared_string)
Ошибка:
>>> Traceback (most recent call last):
>>> ...
>>> raise ValueError('Invalid placeholder in string: line %d, col %d' %
>>> ValueError: Invalid placeholder in string: line 1, col 25
Правильно:
from string import Template
pattern_string = Template('Лучше поздно заработать $money$$, чем никогда')
prepared_string = pattern_string.substitute(money='1000000')
print(prepared_string)
Результат:
>>> Лучше поздно заработать 1000000$, чем никогда
Зачем нам нужна возможность заключать идентификатор в фигурные скобки. Помните: «Идентификатор считается завершенным, когда он находит первый символ, не соответствующий требованиям предыдущего пункта». Этот символ обычно представляет собой пробел.
Предположим, что нам необходимо автоматизировать создание файлов, содержащих коммерческую информацию о продуктах нашей компании. Имена файлов присваиваются по шаблону, включающему код продукта, название и производственную партию, причем все они разделены символом подчеркивания _
. Рассмотрим следующий пример:
from string import Template
filename_temp = Template('$code_$product_$batch.xlsx')
ready_filename = filename_temp.substitute(code='023', product='amazfit_bip_3_pro', batch='bip.023.2022')
print(ready_filename)
Этот код выдаст нам ошибку:
>>> Traceback (most recent call last):
>>> ...
>>> return str(mapping[named])
>>> KeyError: 'code_'
Для решения этой ошибки мы и воспользуемся фигурными скобками:
from string import Template
filename_temp = Template('${code}_${product}_$batch.xlsx')
ready_filename = filename_temp.substitute(code='023', product='amazfit_bip_3_pro', batch='bip.023.2022')
print(ready_filename)
Результат:
>>> 023_amazfit_bip_3_pro_bip.023.2022.xlsx
Теперь шаблон работает корректно! Это потому, что фигурные скобки правильно отделяют наши идентификаторы от символа
О методе substitute()
До сих пор мы использовали этот метод в экземпляре для выполнения подстановки строк. Этот метод заменяет идентификаторы в строке шаблона, используя либо аргументы ключевого слова, либо совпадение, содержащее пары идентификатор-значение - словарь.
from string import Template
template = Template('Hi $name, welcome to $site')
mapping = {'name': 'Vladislav', 'site': 'notehunter.net'}
prepared_string = template.substitute(**mapping)
print(prepared_string)
Примечание: если мы передадим в метод substitute()
меньше значений, чем у нас существует идентификаторов, мы получим ошибку: KeyError: '<name>'