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

4

2 回答 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))

调用lambda使用传递的values. 这是我能想到的最接近没有 f 弦的 f 弦。

于 2018-07-24T15:14:49.207 回答
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))) 
于 2018-07-24T15:17:40.033 回答