Python的
在Python 3.6中,提供了
我知道标准库的实现已经花费了大量的时间和精力,所以可能有一些原因导致早期展示的Pythonic风格的声明性枚举版本不能正常工作。我的问题是,这种方法的问题和故障模式是什么,为什么会决定反对(或类似的决定) - 而选择在Python 3.6中包括auto特性?
enum.Enum
的声明式用法需要提供值,但在枚举的最基本用例中,我们实际上并不关心名称和值。我们只关心标志本身。最近阅读一个相关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
来帮助解决省略值的问题,但接口仍然很奇怪 - 您需要为每个成员指定auto()
值,并从不同的基类继承,以修复__repr__
:class Color(NoValue):
red = auto()
blue = auto()
green = auto()
我知道标准库的实现已经花费了大量的时间和精力,所以可能有一些原因导致早期展示的Pythonic风格的声明性枚举版本不能正常工作。我的问题是,这种方法的问题和故障模式是什么,为什么会决定反对(或类似的决定) - 而选择在Python 3.6中包括auto特性?
AutoEnum
的实现,但是它很快就深入到_generate_next_value_
的内容中。可以说元类使用了与我的问题描述中相同的基本技巧吗?还是完全不同的实现方式? - wimdefaultdict
使用__missing__
方法,而_EnumDict
捕获__getitem__
查找并从那里处理它。 - Ethan Furmanaenum
中的许多复杂性都是为了支持 Python 2.x 系列。我几天前打开了Enum
的标准库版本,感觉就像呼吸新鲜空气一样! - Ethan Furmanaenum
的参考。对于可能希望有点更神奇的东西的用户来说,它似乎是一个很好的参考资料。 - Dimitris Fasarakis Hilliard