【转载】Python: Enum枚举的实现
转自: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: Enum枚举的实现的更多相关文章
- Python Enum 枚举 用法汇总
Python Enum 枚举 用法汇总 import os import sys if sys.version_info.major + sys.version_info.minor * 0.1 &l ...
- Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中
Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中 python 的基本用法请浏览:https://www.cnblogs.com/ibingshan/p/98564 ...
- 【python】Python: Enum枚举的实现
从C#系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来. 如果是 ...
- python enum 枚举
http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html python 3.4+ from enum import Enu ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- Python 的枚举 Enum
枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' ...
- python基础——枚举类
python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...
- Android 中如何使用 enum / 枚举
如何在Android开发中合理的使用enum 欢迎大家访问我的Github开源库,这里有好玩的App源码,想和大家分享.https://github.com/ChoicesWang 转载请注明:htt ...
- 【转载】Java枚举的使用
枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中.此外,枚举类型还提供了安全检查功能.枚举类型本质上还是以类的形式存在. 1.使用枚举类型设置常量以往设置常量,通常将常量放置在接口中,这样 ...
随机推荐
- Python中的结构化数据分析利器-Pandas简介
Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发tea ...
- HDU4685:Prince and Princess(二分图匹配+tarjan)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- shell脚本实现轮询查看进程是否结束
功能需求: 一个shell脚本,为了使用多进程,启动十几个后台运行的程序,为了防止脚本比后台进程提前结束造成不可预估的影响,现要判断是否多个后台执行的已知进程已经结束,并在所有进程结束后做出相应操作. ...
- (译)理解python线程
看到一篇老外写的线程文章,很赞,零基础都能看懂.先贴在这里,有时间再翻译出来. http://agiliq.com/blog/2013/09/understanding-threads-in-pyth ...
- ZooKeeper食谱(八)
使用ZooKeeper构造高级别应用的指南 在这个文章中,你将会发现使用ZooKeeper来实现高级别功能的指南.所有的它们在客户端上被实现而不需要ZooKeeper特别的支持.希望社区将注意到这些约 ...
- 【PHP】Windows下配置用mail()发送邮件
ZZ:解决windows系统下php.ini邮件配置正确不发送邮件的问题 php mail()函数在windows不能用,需要安装sendmail,假如是用的XAMPP,则已经下载好,不需要重新下载~ ...
- Rabbit MQ 面试题相关
项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ...
- jenkins修改job默认名字
${GIT_BRANCH,fullName="false"}-${BUILD_NUMBER}-${GIT_REVISION,length=12}-${deploy_rollback ...
- Android应用程序App应用上线流程
对于很多初级开发者,可能对app应用上线不太了解,本文跟大家介绍一下怎么上线app应用.上线App并不是一件很困难的事情,App的应用功能也不需要很强大,甚至不用联网,只有简单的一两个页面的App应用 ...
- Ribbon自带负载均衡策略比较
Ribbon自带负载均衡策略比较 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientC ...