我正在浏览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
运算符如何在两个列表上运行。如果有人帮助我,我会很感激的。
答案 0 :(得分:7)
Python中的所有对象都有一个布尔值'value';它们在布尔上下文中为true或false。
空列表为false。这适用于所有序列和容器,包括元组,集合,字典和字符串。
数字0也是假的,所以0,0.0,0都是假的,None
当然也是False
本身:
>>> bool([])
False
>>> bool([1, 2])
True
>>> bool(0)
False
>>> bool('')
False
在布尔上下文中,其他所有内容都被认为是真的;所以不为空的列表为真,并且两个非空列表和and
也被认为是真的。
您可以通过实施__len__()
并返回0
来使自定义类型看起来像空容器,或者通过实现__nonzero__()
* 并返回{来看起来像一个数字{1}}当实例是数字零的布尔等价物时。
请记住False
和and
短路;如果第一个表达式锁定结果,则返回该值,并且完全忽略第二个表达式。对于or
,这意味着在表达式and
中,如果x and y
是假值(如空列表),则忽略y
,因为整个表达式永远不会是在这种情况下是真的。对于x
,如果x or y
为真值,则忽略y
。
这些规则均由Boolean operations reference documentation涵盖。
* 在Python 3中,使用__bool__
代替 。
答案 1 :(得分:4)
空列表评估为False
,非空列表评估为True
。
if list1 and list2:
相当于:
if list1 is not empty and list2 is not empty
:
无
假
任何数字类型的零,例如0
,0L
,0.0
,0j
。
任何空序列,例如''
,()
,[]
。
任何空映射,例如{}
。
用户定义类的实例,如果类定义了
__nonzero__()
或__len__()
方法,当该方法返回整数零或bool值False时。
所有其他值都被认为是真的 - 因此许多类型的对象始终为真。
答案 2 :(得分:1)
如果list_a
为空,则list_a and list_b
将评估为list_a
,否则评估为list_b
。例如:
>>> [1] and [2]
[2]
>>> [] and [2]
[]
答案 3 :(得分:1)
除了@Ashwini答案之外,您还可以使用bool
内置函数来检查给定对象将评估的内容。
>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool('')
False
>>> bool('hello')
True
答案 4 :(得分:0)
它看起来好像是一个逻辑布尔语句。在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没有显式类型声明,因此每种数据类型都有一个布尔表示。对于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:
我希望这会有所帮助。