我在 Django 源代码中找到了以下行:
actions.extend(self.get_action(action) for action in self.actions or [])
Run Code Online (Sandbox Code Playgroud)
参数self.get_action(action) for action in self.actions or []必须是可迭代值的推导式,但我无法弄清楚该or []片段可能意味着什么。
没有if,所以or没有在布尔表达式中使用,这是我认为我在 Python 中熟悉的唯一用法。Web 搜索只返回布尔值or.
这是什么语法?
也许这会让你更容易看到:
actions.extend(self.get_action(action) for action in (self.actions or []))
Run Code Online (Sandbox Code Playgroud)
的值self.actions可能是None,即它的类型是Optional[List[T]]
使用or运算符将返回第一个评估为真的值,或返回它评估的最后一个值。这使用短路逻辑,这意味着如果您将多个值链接在一起,一旦找到第一个“真实”值,它将停止评估表达式(参见底部示例)。
对于基本语义,请考虑以下示例:
>>> a = None
>>> b = [1,2,3]
>>> c = a or b
>>> c
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
这相当于:
a = None
b = [1,2,3]
if a:
c = a
else:
c = b
Run Code Online (Sandbox Code Playgroud)
还有一些例子:
>>> a = 1
>>> b = 2
>>> a or b
1
>>> a = 1
>>> b = None
>>> a or b
1
>>> a = None
>>> b = 2
>>> a or b
2
>>> a = None
>>> b = None
>>> a or b
None
>>> a = None
>>> b = False
>>> a or b
False
>>> a = 0
>>> b = 0
>>> c = 1
>>> a or b or c
1
Run Code Online (Sandbox Code Playgroud)
请注意,在最后一个示例中,我们能够将多个or调用链接在一起!
短路的一个例子(注意foo(2)没有被调用!):
>>> def foo(i):
... print(f"foo: {i}")
... return i
...
>>> foo(0) or foo(1) or foo(2)
foo: 0
foo: 1
1
Run Code Online (Sandbox Code Playgroud)