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

早过忘川 提交于 2019-12-11 16:45:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

我怎样才能代表Python中的Enum?


#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()

像这样使用它:

Animal = enum('DOG', 'CAT')
Animal.DOG # returns 0
Animal.CAT # returns 1
Animal.DOG = 2 # raises NotImplementedError

如果您只需要唯一的符号并且不关心值,请替换此行:

__metaclass__ = M_add_class_attribs(enumerate(names))

有了这个:

__metaclass__ = M_add_class_attribs((object(), name) for name in names)

#2楼

最佳的解决方案取决于您从 enum要求。

简单枚举:

如果您只需要enum来标识不同名称列表,那么马克·哈里森 (上述)的解决方案就很棒:

Pen, Pencil, Eraser = range(0, 3)

使用range还可以设置任何起始值

Pen, Pencil, Eraser = range(9, 12)

除上述内容外,如果您还要求这些项目属于某种容器 ,则将它们嵌入一个类中:

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、3.1、2.7、2.6、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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!