Метод Template.substitute
принимает аргумент mapping
в дополнение к аргументам ключевого слова . Ключевое слово arguments переопределяет аргументы, предоставляемые позиционным аргументом mapping
, что делает mapping
естественным способом реализации значений по умолчанию без подкласса:
from string import Template
defaults = { "name": "default" }
templ = Template('hello ${name}')
print templ.substitute(defaults) # prints hello default
print templ.substitute(defaults, name="world") # prints hello world
Это также будет работать для safe_substitute
:
print templ.safe_substitute() # prints hello ${name}
print templ.safe_substitute(defaults) # prints hello default
print templ.safe_substitute(defaults, name="world") # prints hello world
Если вы абсолютно настаиваете на том, чтобы не передавать аргументы substitute
, вы можете создать подкласс Template:
class DefaultTemplate(Template):
def __init__(self, template, default):
self.default = default
super(DefaultTemplate, self).__init__(template)
def mapping(self, mapping):
default_mapping = self.default.copy()
default_mapping.update(mapping)
return default_mapping
def substitute(self, mapping=None, **kws):
return super(DefaultTemplate, self).substitute(self.mapping(mapping or {}), **kws)
def substitute(self, mapping=None, **kws):
return super(DefaultTemplate, self).safe_substitute(self.mapping(mapping or {}), **kws)
А затем используйте это так:
DefaultTemplate({ "name": "default" }).substitute()
Хотя я нахожу это менее явным и менее читабельным, чем просто передать mapping
со значениями по умолчанию substitute
.