0. 本文来历

  • 我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一个dict如下

     orders_map = {
         "first": 0,
         "second": 1,
         "third": 2,
         "fourth": 3,
         "fifth": 4,
         "sixth": 5,
         "seventh": 6,
         "eighth": 7,
         "last": -1,
         "second_to_last": -2,
         "third_to_last": -3,
         "fourth_to_last": -4,
         "fifth_to_last": -5,
         "sixth_to_last": -6,
         "seventh_to_last": -7,
         "eighth_to_last": -8,
     }
  • 于是乎顺道看了下它其他的源代码,在settings这个模块中有如下一段

     class Scope(Enum):
         CLASS = 1
         MODULE = 2
         SESSION = 3
     ​
     ​
     class Settings:
         """Holds all configuration settings."""
         valid_scopes = {
             "class": Scope.CLASS,
             "module": Scope.MODULE,
             "session": Scope.SESSION,
        }
        ...
  • 之前在python中使用枚举更多是用来遍历容器(确切的说列表,虽说它支持多数sequence)

     list1 = [1,3,5,7]
     for i,v in enumerate(list1):
         print(f'第{i+1}个元素是{v}')
         
     # 输出
     第1个元素是1
     第2个元素是3
     第3个元素是5
     第4个元素是7

1. 什么是枚举enumeration

枚举模块(enum)是Python 3.4添加的功能,什么是枚举(enumeration)呢?根据官方文档:

An enumeration is a set of symbolic names bound to unique, constant values. Within an enumeration, the values can be compared by identity, and the enumeration itself can be iterated over

即枚举代表了一系列互不相同的常量,这一系列常量可以通过identity互相比较,也可以进行迭代。

 from enum import Enum
 # 比如一个环境的定义
 class Env(Enum):
  UI = 0
  API = 1
  PERFORMANCE = 2
  COMP = 3
 ​
 ​

2. 枚举的应用场景

PEP 435中的介绍

The properties of an enumeration are useful for defining an immutable, related set of constant values that may or may not have a semantic meaning.

在Python中,使用枚举的目的主要是方便常量的管理,方便记忆的同时使代码更加简洁易读

举个例子,在代码中通常使用不同的整数代表一些常量。比如用0代表UI,1代表API等。但是带来的麻烦是:写代码/阅读代码的人极有可能不明白这个0背后的意义。用枚举就可以解决这个问题。

而且注意:枚举的value一旦确定,是不可更改的,这样就保证了常量的安全

3. 使用

name和value属性

  • 类名.Field.name 访问字段名

  • 类名.Field.value 访问字段值(更常用)

 from enum import Enum
 ​
 ​
 # 比如一个环境的定义
 class Env(Enum):
     UI = 0
     API = 1
     PERFORMANCE = 2
     COMP = 3
 ​
 # 典型的访问 类名.Field.name
 print(Env.COMP.name)   # COMP
 print(Env.COMP.value)  # 3
 ​

不可变

  • 有点常量的感觉,但这点是非常有优势的

 Env.COMP.value = 4
 Traceback (most recent call last):
   File "D:\enum_test.py", line 14, in <module>
     Env.COMP.value = 4
   File "D:\Python39\lib\types.py", line 182, in __set__
     raise AttributeError("can't set attribute")
 AttributeError: can't set attribute

不仅仅支持数字

 class Config(Enum):
     HOST = 'https://www.baidu.com'
     DB = '192.168.1.1'
     PORT = 3306
     USERNAME = 'ADMIN'
     PASSWORD = '123456'
 ​
 ​
 print(Config.HOST.value)  # https://www.baidu.com

unique 装饰器

  • 要对enum的item进行唯一性限制可以用该装饰器

     from enum import Enum,unique
     ​
     class Env1(Enum):
         MONDAY = 1
         FLAG = 1
     ​
     print(Env1.FLAG.value)  # 不加装饰器可以重复
     ​
     @unique
     class Env2(Enum):
         MONDAY = 1
         FLAG = 1
         
     Traceback (most recent call last):
       File "D:\enum_test.py", line 10, in <module>
         class Env2(Enum):
       File "D:\Python39\lib\enum.py", line 1013, in unique
         raise ValueError('duplicate values found in %r: %s' %
     ValueError: duplicate values found in <enum 'Env2'>: FLAG -> MONDAY

4. 参考

  • enum还有一些其他的功能,比如

    • auto:自动产生一些内容

       >>> from enum import Enum, auto
       >>> class Color(Enum):
       ...     RED = auto()
       ...     BLUE = auto()
       ...     GREEN = auto()
    • IntEnum继承自int和Enum,它只允许枚举的value为整数型

    • Flag和Enum的不同在于:

      • Flag的value只能是整数;

      • Flag支持位运算符(&与、|或、^异或、~取反)

    • IntFlag继承自int和Flag,因此int和Flag的特性它都有,即

      • IntFlag的value只能是整数;

      • IntFlag支持位运算符(&与、|或、^异或、~取反)

      • IntFlag还能当成整数用,比如和整数进行运算,索引等等

  • 更多信息可以参考官文:https://docs.python.org/3.9/library/enum.html?highlight=enum#module-enum

最新文章

  1. MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)
  2. C#中Delegate和Event以及它们的区别(转载)
  3. ubuntu 创建快捷方式
  4. Codeforces 716C[数论][构造]
  5. No.004 Median of Two Sorted Arrays
  6. appcan weixin 开发
  7. POJ 2031 Building a Space Station (最小生成树)
  8. 《javascript高级程序设计》对象图
  9. qt example
  10. jsp程序设计:jstl之JSTL标签库
  11. 树莓派(1)- Raspberry Pi 3B 安装系统并联网
  12. ArcGIS API for JavaScript 入门教程[0] 目录
  13. Java基础9-死锁;String;编码
  14. java代码审计中的一些常见漏洞及其特征函数
  15. php内核之HashTable
  16. Bootstrap的Model源码详细注释 (转)
  17. python面向对象三大特性之一继承、多态、封装
  18. 深入浅出JavaScript(一)
  19. 亚马逊商品页面的简单爬取 --Pyhon网络爬虫与信息获取
  20. 记一次无法正常本地登陆Linux服务器(确定密码正确)

热门文章

  1. 干货,深入剖析ReentrantLock源码,推荐收藏
  2. 如何理解Java中眼花缭乱的各种并发锁?
  3. centos7 uwsgi 加入系统服务
  4. 深度学习之深L层神经网络
  5. VS 新版本无法打开旧项目问题处理
  6. &lt;七&gt;深入理解new和delete的原理
  7. springboot接收前端传参的几种方式
  8. Redis如何模糊匹配Key值
  9. 简易博客页面小项目 html css
  10. utf-8与utf8mb4与base64和md5