前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python: Enum枚举的实现

Python: Enum枚举的实现

作者头像
bear_fish
发布2018-09-20 14:30:47
8410
发布2018-09-20 14:30:47
举报
文章被收录于专栏:用户2442861的专栏

http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html

   从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())

分类: Python

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年04月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档