我试图从别人的项目中理解这段代码。如果您想要上下文,请访问:https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501
如果Python主要版本是2, IS_PY2
只是一个布尔变量True
。
我知道非空字符串是True
,但出于某些原因我不明白openmode
被分配为'w'
或'wt'
而不是True
或False
。
openmode = IS_PY2 and 'w' or 'wt'
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''}
有人可以解释一下结果吗?
答案 0 :(得分:11)
and
和or
运算符不只对其操作数执行布尔运算,给出布尔结果。他们给出的结果是总是他们的操作数之一。这些运算符从左到右进行求值,and
的优先级高于or
,并且它们短路,这意味着它们会尽快停止评估它们的操作数。
在纯布尔逻辑中,False and x
为False
,无论x
是什么,因此无需检查x
。 Python表达式False and x
将得到False
的结果,并且不会尝试评估x
。因此False and some_function()
将不调用some_function()
。
类似地,纯布尔逻辑中的True and x
将具有与x
相同的真值,即如果x
是True
则True and x
是{{} 1}},否则为True
。
但Python False
运算符可以处理任意操作数。
and
如果a and b
为false-ish,则a
将不会被评估,结果将为b
。如果a
为true-ish,则a
将进行评估并成为结果。
这是一个简短的演示,使用Python 2:
b
<强>输出强>
print False and 'boolean'
print 0 and 'integer'
print '' and 'string'
print [] and 'list'
print
print True and 'boolean'
print 7 and 'integer'
print 'a' and 'string'
print [42] and 'list'
print
print True and False
print True and 0
print True and ''
print True and []
print
(False
0
[]
boolean
integer
string
list
False
0
[]
和0
之间的空白行是打印空字符串的位置。
类似的注意事项适用于[]
运算符。
在纯布尔逻辑中,or
是True or x
,无论True
是什么,如果x
表达式的第一部分是真的,我们不会需要评估第二部分。 or
的真值为False or x
。
x
<强>输出强>
print False or 'boolean'
print 0 or 'integer'
print '' or 'string'
print [] or 'list'
print
print True or 'boolean'
print 7 or 'integer'
print 'a' or 'string'
print [42] or 'list'
print
print False or False
print False or 0
print False or ''
print False or []
print
正如我之前所说,这些运算符从左到右进行评估,如果需要,我们可以将它们链接起来。以下是“经典”案例:
boolean
integer
string
list
True
7
a
[42]
False
0
[]
这些陈述相当于
print True and 'yes' or 'no'
print False and 'yes' or 'no'
<强>输出强>
print (True and 'yes') or 'no'
print (False and 'yes') or 'no'
这种构造在早期版本的Python中很常见。现在,看到 yes
no
表达式更为常见:
if
通常认为使用print 'yes' if True else 'no'
print 'yes' if False else 'no'
和and
比使用三元表达式更具可读性。此外,如果or
为false-ish,则a and b or c
不等同于b if a else c
。
但是,理解这个三元b
的工作方式仍然很重要,特别是如果您需要阅读或维护旧代码。而一些旧的Pythonist仍然更喜欢and ... or
形式,因为它稍微短一点,即使你不明白它是如何工作的时候有点令人困惑。 :)
答案 1 :(得分:7)
三元布尔表达式的作用如下:
>>> 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是用于文本文件而不是二进制文件,由Python2中的w
和Python3中的wt
表示。
虽然Python3 t
模式是默认模式,但这并不一定要精确。
最后,我认为以下内容更具可读性:
openmode = 'w' if IS_PY2 else 'wt'
这一个,更简单:
openmode = 'w'