python - 如何构建不区分大小写的枚举?

标签 python python-2.7 enums

我有一个简单的 Python 2.7 枚举:

from enum import Enum

class Label(enum):
    RedApple = 1
    GreenApple = 2

我希望能够使用不区分大小写的键创建枚举对象:

fruitname = "redapple"
a = Label[fruitname]

我试图创建一个 __init__ 方法:

def __init__(self, key):
    super(Label, self).__init__()
    pass # do comparison here

但我一直遇到错误:

super(Label, self).__init__()
NameError: global name 'Label' is not defined

我想对 key.lower().strip() 进行比较。这可能吗?

最佳答案

在 Python 3.6 和 aenum 2.012(与 2.7 和 3.0+ 兼容)添加了一个新方法:_missing_2

在引发 ValueError 之前调用此方法,使自定义代码有机会尝试按值查找枚举成员。不幸的是,这使得它不适合您的用例——按名称查找。

幸运的是,aenum 有一个额外的选项,可以定义一个 _missing_name_ 方法3,当名称查找失败时将调用该方法。

你上面的代码应该是这样的:

from aenum import Enum

class Label(Enum):

    RedApple = 1
    GreenApple = 2

    @classmethod
    def _missing_name_(cls, name):
        for member in cls:
            if member.name.lower() == name.lower():
                return member

并在使用中:

>>> Label['redapple']
<Label.RedApple: 1>

如果坚持使用 3.6 stdlib(或想与其保持兼容),您可以(ab)使用 _missing_ 但是:

  • 您将不得不执行 Label('redapple')(圆括号,而不是方括号),并且
  • 您将反对枚举的设计('redapple' 是名称,而不是值)

1 披露:我是 Python stdlib Enum 的作者, enum34 backport , 和 Advanced Enumeration (aenum)图书馆。

2 enum34没有这些改进,因为它只是为了修复错误而维护。

3 _missing_value_aenum 中是首选,因为它更明确地说明了它正在检查的内容,但它又回到了 _missing_ 与 stdlib 的兼容性。

4 aenum v2.0.2 有一个错误,如果 _missing_name_ 没有被覆盖,则为值和名称调用 _missing_ -- 这个在 v2.0.3+ 中修复。

关于python - 如何构建不区分大小写的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658609/

相关文章:

enums - 如何在枚举中保留值类型

python - Django 管理后保存方法 - 怎么做?

Python:如何关闭mat文件?

python - 使用 k.clear_session() 和 tf.reset_default_graph() 清除后续模型之间的图表

python-2.7 - 实现文本文件的主题建模后,我得到了相似的词来描述所有主题,结果不准确。

python - 根据列中值的前缀删除 Pandas 行

Java枚举自动递增条目?

java - 使用注释的 Hibernate 枚举映射

python - 使用相同的 'for' 循环和 'all()' 函数会产生不同的结果

c++ - python 代码到 c++ lib 或 dll