【问题标题】:Generate an enum class from a list in python从python中的列表生成一个枚举类
【发布时间】:2021-12-10 01:45:21
【问题描述】:

假设我有以下枚举类:

from enum import Enum, unique

@unique
class Indication(Enum):
    Fruit1 = 'apple'
    Fruit2 = 'orange'
    Fruit3 = 'banana'

想从python列表中生成这个枚举类,即

Listoffruits = [('Fruit1', 'apple'),  ('Fruit2', 'orange'), ('Fruit3',  'banana')]

如何有效地做到这一点?

【问题讨论】:

标签: python-3.x


【解决方案1】:

如果您想动态定义Enum,请使用Functional API

import enum

Listoffruits = [('Fruit1', 'apple'),  ('Fruit2', 'orange'), ('Fruit3',  'banana')]

Indication = enum.Enum('Indication', dict(Listoffruits))

您可以使用字符串格式来“生成” Python 代码:

def generate_enum(enumClass, enumDict):
    """
    Generates python code for an Enum
    """

    enum_template = """
@unique
class {enumClass}(Enum)
{enumBody}
"""

    enumBody = '\n'.join([f"    {name} = '{value}'" for (name,value) in enumDict.items()])

    return enum_template.format(enumClass=enumClass,enumBody=enumBody)

print(generate_enum('Indication',dict(Listoffruits)))

生成的代码将是:

@unique
class Indication(Enum)
    Fruit1 = 'apple'
    Fruit2 = 'orange'
    Fruit3 = 'banana'

【讨论】:

  • 在传递给enum.Enum 之前,您不需要将元组列表转换为字典。此外,您的第二个解决方案只生成一个带有枚举类的字符串,但您需要在代码中使用之前对其进行评估。它比枚举函数式 api 方法更好吗?
【解决方案2】:

Enum docs mentions a functional API。所以你可以这样做:

from enum import Enum
Indication = Enum('Indication', dict(Listoffruits))

证明:

>>> list(Indication)
[<Indication.Fruit1: 'apple'>,
 <Indication.Fruit2: 'orange'>,
 <Indication.Fruit3: 'banana'>]

作为探索 Python 的问题,您可以考虑一下这个 hack 是如何工作的(确实如此):

from enum import Enum, unique

def inject_items(d, items):
    for k, v in items:
        d[k] = v

@unique
class Indication(Enum):
    inject_items(locals(), Listoffruits)

但这只是为了教育目的。我会为您使用Enum 的功能 API。

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2018-03-07
    • 1970-01-01
    • 2012-11-19
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2014-10-21
    相关资源
    最近更新 更多