【转载】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 EnumAnimal = 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 AttributeErrorAnimals = Enum(["DOG", "CAT", "HORSE"])print Animals.DOG |
有用range实现的:
|
1
2
3
4
5
6
7
|
dog, cat, rabbit = range(3)# orclass Stationary: (Pen, Pencil, Eraser) = range(0, 3)print Stationary.Pen |
有用tuple实现的:
|
1
2
3
4
|
class Enum(tuple): __getattr__ = tuple.indexState = Enum(['Unclaimed', 'Claimed'])print State.Claimed |
有用namedtuple实现的:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from collections import namedtupledef 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.使用枚举类型设置常量以往设置常量,通常将常量放置在接口中,这样 ...
随机推荐
- 【状压DP】【P3959】【NOIP2017D2T2】宝藏
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 $n$ 个深埋在地下的宝藏屋, 也给出了这 $n$ 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决心亲自前往挖 ...
- shell中的颜色显示
By francis_hao Sep 30,2017 图片来自参考[1] 其中,"033"是八进制数,其对应的asciima也就是ESC.后面的颜色格式为:[背景 ...
- MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序
MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...
- 常州模拟赛d7t3 水管
分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...
- mysql中设置小数
decimal Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位.例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位. 例:decimal(2,1) ...
- How to solve “Device eth0 does not seem to be present, delaying initialization” error
Today, I encountered with a strange error after I cloned CentOS 6 guest machine in Oracle VirtualBox ...
- iOS 时间转换
#pragma mark - 获取当前时间戳 -(NSString *)getTimeSp{ NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:]; ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- charles https抓包
1. 配置 Charles 根证书 首先打开 Charles: Charles 启动界面 主界面 然后如下图操作: 之后会弹出钥匙串,如果不弹出,请自行打开钥匙串,如下图: 钥匙串 系统默认是不信 ...
- URI设计原则
以下是与 REST API 相关的重要术语: 资源(Resource) 是一个对象或对某物的表示.它有一些相关联的数据,并有一组方法进行操作. 例如:动物,学校和员工是资源.这些资源都有着删除,添加, ...