如何在Python中表示“Enum”?

2024-04-23 20:02:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何在Python中表示等同于枚举的值?


Tags: 项目开发人员
3条回答

在PEP 435之前,Python没有对等的版本,但是您可以实现自己的版本。

我自己,我喜欢保持简单(我在网上看到过一些非常复杂的例子),就像这样。。。

class Animal:
    DOG = 1
    CAT = 2

x = Animal.DOG

在Python 3.4(PEP 435)中,可以将Enum设为基类。这将为您提供一点额外的功能,如PEP中所述。例如,枚举成员不同于整数,它们由namevalue组成。

class Animal(Enum):
    DOG = 1
    CAT = 2

print(Animal.DOG)
# <Animal.DOG: 1>

print(Animal.DOG.value)
# 1

print(Animal.DOG.name)
# "DOG"

如果不想键入值,请使用以下快捷方式:

class Animal(Enum):
    DOG, CAT = range(2)

Enum实现can be converted to lists and are iterable。其成员的顺序是声明顺序,与成员的值无关。例如:

class Animal(Enum):
    DOG = 1
    CAT = 2
    COW = 0

list(Animal)
# [<Animal.DOG: 1>, <Animal.CAT: 2>, <Animal.COW: 0>]

[animal.value for animal in Animal]
# [1, 2, 0]

Animal.CAT in Animal
# True

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

要获得更高级的枚举技术,请尝试aenum library(2.7,3.3+,与enum34作者相同)。py2和py3之间的代码不完全兼容,例如,您需要^{} 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'

以下是一个实现:

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

其用法如下:

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

print(Animals.DOG)

相关问题 更多 >