python枚举函数取值 python枚举有什么用

python 怎么通过枚举的值从C系语言过来用Python , 好不容易适应了写代码不打花括号 , 突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来 。
如果是新版Python用户(Python 3.4 with PEP 435):
from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')
or
class Animals(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:
def enum(**enums):
return type('Enum', (), enums)
Numbers = enum(ONE=1, TWO=2, THREE='three')
# Numbers.ONE == 1, Numbers.TWO == 2 and Numbers.THREE == 'three'
有复杂的:
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
Numbers = enum('ZERO', 'ONE', 'TWO')
# Numbers.ZERO == 0 and Numbers.ONE == 1
有带值到名称映射的:
def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
reverse = dict((value, key) for key, value in enums.iteritems())
enums['reverse_mapping'] = reverse
return type('Enum', (), enums)
# Numbers.reverse_mapping['three'] == 'THREE'
有用set实现的:
class Enum(set):
def __getattr__(self, name):
if name in self:
return name
raise AttributeError
Animals = Enum(["DOG", "CAT", "HORSE"])
print Animals.DOG
有用range实现的:
dog, cat, rabbit = range(3)
# or
class Stationary:
(Pen, Pencil, Eraser) = range(0, 3)
print Stationary.Pen
有用tuple实现的:
class Enum(tuple): __getattr__ = tuple.index
State = Enum(['Unclaimed', 'Claimed'])
print State.Claimed
有用namedtuple实现的:
from collections import namedtuple
def enum(*keys):
return namedtuple('Enum', keys)(*keys)
MyEnum = enum('FOO', 'BAR', 'BAZ')
# 带字符数字映射的,像C/C++
def enum(*keys):
return namedtuple('Enum', keys)(*range(len(keys)))
# 带字典映射的,可以映射出各种类型 , 不局限于数字
def enum(**kwargs):
return namedtuple('Enum', kwargs.keys())(*kwargs.values())
干货 - 一文搞定Python 枚举enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性 。我们可以使用enum创建具有良好定义的标识符,而不是直接使用魔法字符串或整数 , 也便于开发工程师的代码维护 。
我们可以使用class语法创建一个枚举类型,方便我们进行读写,另外,根据函数API的描述定义,我们可以创建一个enum的子类,如下:
enum自带属性name和value , 日常工作中使用最多的也是这两个属性 , 我们打印看看结果:
枚举支持迭代和遍历顺序 。举个例子:
打印结果:
可以看出 , 遍历的每一个status是一个独立的枚举成员,拥有name和value属性 。
另外,我们也可以使用如下形式来进行枚举遍历:
上 面我们创建的枚举类中,value值是可以重复的,如果我们不想枚举类中的值重复可以是用装饰器@unique , 举例如下:
我们运行后 , 报如下异常:
我们查看源代码,发现加入此装饰器的枚举类型,unique方法会将其__members__.items()进行遍历,追加到duplicates列表中,如果发现列表不为空,则抛出如上异常信息 。
此功能用于我们在使用枚举时,只在意枚举的标识符的含义而不在意值的情况下,但是如果需要与字符串或整数混合使用就要额外注意 。下面贴上官方的示例:
可以发现,使用auto()得到的是整数自增型,如果我们需要别的方式,只需要在我们的枚举类中,重写_generate_next_value_方法 。

推荐阅读