【推荐】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
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3141810