f-string 的行为与嵌套格式化的 format 方法不同
f-string behaves differently then the format method for nested formatting
我正在使用 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-strings 因为另一个文件导入这个字符串然后格式化它。
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
如果你想制作单行"template",你可以使用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弦了
这是不可能的,因为您在第二个字符串 a
中仍然有 {...}
而您不想使用 eval(...)
.
将代码放入format(...)
?
a = """cardinality and values: {}""".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values)))
我正在使用 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-strings 因为另一个文件导入这个字符串然后格式化它。
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
如果你想制作单行"template",你可以使用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弦了
这是不可能的,因为您在第二个字符串 a
中仍然有 {...}
而您不想使用 eval(...)
.
将代码放入format(...)
?
a = """cardinality and values: {}""".format('|'.join('val:{val}, card:{i}'.format(val=val, i=i) for i, val in enumerate(values)))