Python 风格:if 语句与布尔求值
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
“应该只有一个”这个说法在很多情况下都是对的;但“确实只有一个”就不一定了。“应该”这个词表示的是一个目标或期望,而不是说总能实现这个目标(比如,对于数字 a
和 b
,如果不允许 b + a
或 a + b
,那就太荒谬了,这种情况下根本不可能说“只有一种方式”)。
在你的例子中,我同意在简单的情况下用 or
更好(用四行代码做一件可以用一行清晰可读的代码完成的事情,真是浪费空间),但如果条件比较复杂,就不一定了。判断什么算“复杂”其实是个主观的事情。