在Python3中可以直接导入枚举字段吗?

2024-05-19 01:35:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下枚举:

class LineStyle(Enum):
    SOLID = 'solid'
    DASHED = 'dashed'
    DASHDOT = 'dashdot'
    DOTTED = 'dotted'

有可能以某种方式直接从这个枚举导入字段吗?在

例如:

^{pr2}$

我能想到的唯一解决方法是将所有枚举字段声明为模块变量:

class LineStyle(Enum):
    SOLID = 'solid'
    DASHED = 'dashed'
    DASHDOT = 'dashdot'
    DOTTED = 'dotted'

SOLID = LineStyle.SOLID
DASHED = LineStyle.DASHED
DASHDOT = LineStyle.DASHDOT
DOTTED = LineStyle.DOTTED

有没有更优雅的方式来做这个?在


Tags: 方法声明方式enumclassdottedsoliddashed
2条回答

不能直接导入枚举成员,但可以使用修饰符将枚举成员自动添加到globals(),这样就可以导入了。例如:

def global(enum):
    globals.update(enum.__members__)
    return enum


@global
class LineStyle(Enum):
    SOLID = 'solid'
    DASHED = 'dashed'
    DASHDOT = 'dashdot'
    DOTTED = 'dotted'

不可以。With import只能在当前命名空间中添加指向模块对象本身或模块中顶层名称的引用。枚举值不是模块中的顶级名称,除非您显式地将它们放在那里,例如在解决方法中。在

通过将^{} attribute中的所有信息添加到模块全局变量中,可以自动将这些名称分配给全局变量:

globals().update(LineStyle.__members__)

^{} function为您提供了对当前模块的命名空间的引用,允许您动态地向该命名空间添加名称。LineStyle.__members__属性是名称到值的映射(包括aliases),因此上面的操作将所有名称添加到全局命名空间:

^{pr2}$

如果不希望别名包含在其中,请使用for循环,遍历LineStyle对象。它只提供成员对象,然后可以从中提取名称:

for member in LineStyle:
    globals()[member.name] = member

相关问题 更多 >

    热门问题