python 枚举类型实现

xiaoxiao2021-02-28  75

      从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())
转载请注明原文地址: https://www.6miu.com/read-96431.html

最新回复(0)