Python 风格:if 语句与布尔求值

7 投票
3 回答
1920 浏览
提问于 2025-04-15 23:47

Python的设计理念之一是“应该有一种明显的方法来做这件事。” (PEP 20),但这并不总是成立。我这里特别想说的是(简单的)if语句和布尔值的比较。看看下面的例子:

if words:
    self.words = words
else:
    self.words = {}

self.words = words or {}

在这种简单的情况下,从风格上来说,哪种写法更好呢?在更复杂的情况下,大家通常会选择if语句,因为这样更容易读懂,对吧?

3 个回答

0

(编辑过)
在下面这种情况下,我支持使用条件表达式。

def somesuch(self, words=None):
    self.words = words or {}
    ...

当然,如果你觉得这样能提高可读性(你能用这种方式读出来吗?),你可以试试。

self.words = words if words else {}
2

在这种情况下,我会说“明确比隐含更好”。

当有人阅读你的代码时,他们可能会做出一些假设。他们可能会认为“words”可以是一个空字典,也可以是一个有数据的字典(但他们可能会忽略它是None的情况)。这样的话,他们可能会想要优化你的代码。如果没有任何地方说明“words”可以是None,他们这样做可能是对的。

如果“words”实际上可以是None,我会尽量明确这一点,比如:

self.words = words
if words is None:
    self.words = {}

或者可以用一个“else”来代替无条件的赋值。无论如何,这样做可以让人清楚地知道None是“words”的一个预期值。

9

“应该只有一个”这个说法在很多情况下都是对的;但“确实只有一个”就不一定了。“应该”这个词表示的是一个目标或期望,而不是说总能实现这个目标(比如,对于数字 ab,如果不允许 b + aa + b,那就太荒谬了,这种情况下根本不可能说“只有一种方式”)。

在你的例子中,我同意在简单的情况下用 or 更好(用四行代码做一件可以用一行清晰可读的代码完成的事情,真是浪费空间),但如果条件比较复杂,就不一定了。判断什么算“复杂”其实是个主观的事情。

撰写回答