enum模块的Pythondocs包含以下子类化Enum的示例.生成的类可用于创建枚举,该枚举还验证它们是否没有两个具有相同值的成员.

>>> class DuplicateFreeEnum(Enum):
...     def __init__(self, *args):
...         cls = self.__class__
...         if any(self.value == e.value for e in cls):
...             a = self.name
...             e = cls(self.value).name
...             raise ValueError(
...                 "aliases not allowed in DuplicateFreeEnum:  %r --> %r"
...                 % (a, e))

然而,作为一种添加验证的方法,这种方法是不优雅和受限的. for each 成员调用__init__一次,而为了将枚举作为一个整体进行验证,一起查看枚举的每个成员会更有意义.

例如,我如何验证一个枚举正好有两个成员,如下所示?

class PreciselyTwoEnum(Enum):
    ...  # ???

class Allowed(PreciselyTwoEnum):
    FOO = 1
    BAR = 2

class Disallowed(PreciselyTwoEnum):  # Should raise an error
    BAZ = 3

这可以通过巧妙地实现__init__来实现吗?是否有其他方法可以使用--也许是在完全创建枚举之后在枚举上调用的方法?

推荐答案

我不知道如何子类化Enum来实现所需的功能,但使用类decorator 可以很容易地完成:

from enum import Enum

def PreciselyTwoEnum(cls):
    members = len(cls.__members__)
    if members != 2:
        raise ValueError(f"two members expected in {cls.__name__!r}, but got {members}")
    return cls 

@PreciselyTwoEnum
class Allowed(Enum):
    FOO = 1 
    BAR = 2 

@PreciselyTwoEnum
class Disallowed(Enum):  # Should raise an error
    BAZ = 3 

Python相关问答推荐

KNN分类器中的GridSearchCV

Pydantic:如何将对象列表表示为dict(将列表序列化为dict)

在for循环中仅执行一次此操作

比较两个数据帧并并排附加结果(获取性能警告)

使用@ guardlasses. guardlass和注释的Python继承

计算组中唯一值的数量

如何在Raspberry Pi上检测USB并使用Python访问它?

Pandas:将多级列名改为一级

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

如何在Python中找到线性依赖mod 2

如何启动下载并在不击中磁盘的情况下呈现响应?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

Discord.py -

使用Python异步地持久跟踪用户输入

jsonschema日期格式

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

按条件添加小计列