Жаль, что встроенный в форматировщик не позволит. Очевидным расширением синтаксиса было бы предоставление ключей, если это необходимо. Ваша строка формата будет то, как это:
format('{"with:colon"} and {hello}'
К счастью, это, кажется, легко расширить Formatter, чтобы обеспечить этот синтаксис, вот реализация РОС:
class QuotableFormatter(string.Formatter):
def __init__(self):
self.super = super(QuotableFormatter, self)
self.super.__init__()
self.quotes = {}
def parse(self, format_string):
fs = ''
for p in re.findall(r'(?:".+?")|(?:[^"]+)', format_string):
if p[0] == '"':
key = '_q_' + str(len(self.quotes))
self.quotes[key] = p[1:-1]
fs += key
else:
fs += p
return self.super.parse(fs)
def get_field(self, field_name, args, kwargs):
if field_name.startswith('_q_'):
field_name = self.quotes[field_name]
return self.super.get_field(field_name, args, kwargs)
Использование:
d = {'hello': 'world', 'with:colon': 'moo', "weird!r:~^20": 'hi'}
print QuotableFormatter().format('{"with:colon":*>20} and {hello} and {"weird!r:~^20"}', **d)
# *****************moo and world and hi
Такая же проблема с '{'с! Восклицанием': something}' – dawg