我正在浏览来源,pyftpdlib我发现了这个:
if self.rejected_users and self.allowed_users:
raise AuthorizerError("rejected_users and allowed_users options are mutually exclusive")
rejected_users并且allowed_users是列表。令我困惑的是运算符如何and在两个列表上进行操作。如果有人帮助我,我将不胜感激。
Python 中的所有对象都有一个布尔“值”;它们在布尔上下文中为真或假。
空列表是错误的。这适用于所有序列和容器,包括元组、集合、字典和字符串。
数字 0 也是假的,所以 0, 0.0, 0j 也都是假的None,当然也是假的False:
>>> bool([])
False
>>> bool([1, 2])
True
>>> bool(0)
False
>>> bool('')
False
在布尔上下文中,其他一切都被认为是真实的;所以一个非空的列表是真的,两个非空的列表一起and也被认为是真的。
__len__()您可以通过实现和 return使自定义类型看起来像空容器,或者通过实现*并在实例是数字零的布尔等效项时返回0看起来像一个数字。__nonzero__()False
只要记住这一点and并or短路即可;如果第一个表达式锁定结果,则返回该值并完全忽略第二个表达式。对于and,这意味着在表达式 中x and y,y如果x是假值(如空列表)则被忽略,因为在这种情况下整个表达式永远不会为真。如果 ,为真值x or y,y则忽略。x
这些规则都包含在布尔运算参考文档中。
*在 Python 3 中,__bool__使用.
空列表评估为False,非空列表评估为True。
if list1 and list2:
相当于:
if list1 is not empty and list2 is not empty:
没有任何
错误的
任何数字类型的零,例如 , 0, 0L, 。0.00j
任何空序列,例如'', (), [].
任何空映射,例如{}.
用户定义类的实例,如果该类定义了一个
__nonzero__()或__len__()方法,当该方法返回整数零或布尔值 False。
所有其他值都被认为是真的——所以许多类型的对象总是真的。
如果list_a为空,则list_a and list_b计算结果为list_a,否则计算结果为list_b。例如:
>>> [1] and [2]
[2]
>>> [] and [2]
[]
除了@Ashwini 答案之外,您还可以使用bool内置函数来检查给定对象的评估结果。
>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool('')
False
>>> bool('hello')
True
在我看来,它好像是一个逻辑布尔语句。在 Python 中,在构建 If 语句时,布尔语句有一个有趣的逻辑简写:
bool = True;
If bool:
return "Blah!"
是相同的:
bool = True;
If bool==True:
return "Blah!"
该声明If *[boolean]*是一种更酷的说法If *[boolean]* is True。同样,该语句If *![boolean]*是一种更酷的说法If *[boolean]* is False,因为!是逻辑NOT运算符。
适应这种逻辑需要一点时间,但是一旦你这样做了,它会让你的代码看起来更漂亮。
那么为什么列表会像布尔值一样这样做呢?
由于 Python 没有显式类型声明,因此每种数据类型都有一个布尔表示。对于 and 之类rejected_users的allowed_users列表,如果列表为空{},则返回False,如果不为空,则返回True。因此,英文翻译
if self.rejected_users and self.allowed_users:
应该读:
if self.rejected_users is NOT empty AND if self.allowed_users is NOT empty:
我希望这有帮助。