在Python中,
and和
or都将返回其操作数之一。使用
or,Python会检查第一个操作数,如果它是一个“真实的”值(稍后会提供更多有关真实性的信息),它将返回第一个值而不检查第二个值(这称为布尔快捷方式评估,这可能很重要)。如果第一个为“
falsey”,则Python返回第二个操作数,无论它是什么:
Python 2.7.3 (default, Jan 2 2013, 13:56:14)[GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> 2 or 32>>> 0 or 33
使用“ and”,会发生很多相同的事情:首先检查第一个操作数,如果它是“ false”,则Python永远不会检查第二个操作数。如果第一个操作数是“
truthy”,则Python返回第二个操作数,无论它是什么:
>>> 2 and 33>>> 0 and 30>>> 3 and 00>>> 3 and [][]>>> 0 and []0
现在让我们谈谈“真实性”和“虚假性”。Python使用以下规则在布尔上下文中评估事物:
- 以下值为“ falsey”:False,None,0(零),[](空列表),()(空元组),{}(空dict),空集,“”(空)串)
- 其他一切都是“真实的”
因此,类似的东西
password andPASS_RE.match(password)正在利用Python的短路评估功能。如果
password为None,则
and运算符将仅返回None,并且从不评估下半部分。很好,因为
PASS_RE.match(None)会引发异常。看这个:
>>> 3 or []3>>> [] or 33>>> 0 or [][]>>> [] or 00>>> 0 and []0>>> [] and 0[]
看看短路是如何工作的?现在看这个:
>>> value = "hello">>> print (value.upper())HELLO>>> print (value and value.upper())HELLO>>> value = None>>> print (value.upper())Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'NoneType' object has no attribute 'upper'>>> print (value and value.upper())None
看看短路功能如何
and帮助我们避免回溯?这就是此函数中正在发生的事情。



