如何让 Enum 的成员进入全局命名空间?

Eth*_*man 4 python enums

Python 现在有一个 Enum 类型(PEP 435在 3.4 中新增,并且还向后移植),虽然命名空间是一件好事,但有时 Enum 更像是常量,并且枚举成员应该位于全局(呃,模块)命名空间中.

所以而不是:

Constant(Enum):
    PI = 3.14

...

area = Constant.PI * r * r
Run Code Online (Sandbox Code Playgroud)

我只能说:

area = PI * r * r
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以从Constant.PI到 just PI

Eth*_*man 8

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

globals().update(Constant.__members__)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为__members__dict-like 对象,其中包含 Enum 类的名称和成员。

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

@classmethod
def export_to(cls, namespace):
    namespace.update(cls.__members__)
Run Code Online (Sandbox Code Playgroud)

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

Constant.export_to(globals())
Run Code Online (Sandbox Code Playgroud)

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

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

area = C.PI * r * r
Run Code Online (Sandbox Code Playgroud)