我尝试用如下的花括号格式化字符串:
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}'另一个限制因素是,我需要在稍后的输出中使用.format_map(),这会使使用.format()的解决方案陷入困境,因为out花括号将消失。
我尝试了集合中的默认值包,也进入了地图(),然后用regex替换括号及附加括号,它感觉不太像解决方案,更像是黑客,而且如果字符串中有多个重复括号,那么它也不能工作。
它不是json字符串,因为这样我就可以使用json库来映射值。
有谁知道怎么解决这个问题吗?
目前,我考虑使用循环和str.replace('{a}', 1),但这也让人感到笨重。
发布于 2022-02-25 19:36:46
如果您不想将{}转换为{{}},我建议您使用string中的Template。它的接口允许您像下面所做的那样自定义格式选项:
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))输出是,如您所愿:{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)。
发布于 2022-02-25 19:50:42
您的格式字符串无效,但假设您希望在这种情况下实际打印大括号。双倍的大括号打印一个文字大括号。
如果键不存在,您可以子类dict返回带括号的格式键。这填补了{a}的空白,但使{b}不受影响:
class MyDict(dict):
    # "magic" method called when a key is missing from the dict
    def __missing__(self, key):
        return f'{{{key}}}'
dct_mapper = MyDict(a=1)
s = '{{key1: value2, key1: value2}}; attrib1={a}; attrib2={b}'
# Must use format_map.  format(**dct_mapper) doesn't work
print(s.format_map(dct_mapper))输出:
{key1: value2, key1: value2}; attrib1=1; attrib2={b}发布于 2022-02-25 19:26:48
这就是你要找的吗?
dct_mapper = dict(a=1, b=2)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)输出:{key1: value2,key1: value2;attrib1=1;attrib2=2}
dct_mapper = dict(a=1, b=1)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)输出:{key1: value2,key1: value2;attrib1=1;attrib2=1}
但是,如果您只试图传递一个值,比如"a",它将抛出一个错误,因为format()将填充给字符串中所有{}的值。
dct_mapper = dict(a=1)
s = '{{key1: value2, key1: value2; attrib1={a}; attrib2={b}}}'.format(**dct_mapper)输出: KeyError:'b‘
希望这能有所帮助!
https://stackoverflow.com/questions/71270767
复制相似问题