gpt4 book ai didi

python-3.x - 是否有用于标志/位掩码操作的 Python 类/枚举?

转载 作者:行者123 更新时间:2023-12-03 13:44:05 25 4
gpt4 key购买 nike

我知道基类 EnumIntEnum .两者都非常有帮助,但我错过了标志操作的功能。我不希望这两个类实现我想要的功能。
让我们构造一个例子:

class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15
如您所见,我已经在使用 IntEnum获取此枚举的算术功能。最好有 @unique 之类的东西确保所有值都是 2 的幂。我可以通过根据我的需要 fork enum.unique 来做到这一点。 (我知道 All 是该规则的一个异常(exception)。)
如何使用这样的枚举?
filter = NetlistKind.LatticeNetlist | NetlistKind.QuartusNetlist
由于底层的 int 位操作是可能的,并且 filter 的内部值为 3。
如果有一个“在过滤器 Y 中设置标志 X”功能甚至更好的运算符会很好。我为 x in y 添加了一个魔术函数:
@unique
class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15

def __contains__(self, item):
return (self.value & item.value) == item.value
使用示例:
....
def GetNetlists(self, filter=NetlistKind.All):
for entity in self._entities:
for nl in entity.GetNetlists():
if (nl.kind in filter):
yield nl

def GetXilinxNetlists(self):
return self.GetNetlists(NetlistKind.XSTNetlist | NetlistKind.CoreGenNetlist)
所以问题是:
  • 有没有更好的方法来实现位域?
  • 有更好的方法来实现这样的一维滤波器吗?我不想将 lamdas 用于如此简单的过滤条件?
  • Python 标准库中是否已经包含这样的解决方案?
  • 如何将此枚举扩展添加到下一个 Python 版本? :)

  • 开放特性:
  • 返回 __str__ 中所有事件标志的列表
  • ...?
  • 最佳答案

    Python 3.6 新增了 Flag IntFlag 它支持通常的按位运算。作为奖励,按位运算的结果值仍然是原始标志类的成员,并且是单例 [1]。

    aenum 库也有这个添加,并且可以使用回 Python 2.7。

    [1] 3.6.0 中存在一个错误:如果伪标志成员是在线程中创建的,那么最终可能会出现重复;这在 3.6.1 中已修复(并且从未存在于 aenum 中)。

    关于python-3.x - 是否有用于标志/位掩码操作的 Python 类/枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36829820/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com