【问题标题】:How can I disable some item in python Enum, but not remove them如何禁用 python Enum 中的某些项目,但不删除它们
【发布时间】:2023-03-05 22:51:01
【问题描述】:

我有一个枚举 OsTypeEnum:

class OsTypeEnum(Enum):
    WINDOWS = 100
    LINUX = 200
    MAC = 300
    ANDROID = 400
    IOS = 500

    @classmethod
    def get_list(cls):
        ret = []
        for e in cls:
           ret.append({'name': e.name, 'value': e.value})
        return ret

我需要隐藏ANDROIDIOS 以防止调用get_list 函数,但不想将它们从OsTypeEnum 中删除。

【问题讨论】:

  • if e.value < 400: ret.append(...)

标签: python filter enums items


【解决方案1】:

我不会硬编码要排除的成员列表,而是将该信息作为每个成员的一部分。我将使用 aenum1 显示代码,但可以使用 stdlib 版本来完成,只是更冗长。

from aenum import Enum

class OsTypeEnum(Enum):
    #
    _init_ = 'value type'
    #
    WINDOWS = 100, 'pc'
    LINUX = 200, 'pc'
    MAC = 300, 'pc'
    ANDROID = 400, 'mobile'
    IOS = 500, 'mobile'
    #
    @classmethod
    def get_pc_list(cls):
        ret = []
        for e in cls:
            if e.type == 'pc':
                ret.append({'name': e.name, 'value': e.value})
        return ret
    #
    @classmethod
    def get_mobile_list(cls):
        ret = []
        for e in cls:
            if e.type == 'mobile':
                ret.append({'name': e.name, 'value': e.value})
        return ret

通过在成员上存储额外的信息,您可以更轻松地获取原始列表以及其他列表。

在使用中,它看起来像:

>>> OsTypeEnum.get_pc_list()
[{'name': 'WINDOWS', 'value': 100}, {'name': 'LINUX', 'value': 200}, {'name': 'MAC', 'value': 300}]

>>> OsTypeEnum.get_mobile_list()
[{'name': 'ANDROID', 'value': 400}, {'name': 'IOS', 'value': 500}]

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。

【讨论】:

  • 你的回答太棒了。我将使用 aenum 使用 namedtuple 重构我的代码。它更具可读性。
  • @Jackeroo:请注意,如果您使用namedtuple,则成员的值将是,例如(100, "pc"),而不是100
  • 谢谢。 namedtuple 访问“代码”可能有点烦人,所以我将使用 aenum 重构代码。
【解决方案2】:

您可以创建排除的枚举列表

class OsTypeEnum(Enum):
    WINDOWS = 100
    LINUX = 200
    MAC = 300
    ANDROID = 400
    IOS = 500

    @classmethod
    def get_list(cls):
        ret = []
        for e in cls:
            if e not in cls.__get_excluded():
                ret.append({'name': e.name, 'value': e.value})
        return ret

    @classmethod
    def __get_excluded(cls):
        return [cls.ANDROID, cls.IOS]

【讨论】:

    【解决方案3】:

    这似乎是if 语句的好候选。 if枚举不是ANDROIDIOS,则将其添加到返回值。

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2019-06-15
      • 2022-01-16
      • 2012-11-15
      相关资源
      最近更新 更多