【发布时间】:2017-10-06 21:30:28
【问题描述】:
Python 的enum.Enum 的声明式使用需要提供值,而在枚举的最基本用例中,我们实际上并不关心名称和值。我们只关心哨兵本身。最近看了一篇related Q&A,发现可以使用枚举元类的__prepare__方法来获取这种声明:
class Color(Enum):
red
blue
green
让事情变得如此枯燥的实现实际上相当容易:
from collections import defaultdict
class EnumMeta(type):
@classmethod
def __prepare__(meta, name, bases):
return defaultdict(object)
def __new__(cls, name, bases, classdict):
classdict.default_factory = None
return type.__new__(cls, name, bases, classdict)
class Enum(metaclass=EnumMeta):
pass
在 Python 3.6 中,提供了 enum.auto 来帮助解决 omitting values 的问题,但界面仍然很奇怪 - 您需要为每个成员指定 auto() 值,并从不同的成员继承修复__repr__的基础:
class Color(NoValue):
red = auto()
blue = auto()
green = auto()
知道为标准库选择的实现已经投入了许多工时和非常谨慎的工作,因此之前演示的可以说更 Pythonic 的声明性枚举版本不能正常工作肯定是有原因的。
我的问题是,提议的方法有哪些问题和失败模式,为什么决定反对(或类似的方法) - 而 Python 3.6 中包含 auto 功能?
【问题讨论】:
标签: python enums metaclass python-3.6