Вот решение, в котором используется «словарь по умолчанию» (defaultdict
):
from collections import defaultdict
from string import Template
import uuid
def gen_uuid():
return str(uuid.uuid4())
s = """
insert ... values('foo', ${foo_uuid});
insert ... values('bar', ${bar_uuid});
insert ... values('baz', ${baz_uuid});
"""
mappings = defaultdict(gen_uid)
template = Template(s)
print template.safe_substitute(mappings)
Результат будет примерно таким:
insert ... values('foo', aedd5fb6-40da-45bd-bcf7-c7390ef8f13e);
insert ... values('bar', c7ea3090-2a0f-49aa-ace9-c5ef67b7888b);
insert ... values('baz', bf2d86b7-c13e-4498-8d4a-27e76c2e72ab);
A defaultdict
создается с одним аргументом, заводской функцией.Каждый раз, когда неизвестный ключ ищется в словаре по умолчанию, он вызывает эту функцию, связывает это значение с ключом, а затем возвращает ключ.Таким образом, каждой переменной будет назначен новый UUID.
Основным недостатком является то, что вы не можете использовать одну переменную ${uuid}
;Вы должны будете определить новую переменную для каждого uuid.Опять же, это может быть лучше в долгосрочной перспективе: таким образом, вы можете получить доступ к определенному UUID для каждого значения в шаблоне, если оно вам понадобится снова.Вы даже можете получить доступ к UUID напрямую из кода Python после замены шаблона:
>>> for k, v in mappings.items():
... print k, v
...
baz_uuid bf2d86b7-c13e-4498-8d4a-27e76c2e72ab
bar_uuid c7ea3090-2a0f-49aa-ace9-c5ef67b7888b
foo_uuid aedd5fb6-40da-45bd-bcf7-c7390ef8f13e