python - 如何在 Python 中表示 'Enum'?

标签 python python-3.x enums

我主要是一名 C# 开发人员,但我目前正在开发一个 Python 项目。

如何在 Python 中表示等效的枚举?

最佳答案

Enums已添加到 Python 3.4,如 PEP 435 中所述.也是backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4在 pypi 上。

如需更高级的枚举技术,请尝试 aenum library (2.7、3.3+,与 enum34 的作者相同。代码在 py2 和 py3 之间不完全兼容,例如,您需要 __order__ in python 2

  • 要使用 enum34,请执行 $ pip install enum34
  • 要使用 aenum,请执行 $ pip install aenum

安装 enum(无数字)将安装完全不同且不兼容的版本。


from enum import Enum     # for enum34, or the stdlib version
# from aenum import Enum  # for the aenum version
Animal = Enum('Animal', 'ant bee cat dog')

Animal.ant  # returns <Animal.ant: 1>
Animal['ant']  # returns <Animal.ant: 1> (string lookup)
Animal.ant.name  # returns 'ant' (inverse lookup)

或等效:

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

在早期版本中,实现枚举的一种方法是:

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)

这会覆盖具有该名称的任何内容,但对于在输出中呈现枚举很有用。如果反向映射不存在,它将抛出 KeyError。第一个例子:

>>> Numbers.reverse_mapping['three']
'THREE'

如果您使用 MyPy,另一种表达“枚举”的方式是使用 typing.Literal。 .

例如:

from typing import Literal #python >=3.8
from typing_extensions import Literal #python 2.7, 3.4-3.7


Animal = Literal['ant', 'bee', 'cat', 'dog']

def hello_animal(animal: Animal):
    print(f"hello {animal}")

hello_animal('rock') # error
hello_animal('bee') # passes

关于python - 如何在 Python 中表示 'Enum'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36932/

相关文章:

python - 是否可以运行连接到 virtualbox 实例的 pydev?

python - 如何获取列表中某些索引值的第一个?

python - 将 self 变量作为参数传递给 mixin 父方法的正确方法

java - 在Android中存储大量静态数据

android - 在 android 中使用枚举

python - pyodbc (4.0.23) 从 Python3 连接到 MySQL 时出错

python - Pandas 使用与其他 Pandas 列相对应的先验值填充 NaN

python - BeautifulSoup 为什么不抓取整个网页?

python - 如何在不忘记在子类中添加属性装饰器的情况下覆盖抽象属性方法?

swift - 使用枚举登录