繁体   English   中英

0 项的 Python IntFlags 行为

[英]Python IntFlags behavior for 0 item

在使用下面的示例中代码IntFlagenum在Python3,我可以理解的前5点的行为。 但我无法理解最后 3 种行为。 我认为这些结果应该是False 任何人都可以详细说明这些行为吗? 知道如何定义使 3 个结果为“假”的 CLEAR?

In [3]: from enum import IntFlag, auto

In [4]: class Functions(IntFlag):
   ...:     CLEAR=0
   ...:     FUNC1=auto()
   ...:     FUNC2=auto()
   ...:     FUNC3=auto()
   ...:     FUNC12=FUNC1|FUNC2
   ...:     ALL=FUNC1|FUNC2|FUNC3
   ...:

In [5]: Functions.FUNC1 in Functions.FUNC12 #OK
Out[5]: True

In [6]: Functions.FUNC2 in Functions.FUNC12 #OK
Out[6]: True

In [7]: Functions.FUNC3 in Functions.FUNC12 #OK
Out[7]: False

In [8]: Functions.FUNC12 in Functions.ALL #OK
Out[8]: True

In [9]: Functions.ALL in Functions.FUNC12 #OK
Out[9]: False

In [10]: Functions.CLEAR in Functions.ALL #?
Out[10]: True

In [11]: Functions.CLEAR in Functions.FUNC12 #??
Out[11]: True

In [12]: Functions.CLEAR in Functions.FUNC1 #???
Out[12]: True

CLEAR表示空的标志集。

文档似乎从未明确提及这一点,但据我所知, in运算符测试左侧的标志是否是右侧的子集。

但是Flag.__contains__方法(由IntFlag继承)的源代码支持这种理解——该方法实现了other in self操作:

 def __contains__(self, other): """ Returns True if self has at least the same flags set as other. """ if not isinstance(other, self.__class__): raise TypeError( "unsupported operand type(s) for 'in': '%s' and '%s'" % ( type(other).__qualname__, self.__class__.__qualname__)) return other._value_ & self._value_ == other._value_

空集是任何其他集的子集,因此Functions.CLEAR in Functions.x对任何x都成立。

或者,就执行的具体按位运算而言, CLEAR为 0,因此CLEAR in x计算0 & x == 0这始终为真。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM