假设我有以下枚举:
class LineStyle(Enum):
SOLID = 'solid'
DASHED = 'dashed'
DASHDOT = 'dashdot'
DOTTED = 'dotted'
是否可以通过某种方式直接从该枚举中导入字段?
例如:
from mymodule.LineStyle import SOLID, DASHED # does not work
我能想到的唯一解决方法是将所有枚举字段声明为模块变量:
class LineStyle(Enum):
SOLID = 'solid'
DASHED = 'dashed'
DASHDOT = 'dashdot'
DOTTED = 'dotted'
SOLID = LineStyle.SOLID
DASHED = LineStyle.DASHED
DASHDOT = LineStyle.DASHDOT
DOTTED = LineStyle.DOTTED
有没有更优雅的方法来做到这一点?
最佳答案
没有。使用 import
只能在当前命名空间中添加指向模块对象本身或模块中顶级名称的引用。枚举值不是模块中的顶级名称,除非您明确地将它们放在那里,就像在您的解决方法中一样。
您可以通过添加 __members__
attribute 中的所有信息自动将这些名称分配给全局变量到你的模块全局:
globals().update(LineStyle.__members__)
globals()
function为您提供对当前模块命名空间的引用,让您可以动态地将名称添加到该命名空间。 LineStyle.__members__
属性是名称到值的映射(包括 aliases ),因此上面将所有名称添加到全局命名空间:
>>> from enum import Enum
>>> class LineStyle(Enum):
... SOLID = 'solid'
... DASHED = 'dashed'
... DASHDOT = 'dashdot'
... DOTTED = 'dotted'
...
>>> SOLID
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'SOLID' is not defined
>>> globals().update(LineStyle.__members__)
>>> SOLID
<LineStyle.SOLID: 'solid'>
如果您不想在其中包含别名,请使用 for
循环,遍历 LineStyle
对象。这只会为您提供成员对象,然后您可以从中提取名称:
for member in LineStyle:
globals()[member.name] = member
关于python - 是否可以在 Python 3 中直接导入枚举字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016286/