我正在编写一个程序,我想用对存储一个字节的某些值的可能解释来定义枚举。所以它比IntEnum
我的值必须int
在 0x00-0xFF 范围内更具体。
枚举中有两种类型的值:
因此,我使用aenum
而不是经典enum
包,因为我的枚举可能会在程序启动后注册新成员。
我想添加一些代码来IntEnum
限制可能的成员值,所以它必须同时存在int
,0x00 <= value <= 0xFF
或者会引发一些异常。
为什么?到从限定值不当停止用户(例如-1
,256
,10.0
),其不int
或不在范围内0x00-0xFF。
我想更新 的__new__
方法IntEnum
,但它长达近 500 行,很难理解。不过,我注意到它有boundary
参数。不是我需要的(下界 = 0x00,上界 = 0xFF)?
from aenum import IntEnum, unique
@unique
class SomeByteEnum(IntEnum):
FOO = 1
BAR = 2
...
更新后,以下情况将引发异常:
@unique
class SomeByteEnum(IntEnum):
... # some magical code here
INVALID_VALUE = -1 # value is lower than minimal byte value 0x00, exception shall be raised
from aenum import extend_enum
extend_enum(SomeByteEnum, "INVALID_VALUE", 0x100) # value is greater than max byte value 0xFF, exception shall be raised
写:
我想更新 的
__new__
方法IntEnum
,但它长达近 500 行,很难理解。
你将不得不更新__new__
而是你自己的枚举类,而不是实际的IntEnum
。
这是有效的,请注意以下事项:
import aenum
@aenum.unique
class SomeByteEnum(aenum.IntEnum):
def __new__(cls, value):
if not 0 <= value <= 255:
raise ValueError('Value must be >=0 and <= 255')
if not isinstance(value, int):
raise TypeError('Value must be an int')
obj = int.__new__(cls, value)
obj._value_ = value
return obj
ZEROTH = 0
FIRST = 1
SECOND = 2
THIRD = 3
用法:
>>> from aenum import extend_enum
>>>
>>> list(SomeByteEnum)
[<SomeByteEnum.ZEROTH: 0>, <SomeByteEnum.FIRST: 1>, <SomeByteEnum.SECOND: 2>,
<SomeByteEnum.THIRD: 3>]
>>>
>>> # allowed:
>>> extend_enum(SomeByteEnum, 'FOURTH', 4)
>>> list(SomeByteEnum)
[<SomeByteEnum.ZEROTH: 0>, <SomeByteEnum.FIRST: 1>, <SomeByteEnum.SECOND: 2>,
<SomeByteEnum.THIRD: 3>, <SomeByteEnum.FOURTH: 4>]
>>>
>>> # NOT allowed:
>>> extend_enum(SomeByteEnum, 'MeeeeeLION', 1_000_000)
Traceback (most recent call last):
...
ValueError: Value must be >=0 and <= 255
>>>
>>> # NOT allowed:
>>> extend_enum(SomeByteEnum, 'SIXFEETUNDER', -6)
Traceback (most recent call last):
...
ValueError: Value must be >=0 and <= 255
>>>
>>> # floats NOT allowed:
>>> extend_enum(SomeByteEnum, '5 point 5', 5.5)
Traceback (most recent call last):
...
TypeError: Value must be an int
>>>
>>> extend_enum(SomeByteEnum, 'TooTRUE', True) # True = 1 so is absorbed, no error
cls=<aenum 'SomeByteEnum'> value=True
>>>
>>> # check members
>>> for m in SomeByteEnum:
... print(m.name, m.value)
...
ZEROTH 0
FIRST 1
SECOND 2
THIRD 3
FOURTH 4
>>>
注意事项:
start=0
likeclass SomeByteEnum(aenum.IntEnum, start=0):
会破坏value
工作方式 - 无法添加扩展成员。aenum=2.2.6
,在 3.0.0 中遇到了一些麻烦,比如for m in SomeByteEnum
没有显示添加的成员。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句