python 枚举类型实现

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

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

1
2
from  enum import  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  name in  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  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())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值