使用带有条件的f-string格式化字符串

72

我该如何使用逻辑来使用 f-string 格式化一个 int 为一个 float 呢?如果 pplTrue,我想将 num 格式化为两位小数,如果 pplFalse,则按原样输出。

类似于 string = f'i am {num:.2f if ppl else num}',但这种方法不起作用。如果可能的话,下面的代码演示了我想要实现的行为:

ppl = True
num = 3
string = f'I am {num:.2f}' if ppl else f'I am {num}'
print(string)
#if ppl False
#=> i am 3
#if ppl True
#=> i am 3.00

我不明白,它似乎正好做你想要的事情。 - Andras Deak -- Слава Україні
是的...但我想用更简洁的代码来缩短f-string。 - jacobcan118
2个回答

98

您可以在 f-string 内嵌套表达式以进行求值。这意味着您可以将条件运算符移到 f-string 内部:

string = f'I am {num:{".2f" if ppl else ""}}'

注意嵌套需要额外的一对括号。

但我认为这并不更加“清晰”。个人而言,我发现这里发生的事情更难解析,而不是您清晰的原始版本。毕竟简单比复杂好;扁平比嵌套好。


82
这很恶心,但我喜欢它。 - Ben
4
另外,}} 的处理有点令人困惑 - 通常 }} 表示字面上的右括号,但在这里,}} 关闭了两个嵌套替换字段。查看 语言参考文档,我可以看到解析规则是如何工作的,但仍然令人困惑。 - user2357112
@user2357112同意,如果有什么不同的话,我更喜欢Gamrix的两步版本。 - Andras Deak -- Слава Україні

22

我建议您将fstring实际上分成两行。

num_str = f'{num:.2f}' if ppl else f'{num}'
final_str = f'I am {num_str}'

这样每一行都尽可能简单。


2
或者是 form = '.2f' if ppl else ''f'我是{num:{form}}',类似的。 - Andras Deak -- Слава Україні
1
在变量名称上覆盖str默认类并不是一个好主意。 - Diego Roccia

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