在 Python 中制作 ByteEnum 的最简单方法是什么?

质朴的

我需要什么

我正在编写一个程序,我想用对存储一个字节的某些值的可能解释来定义枚举。所以它比IntEnum我的值必须int在 0x00-0xFF 范围内更具体

枚举中有两种类型的值:

  • 由标准指定(我自己定义的那些,例如 0x00-0x7F)
  • 用户特定(我让用户定义那些,例如 0x80-0xFF)

因此,我使用aenum而不是经典enum包,因为我的枚举可能会在程序启动后注册新成员。

什么是所需的解决方案

我想添加一些代码来IntEnum限制可能的成员值,所以它必须同时存在int0x00 <= value <= 0xFF或者会引发一些异常。
为什么?到从限定值不当停止用户(例如-125610.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
>>>

注意事项:

  1. 指定一个start=0likeclass SomeByteEnum(aenum.IntEnum, start=0):会破坏value工作方式 - 无法添加扩展成员。
  2. 使用过aenum=2.2.6,在 3.0.0 中遇到了一些麻烦,比如for m in SomeByteEnum没有显示添加的成员。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Linux机器上检测python 3中按键的最简单方法是什么?

使用Python进行SSH的最简单方法是什么?

在Linux和/或Python中制作吉他和弦的最简单方法

在Python中从日期中减去一个月的最简单方法是什么?

在Python中实现rm -rf的最简单方法

在Python中转义HTML的最简单方法是什么?

将python脚本放入系统托盘的最简单方法是什么(Windows)

在Python中开发简单GUI的最简单方法

在SASS中划分变量的最简单方法是什么?

检查Aerospike集是否为python空的最简单方法是什么?

在AWS上部署多服务Spring / Python项目的最简单方法是什么?

在python中热映射选定列的最简单方法?

在Angular中制作editForm的最简单方法是什么?

制作多引导UEFI Windows / Linux / Mac(通用)DVD / BD的最简单方法是什么?

在Python中获取Google Compute Engine实例IP地址的最简单方法是什么?

在python中从字典中打印选择的键值的最简单方法是什么

将python脚本转换为webapp的最简单方法是什么?

使用 Python CSV 删除 CSV 中一行的最简单方法是什么?

在 ionic3 应用程序中制作倒数计时器的最简单方法是什么?

在 Python 中获取特定数组值的简单方法是什么?

使用 Python 语法编写此 PHP 代码的最简单方法是什么?

在python 3.7中将多个句子的句子中的第一个单词大写的最简单方法是什么?

在python中将字符串列表与数字数组连接的最简单方法是什么

从 Python 中的字符串的一部分中删除重复项的简单方法是什么?

创建 python flask swagger 的最简单方法是什么

在 python 中使用 selenium 查找网站上多行表中是否存在特定值的最简单方法是什么?

根据文件名列表(在多个 FTP 目录中)检索 FTP 文件的最简单方法是什么 - Python

在python中提取二维矩阵子集的最简单方法是什么?

在 Python 3.9 中聚合 CSV 数据的最简单方法是什么?