用布尔表达式分配字符串[重复]


问题内容

这个问题已经在这里有了答案

和/或运算符返回值[重复]
(4个答案)

3年前关闭。

我正在尝试从别人的项目中了解此代码。如果需要上下文,请访问:https
:
//github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501

IS_PY2仅仅是一个布尔变量,True如果Python的主要版本2.我知道一个非空字符串True,但由于某些原因,我不知道openmode将被分配'w''wt'而不是TrueFalse

openmode = IS_PY2 and 'w' or 'wt'
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''}

有人可以解释一下结果吗?


问题答案:

三元布尔表达式的工作方式如下:

>>> 2 and 3 or 4
3
>>> 0 and 3 or 4
4

因此,此表达式:

openmode = IS_PY2 and 'w' or 'wt'

成为Python 2:

openmode = True and 'w' or 'wt'

相当于

openmode = 'w' or 'wt'

所以,我给w

在Python 3下,IS_PY2为False,给出:

openmode = False and 'w' or 'wt'

相当于

openmode = False or 'wt'

给予wt


所有这些都是明确地指定openmode用于文本文件,而不是二进制文件,这w在Python2和wtPython3中由指示。

虽然Python3t模式是默认模式,但不必对其进行精确调整。

请参阅有关wtmode的答案


最后,我认为以下内容更具可读性:

openmode = 'w' if IS_PY2 else 'wt'

而这个简单得多:

openmode = 'w'