如何使Enum的成员进入全局名称空间? - python

Python现在具有Enum类型(3.4 with PEP 435和alse backported中的新功能),尽管名称空间是一件好事,但有时Enums的使用更像是常量,并且枚举成员应位于全局(er,模块)中)名称空间。

所以代替:

Constant(Enum):
    PI = 3.14

...

area = Constant.PI * r * r

我可以说:

area = PI * r * r

Constant.PIPI是否有简单的方法?

python大神给出的解决方案

官方支持的方法是这样的:

globals().update(Constant.__members__)

这是可行的,因为__members__是类似dict的对象,其中包含Enum类的名称和成员。

我个人觉得很丑,通常将以下方法添加到Enum类中:

@classmethod
def export_to(cls, namespace):
    namespace.update(cls.__members__)

然后在我的顶级代码中我可以说:

Constant.export_to(globals())

注意:仅当模块只有一个这样的导出Enum时,将Enum导出到全局名称空间才有效。如果您有多个别名,最好为Enum本身使用一个较短的别名,并使用该别名代替污染全局名称空间:

class Constant(Enum):
    PI = ....
C = Constant

area = C.PI * r * r