避免在f-string中出现None值

21

如果我的f-string中有一个参数可能是None,是否有一种方法可以自动从字符串中省略它?

f'{first_name} {prefix} {last_name}'

如果prefixNone,那么这个字符串将被渲染为Arnold None Weber

我尝试过f'{first_name} {prefix or ''} {last_name}',但那是一个语法错误。

2个回答

44

我尝试过 f'{first_name} {prefix or ''} {last_name}',但那是个语法错误。

这个语法错误的唯一原因是你试图在单引号内嵌套单引号。所有通常的修复方法都可以解决它:

f'{first_name} {prefix or ""} {last_name}'
f"{first_name} {prefix or ''} {last_name}"
f"""{first_name} {prefix or ''} {last_name}"""

但是请注意,这并没有完全达到你想要的效果。你将得到Arnold Weber,但中间有空格,因为两端的空格并不受条件限制。你可以像这样做:

f'{first_name} {prefix+" " if prefix else ""}{last_name}'
f'{first_name} {prefix or ""}{" " if prefix else ""}{last_name}'

...但此时,我认为您已经无法享受f-string的简洁性和可读性优势了。也许考虑使用其他方法,比如:

' '.join(part for part in (first_name, prefix, last_name) if part)
' '.join(filter(None, (first_name, prefix, last_name)))

不是说这篇文章更——而是逻辑更加清晰。


2
带反斜杠的那个不起作用 - 表达式中不允许使用反斜杠,除非在3.7中进行了更改。 - user2357112
1
我更喜欢最后一个选项 ' '.join(filter(None, (first_name, prefix, last_name))) - northtree

4
当然,这是一个语法错误;你破坏了字符串。
f'{first_name} {prefix or ""} {last_name}'

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