如何在Python中表示“枚举”?

我主要是C#开发人员,但目前正在使用Python开发项目。 html

我怎样才能表明Python中的Enum? python


#1楼

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)

#2楼

最佳的解决方案取决于您从 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枚举,以及为何拒绝该枚举。


#3楼

虽然最初的枚举建议PEP 354在几年前被拒绝,但它仍在继续提出。 原本打算将某种枚举添加到3.2,可是将其推回到3.3,而后被遗忘了。 如今有一个PEP 435,打算包含在Python 3.4中。 PEP 435的参考实现是flufl.enum

截至2013年4月,彷佛已经达成了广泛共识,即应该在3.4的标准库中添加一些内容 ,只要人们能够就该“内容”达成共识。 那是困难的部分。 请参阅此处此处开始的主题以及2013年前几个月的其余六个主题。

同时,每次出现这种状况时,都会在PyPI,ActiveState等上出现大量新设计和实现,所以,若是您不喜欢FLUFL设计,请尝试进行PyPI搜索


#4楼

在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

有关更多信息,请参阅建议 。 官方文档可能很快就会发布。


#5楼

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
相关文章
相关标签/搜索