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?
官方支持的方法是这样的:
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)
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |