我知道基类Enum
和IntEnum
,它们都非常有用,但我想要一些支持标志位操作的功能。我不指望这两个类能够实现我所需的功能。
让我们构建一个例子:
class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15
正如您所看到的,我已经使用 IntEnum
为此枚举获取算术特性。如果有类似于 @unique
的东西来确保所有值都是二的幂次方就太好了。 我可以通过针对我的需求分叉 enum.unique
来实现这一点。(我知道 All
是该规则的例外。)
这样的枚举类型如何使用?
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)
所以问题是:
- 是否有更好的实现位域的方法?
- 是否有更好的实现这种一维滤波器的方法?我不想为如此简单的过滤条件使用lambda表达式?
- Python标准库中已经包含了这样的解决方案吗?
- 如何将此枚举扩展添加到下一个Python版本中? :)
开放特性:
- 在
__str__
中返回所有活动标志的列表 - ...?
(T)
TextStyle('TextStyle.bold')
。我认为bold
就足够了,因为命名空间已经限制为TextStyle
,因为您将其传递给它的构造函数。 - Paebbelsstr()
可以在其他情况下使用,而不仅仅是在序列化的情况下,这就是为什么__str__
返回fqdn的原因。我认为即使在没有标志类的情况下,str()
也应该是可解释的。实际上,为了进行自定义序列化,我除了标准的__str__
之外还提供了一个to_simple_str()
。在这种情况下,to_simple_str()
将只发出'bold'
,而TextStyle('bold')
也可以工作。实际上,pickle序列化器支持标志仅保存标志类名称和to_simple_str()
的输出。 - pasztorpististr()
中返回 fqdn。我曾经想过在str()
中返回非 fqdn,只在repr()
中返回 fqdn,或者使用一个实用函数来返回 fqdn,但最终我决定采用 fqdn 的方式,以与标准enum
模块的str()
行为相同。 - pasztorpisti