我知道基类Enum
和IntEnum
。两者都非常有帮助,但我错过了旗帜操作的特点。我不希望这两个班级实现我希望的功能。有标志/位掩码操作的Python类/枚举吗?
让我们构造一个例子:
class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15
正如你所看到的,我已经使用IntEnum
获得此枚举运算功能。如果有@unique
之类的东西来确保所有值都是2的幂,那将是很好的。我可以通过为我的需求分配enum.unique来做到这一点。 (我知道All
是该规则的一个例外。)
这样的枚举是如何使用的?
filter = NetlistKind.LatticeNetlist | NetlistKind.QuartusNetlist
由于垫层int位操作是可能的,过滤器具有3
的内在价值。如果是有一个好的“是在过滤器Ÿ标志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__
- 列表...?
我最近为单元测试装备了一个标志库,并在pypi上发布了它。我将完成它的README.rst并在接下来的几天添加一些额外的功能。它的接口深受python3的标准枚举模块的影响。看看你是否感兴趣:https://pypi.python.org/pypi/py-flags我已经看到关于标志是否是pythonic方法的讨论。我将来对README.rst的更新将有一节讨论使用几个bools作为函数参数或将bools存储在对象中的优点和缺点,或者使用集合VS使用标志来代替词典。 – pasztorpisti
请发表您的评论作为答案,让我可以upvote它!它看起来非常好,成熟。只有一个问题:为什么我需要给枚举赋予一个FQN?例如:'TextStyle('TextStyle.bold')'。我认为'bold'就足够了,因为名称空间已经限制为'TextStyle',因为你将它传递给它的构造函数。 – Paebbels
链接只有答案是不欢迎所以我害怕...枚举的'str()'可以在其他上下文中使用,不仅在序列化的情况下,这就是为什么'__str__'返回fqdn。我认为'str()'应该是可解释的,即使没有上下文中的flags类。实际上,为了自定义序列化的目的,我提供了一个'to_simple_str()',除了标准的'__str__'。在这种情况下'to_simple_str()'会发出简单的''bold''和'TextStyle('bold')'也可以。事实上,pickle serializer对flags的支持只保存flags类名和'to_simple_str()'的输出。 – pasztorpisti