我主要是C#开发人员,但目前正在使用Python开发项目。 html
我怎样才能表明Python中的Enum? python
def M_add_class_attribs(attribs): def foo(name, bases, dict_): for v, k in attribs: dict_[k] = v return type(name, bases, dict_) return foo def enum(*names): class Foo(object): __metaclass__ = M_add_class_attribs(enumerate(names)) def __setattr__(self, name, value): # this makes it read-only raise NotImplementedError return Foo()
像这样使用它: ide
Animal = enum('DOG', 'CAT') Animal.DOG # returns 0 Animal.CAT # returns 1 Animal.DOG = 2 # raises NotImplementedError
若是您只须要惟一的符号而且不关心值,请替换此行: ui
__metaclass__ = M_add_class_attribs(enumerate(names))
有了这个: this
__metaclass__ = M_add_class_attribs((object(), name) for name in names)
最佳的解决方案取决于您从假 enum
要求。 idea
简单枚举: spa
若是您只须要enum
来标识不一样项的名称列表,那么马克·哈里森 (上述)的解决方案就很棒: .net
Pen, Pencil, Eraser = range(0, 3)
使用range
还能够设置任何起始值 : 设计
Pen, Pencil, Eraser = range(9, 12)
除上述内容外,若是您还要求这些项目属于某种容器 ,则将它们嵌入一个类中: code
class Stationery: Pen, Pencil, Eraser = range(0, 3)
要使用枚举项目,您如今须要使用容器名称和项目名称:
stype = Stationery.Pen
复合枚举:
对于一长串的枚举或更复杂的枚举使用,这些解决方案将没法知足要求。 您能够参考《 Will Ware在Python Cookbook中发布的Python 模拟枚举 》中的食谱 。 该版本的在线版本可在此处得到 。
更多信息:
PEP 354:Python枚举中有一个有趣的细节,建议使用Python枚举,以及为何拒绝该枚举。
虽然最初的枚举建议PEP 354在几年前被拒绝,但它仍在继续提出。 原本打算将某种枚举添加到3.2,可是将其推回到3.3,而后被遗忘了。 如今有一个PEP 435,打算包含在Python 3.4中。 PEP 435的参考实现是flufl.enum
。
截至2013年4月,彷佛已经达成了广泛共识,即应该在3.4的标准库中添加一些内容 ,只要人们能够就该“内容”达成共识。 那是困难的部分。 请参阅此处和此处开始的主题以及2013年前几个月的其余六个主题。
同时,每次出现这种状况时,都会在PyPI,ActiveState等上出现大量新设计和实现,所以,若是您不喜欢FLUFL设计,请尝试进行PyPI搜索 。
在2013-05-10上,Guido赞成将PEP 435接受到Python 3.4标准库中。 这意味着Python终于内置了对枚举的支持!
有一个适用于Python 3.三、3.二、3.一、2.七、2.六、2.5和2.4的反向端口。 在Pypi上为enum34 。
宣言:
>>> from enum import Enum >>> class Color(Enum): ... red = 1 ... green = 2 ... blue = 3
表示:
>>> print(Color.red) Color.red >>> print(repr(Color.red)) <Color.red: 1>
迭代:
>>> for color in Color: ... print(color) ... Color.red Color.green Color.blue
程序访问:
>>> Color(1) Color.red >>> Color['blue'] Color.blue
有关更多信息,请参阅建议 。 官方文档可能很快就会发布。
Python的新标准是PEP 435 ,所以Enum类将在未来的Python版本中可用:
>>> from enum import Enum
可是,如今就开始使用它,您能够安装激发PEP的原始库 :
$ pip install flufl.enum
而后,您能够根据其在线指南使用它 :
>>> from flufl.enum import Enum >>> class Colors(Enum): ... red = 1 ... green = 2 ... blue = 3 >>> for color in Colors: print color Colors.red Colors.green Colors.blue