Python 在 3.4 及更高版本中提供了原生 Enum 类型。对于早期版本,您可以使用 enum34 或 aenum 等第三方库。
使用 enum34 或 stdlib Enum:
from enum import Enum Animal = Enum('Animal', 'ant bee cat dog') Animal.ant # <Animal.ant: 1> Animal['ant'] # <Animal.ant: 1> (string lookup) Animal.ant.name # 'ant' (inverse lookup)
使用aenum:
from aenum import Enum Animal = Enum('Animal', 'ant bee cat dog') Animal.ant # same as enum34 Animal['ant'] # same as enum34 Animal.ant.name # same as enum34
使用早期的 Python 版本:
对于早期的 Python 版本,您可以使用如下自定义函数:
def enum(**enums): return type('Enum', (), enums) Numbers = enum(ONE=1, TWO=2, THREE='three') Numbers.ONE # 1 Numbers.TWO # 2 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 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 = enum('ZERO', 'ONE', 'TWO') Numbers.reverse_mapping['1'] # 'ONE'
Typing.Literal (MyPy):
在 MyPy 中,您可以使用 Literal 定义枚举:
from typing import Literal Animal = Literal['ant', 'bee', 'cat', 'dog'] def hello_animal(animal: Animal): print(f"hello {animal}")
This将阻止非枚举值的分配。
以上是如何在 Python 中有效地使用和表示枚举?的详细内容。更多信息请关注PHP中文网其他相关文章!