当前位置: 首页 > news >正文

Python: Enum枚举的实现

      从C系语言过来用Python,好不容易适应了写代码不打花括号,突然有一天发现它居然木有枚举……于是stackoverflow了一把,发现神人的枚举(enum)实现到处都是,于是汉化总结过来。

如果是新版Python用户(Python 3.4 with PEP 435):

from enum import Enum
Animal = Enum('Animal', 'ant bee cat dog')

 

or

class Animals(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

 

旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:

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'

 

有复杂的:

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

 

有带值到名称映射的:

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实现的:

class Enum(set):
    def __getattr__(self, name):
        if name in self:
            return name
        raise AttributeError

Animals = Enum(["DOG", "CAT", "HORSE"])
print Animals.DOG

 

有用range实现的:

dog, cat, rabbit = range(3)

# or

class Stationary:
    (Pen, Pencil, Eraser) = range(0, 3)
print Stationary.Pen

 

有用tuple实现的:

class Enum(tuple): __getattr__ = tuple.index

State = Enum(['Unclaimed', 'Claimed'])
print State.Claimed

 

有用namedtuple实现的:

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

相关文章:

  • IntelliJ Idea学习之常用快捷键
  • Facebook AccountKit 接入的坑点
  • oracle数据查询的基本方法
  • 以Java工程师为例,技术面试应该怎么准备?
  • 安装Android Studio遇到中文乱码的解决方法
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • Nginx爆出漏洞 百万网站面临风险
  • 免费https证书
  • Linux 下压缩与解压.zip和.rar及.7z文件
  • JDK里的设计模式
  • Oracle查询访问同一表的两个以上索引(二)
  • Android CMake轻松实现基于OpenSSL的HmacSHA1签名
  • linux下c++使用第三方lib编译lib
  • 谈谈神秘的ES6——(三)ES6的函数
  • 思科单臂路由配置
  • Consul Config 使用Git做版本控制的实现
  • CSS 三角实现
  • go语言学习初探(一)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java 最常见的 200+ 面试题:面试必备
  • jquery cookie
  • magento 货币换算
  • Python进阶细节
  • Quartz初级教程
  • SOFAMosn配置模型
  • SpringCloud集成分布式事务LCN (一)
  • 读懂package.json -- 依赖管理
  • 二维平面内的碰撞检测【一】
  • 机器学习学习笔记一
  • 算法---两个栈实现一个队列
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #FPGA(基础知识)
  • #include到底该写在哪
  • #考研#计算机文化知识1(局域网及网络互联)
  • $NOIp2018$劝退记
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (十一)手动添加用户和文件的特殊权限
  • (五)网络优化与超参数选择--九五小庞
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)http-server应用
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .“空心村”成因分析及解决对策122344
  • .htaccess配置重写url引擎
  • .net CHARTING图表控件下载地址
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Micro Framework初体验(二)