python 枚举类型实现

来源:互联网 发布:手机记牌器软件 2016 编辑:程序博客网 时间:2024/05/01 06:48

      从C系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来。

如果是新版Python用户(Python 3.4 with PEP 435):

1
2
from enumimport Enum
Animal= Enum('Animal','ant bee cat dog')

 

or

1
2
3
4
5
class Animals(Enum):
    ant= 1
    bee= 2
    cat= 3
    dog= 4

 

旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:

1
2
3
4
5
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'

 

有复杂的:

1
2
3
4
5
6
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

 

有带值到名称映射的:

1
2
3
4
5
6
7
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实现的:

1
2
3
4
5
6
7
8
class Enum(set):
    def __getattr__(self, name):
        if namein self:
            return name
        raise AttributeError
 
Animals= Enum(["DOG","CAT","HORSE"])
print Animals.DOG

 

有用range实现的:

1
2
3
4
5
6
7
dog, cat, rabbit = range(3)
 
# or
 
class Stationary:
    (Pen, Pencil, Eraser) = range(0,3)
print Stationary.Pen

 

有用tuple实现的:

1
2
3
4
class Enum(tuple): __getattr__ = tuple.index
 
State= Enum(['Unclaimed','Claimed'])
print State.Claimed

 

有用namedtuple实现的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collectionsimport 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())
原创粉丝点击