我尝试使用大括号格式化字符串,如下所示:
dct_mapper = dict(a=1)
s = '{key1: value2, key1: value2}; attrib1={a}; attrib2={b}'
s.format(**dct_mapper)
Results in:
# KeyError: 'key1'
Expected:
# '{key1: value2, key1: value2}; attrib1=1; attrib2={b}'
Run Code Online (Sandbox Code Playgroud)
另一个限制是我需要.format_map()稍后再次使用输出,这会搞砸使用 .format() 的解决方案,因为输出大括号会消失。
我尝试了collections包中的 defaultdict 以及.format_map(),然后使用正则表达式尝试用其他括号替换括号,这感觉不太像一个解决方案,更像是一个黑客,如果你有多个,也不起作用字符串开头重复括号。
它不是 json 字符串,因为这样我就可以使用 json 库来映射值。
有谁知道如何解决这个问题?
我目前正在考虑使用循环,str.replace('{a}', 1)但这也感觉很笨拙。
如果您不想转换{}为{{}},我建议您使用Templatefrom string。它的界面允许您自定义格式选项,如下所示:
from string import Template
class MyTemplate(Template):
delimiter = ""
dct_mapper = dict(a=1)
s = MyTemplate('{key1: value2, key1: value2}; attrib1={a}; attrib2={b}')
print(s.safe_substitute(**dct_mapper))
Run Code Online (Sandbox Code Playgroud)
输出如您所愿:
{key1: value2, key1: value2}; attrib1=1; attrib2={b}
说明:默认情况下,我Template使用$var而不是格式化字符串{var},因此我将变量名称(在 后面)的模式更改$为,${var}并将分隔符本身更改为“”,因此{var}代替 就足够了${var}。
此外,模板safe_substitute允许您仅格式化整个字符串中的少数变量,并且不会因不存在的变量格式而引发错误。
另外,如果您更喜欢这个而不是那个,s.safe_substitute(**dct_mapper)可以更改为。s.safe_substitute(dct_mapper)