我正在浏览来源,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.0
0j
任何空序列,例如''
, ()
, []
.
任何空映射,例如{}
.
用户定义类的实例,如果该类定义了一个
__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:
我希望这有帮助。