我知道基類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