python-3.x - 初始化python标志实用程序类的最佳方法?
问题描述
我正在研究 Python3.7 中的一个实用程序类,它使使用标志更加用户友好(至少对我而言)
基本上,我想把这个
from enum import Flag as eFlag, auto, unique
@unique
class Flag(eFlag):
A = auto()
B = auto()
flags = Flag.A
flags |= Flag.B
if flags & Flag.B:
pass
进入这个:
flags = Flags()
flags.set(Flag.A, Flag.B)
if flags.is_set(Flag.A):
pass
为此,我有一个这样的标志类:
class Flags:
def set(self, *flags):
self.raw |= self.merge(*flags)
def clear(self, *flags):
self.raw &= ~self.merge(*flags)
def is_set(self, *flags):
return bool(self.raw & self.merge(*flags))
@classmethod
def merge(cls, *flags):
F = None
for f in flags:
F |= f
return F
def __str__(self):
return str(self.raw)
问题是init方法中原始属性的初始化。我知道我可以将其设置为 0,但是Flag的基数必须是enum.IntFlag,我想根据docs将其保留为enum.Flag。由于我有F = None,因此合并方法中存在相同的问题,然后尝试使用标志对其进行 OR 运算。
如果 Flag 枚举保证具有NONE = 0属性,我可以在 Flags 类中执行以下操作:
def __init__(self, FlagCls):
self.raw = FlagCls.NONE
但我不能强制执行,并且可能希望将其与其他人的代码一起使用。
- 有没有一种 Pythonic 的方法来做到这一点?
- 作为模块函数会更好: flags = set(flags, Flag.A) 吗?
- 有没有更好的方法可以在不从 functools 导入 reduce 的情况下执行合并方法?
- 或者最好不要使用 *flags 并强制使用显式flags.set(Flag.A | Flag.B)而不是flags.set(Flag.A, Flag.B)?
解决方案
您可以将其设置为0
即使没有Flag
设置IntFlag
为表示未设置标志的状态:
>>> @unique
... class Flag(eFlag):
... A = auto()
... B = auto()
...
>>> Flag.A & Flag.B
<Flag.0: 0>
>>> Flag(0)
<Flag.0: 0>
推荐阅读
- java - 如何以 application/x-www-form-urlencoded 格式将正文添加到 HTTPURLConnection 中的 POST 调用
- java - RootDSE 中的 SearchRequest
- ios - Swift:如何存储数组数据,以便下课后可以多次访问?
- r - grid.Call.graphics 中的错误(C_polygon,x$x,x$y,index):“cluster”(包 Mclust)中的颜色名称无效
- python - 使用元组从字典中提取值
- python - API 教程中的 WinError 10054
- python - 替换数组列表中的元素?
- angular - 如果在 Material Autocomplete 中指定了错误的项目,如何处理
- ruby - 如何在ruby中打印类变量数组的元素
- c++ - 使用 string::insert(iterator it, char c) 的程序中的运行时错误