【python】Python: Enum枚举的实现
从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】Python: Enum枚举的实现的更多相关文章
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- 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 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...
- 关于python中Enum的个人总结
关于python中Enum的个人总结 初识 可以通过enum模块导入 语法 初始化: 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中name ...
- c# (ENUM)枚举组合类型的谷歌序列化Protobuf
c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...
- python --- Python中的callable 函数
python --- Python中的callable 函数 转自: http://archive.cnblogs.com/a/1798319/ Python中的callable 函数 callabl ...
- C#将Enum枚举映射到文本字符串
介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...
- MVC3不能正确识别JSON中的Enum枚举值
一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...
- 161208、Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...
随机推荐
- ACM数论-快速幂
ACM数论——快速幂 快速幂定义: 顾名思义,快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. 原理: 以下以求a的b次方来介绍: 把b转换成 ...
- [python3.x]win 7 下Pyinstaller库的安装与使用---探索之路
一.下载安装包 cmd进入命令行,执行命令:pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz ...
- day 2 飞机大战原理
1. 程序的图片的坐标 (左上角为顶点) 2.图片变成动态的 3.集成显卡 和独立显卡
- 在线tidb+tipd+tikv扩容,迁移,从UC到阿里云
集群现状: 共有五个节点,配置为16核32g内存,数据节点为1T ssd盘,非数据节点为100g ssd盘: 角色规划: node1 tidb tipd node2 tidb tipd node3 t ...
- (转) 如何从 0 开始学 ruby on rails (漫步版)
原文:http://readful.com/post/12322300571/0-ruby-on-rails ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架, ...
- CentOS下安装Tomcat环境
一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...
- Visual Studio 2015 Test Explorer does not show anything
Problem After install Visual Studio 2015 community and NUnit Test Adapter, I cannot find test cases ...
- Appium-原理、设置
Appium是支持跨平台的移动端自动化测试框架. 下面介绍下Appium的具体工作流程: 首先,Appium server 默认监听4723端口,监听客户端的命令. 客户端指的是 我们编写的自动化测试 ...
- XX出行项目子系统-统计系统设计(定时器项目设计例子)
一. 引言 目前开发的XX出行系统,需要开发数据统计功能,鉴于约约出行系统已经在运营,并且有新版本的迭代,方便以后下个版本复用,遂新建一个子系统. 二. 架构设计 三. 具体实现 1.MySql数据库 ...
- NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)
很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...