使用布尔表达式分配字符串

时间:2016-04-11 13:46:24

标签: python python-2.7

我试图从别人的项目中理解这段代码。如果您想要上下文,请访问:https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501

如果Python主要版本是2,

IS_PY2只是一个布尔变量True。 我知道非空字符串是True,但出于某些原因我不明白openmode被分配为'w''wt'而不是TrueFalse

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

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

2 个答案:

答案 0 :(得分:11)

andor运算符只对其操作数执行布尔运算,给出布尔结果。他们给出的结果是总是他们的操作数之一。这些运算符从左到右进行求值,and的优先级高于or,并且它们短路,这意味着它们会尽快停止评估它们的操作数。

在纯布尔逻辑中,False and xFalse,无论x是什么,因此无需检查x。 Python表达式False and x将得到False的结果,并且不会尝试评估x。因此False and some_function()调用some_function()

类似地,纯布尔逻辑中的True and x将具有与x相同的真值,即如果xTrueTrue 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之间的空白行是打印空字符串的位置。

类似的注意事项适用于[]运算符。

在纯布尔逻辑中,orTrue 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模式是默认模式,但这并不一定要精确。

请参阅this answer about wt mode

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

openmode = 'w' if IS_PY2 else 'wt'

这一个,更简单:

openmode = 'w'