f-string的行为与嵌套格式的格式化方法不同



我正在使用format进行嵌套格式化,但它无法按预期工作。然而,如果我试着用f字符串来做,它会完美地工作。

示例:

这样做:

values = 'first', 'second', 'third'
a = f"""cardinality and values: {'|'.join(f'val:{val}, card:{i}'for i, val in enumerate(values))} """

给我这个(需要的结果(:

'cardinality and values: val:first, card:0|val:scond, card:1|val:third, card:2'

但是,如果我尝试使用format:

a = """cardinality  and values: {'|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values))} """.format(values=values)

我得到以下异常:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: "'|'"

如何使用format

我需要使用format而不是f-string,因为另一个文件导入这个字符串,然后格式化它

format的功能不如f-string,因此必须简化字符串格式。

只需从格式字符串之外获得理解:

a = "cardinality  and values: {} ".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values)))

结果:

cardinality  and values: val:first, card:0|val:second, card:1|val:third, card:2 

如果你想制作一个单行的"模板",你可以使用lambda:

a = lambda v : "cardinality  and values: {} ".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(v)))

现在调用

print(a(values))

调用CCD_ 7,CCD_。这是我能想到的最接近于没有f字符串的f字符串。

这是不可能的,因为第二个字符串a中仍然有{...},并且不想使用eval(...)

将代码放入format(...)

a = """cardinality  and values: {}""".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values))) 

最新更新