F-string对于嵌套格式化的行为与format方法不同。

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在使用format进行嵌套格式化,但它并没有按预期工作。然而,如果我尝试使用f-strings,它将完美地工作。

例如:

执行以下操作:

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-strings,因为另一个文件会导入此字符串并进行格式化。


1
如果您将此内容作为静态字符串传递,您将无法在 f-string 中使用它,除非使用类似于 eval 的东西,这是危险的。 - user3483203
格式查找器会查找 {},而您的字符串中有成千上万个 {}。将逻辑从字符串中提取出来,只保留 {} 以进行替换。 - rafaelc
顺便提一下,为什么要在单行字符串中使用 """ - MoxieBall
1
把以下與編程有關的內容從英語翻譯成中文。僅返回翻譯後的文字:原本有幾行,忘了把它改為“”。 - moshevi
2个回答

4

format仅比f-strings功能弱,因此您需要简化格式字符串。

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

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))

调用使用传递的values执行格式化的lambda函数。这是我能想到的最接近f-strings但不使用f-strings的方法。


我希望字符串是“即插即用”的。 我可以使用一个函数来实现你建议的操作,但我想知道是否可以使用格式化(因为它与f-strings非常配合)。 - moshevi
是的,但逻辑不在字符串内部。每次导入此字符串时,都必须重新构建生成器表达式。使用函数可以解决此问题,但这不是我的问题的本质。 - moshevi
也许可以创建一个 str 的子类来重新定义格式,就像我在这里所做的那样?https://stackoverflow.com/a/48560618/6451573,或者使用 lambda - Jean-François Fabre
2
@moshevi 是的,你不能在与 format 一起使用的格式化中放置任意表达式,这只适用于 f-strings。这是它们的主要优点之一。然而,你应该将这些复杂的表达式放在一起,只在 f-strings 中使用简单直接的内容。 - juanpa.arrivillaga

1
这是不可能的,因为第二个字符串a中仍然有{...},而您不想使用eval(...)。将代码放入format(...)中?
a = """cardinality  and values: {}""".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values))) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接