You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁止特定enum.Flag枚举值的非法组合?

限制Python enum.Flag的非法组合

先看你定义的这个Flag类:

import enum

class TestFlag(enum.Flag):
    A = enum.auto()
    B = enum.auto()
    C = enum.auto()
    D = A | B # valid

默认情况下,enum.Flag允许任意成员做按位或操作,不会主动拦截。但要禁止特定组合(比如C|B),可以通过重写__or__方法来实现自定义校验。

方法一:禁止指定的精确组合

如果只是要拦截C|B这个精确组合,重写__or__时直接判断结果是否等于该组合:

import enum

class TestFlag(enum.Flag):
    A = enum.auto()
    B = enum.auto()
    C = enum.auto()
    D = A | B  # 合法组合

    def __or__(self, other):
        result = super().__or__(other)
        # 定义要禁止的精确组合
        illegal = TestFlag.C | TestFlag.B
        if result == illegal:
            raise ValueError(f"非法组合:{result}")
        return result

测试效果:

  • 执行TestFlag.A | TestFlag.B会正常返回TestFlag.D
  • 执行TestFlag.C | TestFlag.B会直接抛出ValueError: 非法组合:TestFlag.B|C

方法二:禁止包含某些成员的任意组合

如果要禁止同时包含B和C的所有组合(比如C|B|A也不能出现),可以改成检查结果是否同时包含这两个位:

import enum

class TestFlag(enum.Flag):
    A = enum.auto()
    B = enum.auto()
    C = enum.auto()
    D = A | B  # 合法组合

    def __or__(self, other):
        result = super().__or__(other)
        # 只要同时包含B和C就禁止
        if (result & TestFlag.B) and (result & TestFlag.C):
            raise ValueError("不能同时组合B和C")
        return result

这样不管是C|B还是A|B|C,都会触发报错,而单独用B、C,或者A+B这类组合都没问题。

需要注意的是,这种方式只能拦截通过|操作符创建的组合,如果是直接用数值构造(比如TestFlag(6),假设B=2、C=4),还需要重写__init__或者__call__方法做额外校验,避免绕开限制。

内容的提问来源于stack exchange,提问作者tkott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:57:29