#python #python_3x #строки
Есть шаблон строки, который я хочу заполнить значениями за два (или за N) вызова str.format(): template = 'foo{a}bar{b}buzz' Сначала так: step1 = template.format(a=' A ') print (step1) > foo A bar{b}buzz Потом: step2 = step1.format(b=' B ') print(step2) > foo A bar B Однако Python не позволяет передать в format() список меньшего размера или словарь не со всеми значениями. Можно ли как-то выполнить «каррирование», то есть частичный str.format()? (Я понимаю, что это совсем не каррирование, поэтому кавычки. Grundy подсказывает, что это можно называть «частичным применением»). Разумеется, я могу сделать так: 'foo{a}bar{b}buzz'.format(a=' A ', b='{b}') Но это грязный хак, мне он не нравится тем, что нужно каждый раз перечислять параметры, то есть способ не универсален. Ещё можно использовать чистое каррирование и создавать промежуточный объект-метод. Но он не является строкой, его нельзя передать в какой-то сторонний метод, который ждет именно строку. Интересны решения для Python2 и Python 3.
Ответы
Ответ 1
В данном случае нужно не каррирование, а частичное применение. Для этого используется функция partial из модуля functools например: from functools import partial template = 'foo{a}bar{b}buzz'; fun = partial(template.format, a='w'); print( fun(b='dd') ); Repl.itОтвет 2
Если в форматируемой строке подставляемые значения обрамлены пробелами, как в вопросе, то удобно использовать `string.Template'. from string import Template temp = Template('foo $a bar $b buzz') temp.safe_substitute(a='test') >>> 'foo test bar $b buzz' temp.substitute(a='test', b='val') >>> 'foo test bar val buzz' Если пробелов не должно быть, то уже не так красиво и надо учитывать, могут ли быть пробелы в подставляемой строке, или выбрать другой разделитель в Template: strfmt = 'foo{}bar{}buzz' temp = Template('$a $b') strfmt.format(*temp.safe_substitute(a='TEST').split())
Комментариев нет:
Отправить комментарий