【python 内置模块】enum

2024-01-20 00:00:00

目录:

Python 的 enum 模块是标准库中用于创建枚举类型的强大工具,从 Python 3.4 版本开始引入。

基本枚举类

Enum 是 enum 模块的基础类,用于创建标准的枚举类型。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(Color.RED.name)       # 'RED'
print(Color.RED.value)      # 1

枚举成员有两个重要属性:name 和 value,分别用于获取成员的名称和值。
例如,Color.RED.name 返回 ‘RED’,Color.RED.value 返回 1。

整型枚举类

IntEnum 是 Enum 的子类,其成员同时也是整数的子类,这意味着它们可以直接与整数进行比较和运算。

from enum import IntEnum

class HttpStatus(IntEnum):
    OK = 200
    NOT_FOUND = 404
    SERVER_ERROR = 500

print(HttpStatus.OK == 200)  # 输出:True
print(HttpStatus.OK + 100)   # 输出:300

字符串枚举类

从 Python 3.11 开始,引入了 StrEnum 类,其成员是字符串的子类,可以直接与字符串进行比较。

from enum import StrEnum  # Python 3.11+

class LogLevel(StrEnum):
    DEBUG = "DEBUG"
    INFO = "INFO"
    WARNING = "WARNING"
    ERROR = "ERROR"

print(LogLevel.DEBUG == "DEBUG")   # 输出:True
print(LogLevel.DEBUG.lower())      # 输出:'debug'

标志枚举类

Flag 和 IntFlag 是特殊的枚举类,支持按位运算符(&、|、^、~),适用于需要组合多个标志的场景。

如下示例:ADMIN 是其它几个枚举的组合。

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()
    ADMIN = READ | WRITE | EXECUTE

自动赋值 auto()

当不关心枚举成员的具体值时,可以使用 auto() 函数自动分配值。

对于基本的 Enum 类,auto() 会从 1 开始递增分配整数值。

from enum import Enum, auto

class Color(Enum):
    RED = auto()    # 1
    GREEN = auto()  # 2
    BLUE = auto()   # 3

对于标志枚举类 Flag,auto() 会自动分配 2 的整数次方值(从 1 开始),确保每个标志的位是唯一的。

from enum import Flag, auto

class Permission(Flag):
    READ = auto()                       # 1 
    WRITE = auto()                      # 2
    EXECUTE = auto()                    # 4
    ADMIN = READ | WRITE | EXECUTE      # 7

唯一性约束 @unique 装饰器

默认情况下,枚举成员的值可以重复,但名称必须唯一,否则会报 TypeError 错误。

from enum import Enum

class Color(Enum):
    RED = 1   
    GREEN = 2  
    RED = 3   

print(Color.RED)
# raise TypeError('%r already defined as %r' % (key, self[key])) 
# TypeError: 'RED' already defined as 1

当多个成员具有相同的值时,第二个及之后的成员被视为第一个成员的别名。如下示例,BLUE 会被认为是 RED 的别名,所以三个比较都会返回 True。

from enum import Enum

class Color(Enum):
    RED = 1   
    GREEN = 2  
    BLUE = 1   

print(Color.RED == Color.BLUE)      # True
print(Color.RED.name == Color.BLUE.name)        # True
print(Color.RED.value == Color.BLUE.value)      # True

如果需要确保所有成员的值都是唯一的,可以使用 @unique 装饰器。

from enum import Enum, unique

@unique
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 1  # 这会引发ValueError:duplicate values found

枚举遍历

from enum import Enum

class Color(Enum):
    RED = 1   
    GREEN = 2  
    BLUE = 3   

for color in Color:
    print(color, color.name, color.value)

# Color.RED RED 1
# Color.GREEN GREEN 2
# Color.BLUE BLUE 3    

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: