4

我正在浏览来源,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在两个列表上进行操作。如果有人帮助我,我将不胜感激。

4

5 回答 5

7

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

只要记住这一点andor短路即可;如果第一个表达式锁定结果,则返回该值并完全忽略第二个表达式。对于and,这意味着在表达式 中x and yy如果x是假值(如空列表)则被忽略,因为在这种情况下整个表达式永远不会为真。如果 ,为真值x or yy则忽略。x

这些规则都包含在布尔运算参考文档中。

*在 Python 3 中,__bool__使用.

于 2013-09-13T18:01:03.683 回答
4

空列表评估为False,非空列表评估为True

if list1 and list2:

相当于:

if list1 is not empty and list2 is not empty


python中的虚假值列表

  • 没有任何

  • 错误的

  • 任何数字类型的零,例如 , 0, 0L, 。0.00j

  • 任何空序列,例如'', (), [].

  • 任何空映射,例如{}.

  • 用户定义类的实例,如果该类定义了一个 __nonzero__()__len__()方法,当该方法返回整数零或布尔值 False。

所有其他值都被认为是真的——所以许多类型的对象总是真的。

于 2013-09-13T18:00:31.967 回答
1

如果list_a为空,则list_a and list_b计算结果为list_a,否则计算结果为list_b。例如:

>>> [1] and [2]
[2]
>>> [] and [2]
[]
于 2013-09-13T18:02:31.130 回答
1

除了@Ashwini 答案之外,您还可以使用bool内置函数来检查给定对象的评估结果。

>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool('')
False
>>> bool('hello')
True
于 2013-09-13T18:04:28.957 回答
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 没有显式类型声明,因此每种数据类型都有一个布尔表示。对于 and 之类rejected_usersallowed_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:

我希望这有帮助。

于 2013-09-13T18:07:56.250 回答