【发布时间】:2016-04-24 22:53:21
【问题描述】:
我知道基类Enum 和IntEnum。两者都非常有帮助,但我错过了标志操作的功能。我不希望这两个类实现我想要的功能。
让我们构造一个例子:
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。
如果有一个“在过滤器 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__中所有活动标志的列表 - ...?
【问题讨论】:
-
我最近为我的标志库配备了单元测试并将其发布在 pypi 上。我将在接下来的几天内完成它的 README.rst 并添加一些额外的功能。它的接口深受python3标准枚举模块的影响。如果您有兴趣,请查看:pypi.python.org/pypi/py-flags 我已经看到有关标志是否是 Python 方法的讨论。我未来对 README.rst 的更新将有一个部分讨论使用多个布尔值作为函数参数或将布尔值存储在对象或 dict VS 使用集合 VS 使用标志的优缺点。
-
请发表您的评论作为答案,这样我就可以投票了!它看起来非常好和成熟。只有一个问题:为什么我需要给枚举一个 FQN?示例:
TextStyle('TextStyle.bold')。我认为bold就足够了,因为命名空间已经被限制为TextStyle,因为你将它传递给它的构造函数。 -
不欢迎仅链接答案,所以恐怕......枚举的
str()不仅可以在序列化的情况下用于其他上下文,这就是__str__的原因返回 fqdn。我认为str()即使没有上下文中的标志类也应该是可解释的。实际上,出于自定义序列化的目的,除了标准的__str__之外,我还提供了一个to_simple_str()。在这种情况下,to_simple_str()将简单地发出'bold'并且TextStyle('bold')也可以工作。实际上flags的pickle序列化器支持只保存flags类名和to_simple_str()的输出。 -
我实际上在考虑是否在
str()中返回 fqdn。我的想法是从str()返回一个非 fqdn,并仅将 fqdn 作为repr()的一部分返回,也许还有一个实用函数,但最后我决定使用 fqdn 以与str()的行为方式相同标准enum模块。 -
仅关于链接的答案:添加一个 py-flags 库的示例,它使用您的 classes/syntax/... 替换我的初始示例。然后添加指向 PyPI 的链接(文档,下载)。我对我的图书馆以同样的方式这样做,我从来没有遇到过关于仅链接帖子或垃圾邮件的问题。如果您解释您的解决方案如何解决我的问题然后链接到通用下载平台,则完全有效。如果它是开源的而不是商业产品,则规则会放宽:)
标签: python-3.x enums bitwise-operators