首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中表示'Enum‘?

如何在Python中表示'Enum‘?
EN

Stack Overflow用户
提问于 2008-08-31 23:55:48
回答 43查看 1.1M关注 0票数 1.1K

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

如何在Python中表示Enum的等价物?

EN

回答 43

Stack Overflow用户

回答已采纳

发布于 2009-11-08 11:15:28

按照PEP 435中的描述,Enums已经添加到Python3.4中。它也在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之间不是完全兼容的,例如你需要__order__ in python 2)。

do $ pip install enum34

  • To $ pip install aenum

,do

  • To use enum34,do
    • aenum,do$ pip install aenum

安装enum (无编号)将安装一个完全不同且不兼容的版本。

代码语言:javascript
运行
复制
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)

或者等效地:

代码语言:javascript
运行
复制
class Animal(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

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

代码语言:javascript
运行
复制
def enum(**enums):
    return type('Enum', (), enums)

它的用法如下:

代码语言:javascript
运行
复制
>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

您还可以轻松地支持自动枚举,如下所示:

代码语言:javascript
运行
复制
def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

并像这样使用:

代码语言:javascript
运行
复制
>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

可以通过以下方式添加对值转换回名称的支持:

代码语言:javascript
运行
复制
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。在第一个示例中:

代码语言:javascript
运行
复制
>>> Numbers.reverse_mapping['three']
'THREE'

如果您正在使用MyPy,另一种表示“枚举”的方法是使用typing.Literal

例如:

代码语言:javascript
运行
复制
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
票数 2.9K
EN

Stack Overflow用户

发布于 2008-08-31 16:06:14

在PEP435之前,Python没有等价物,但您可以实现自己的。

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

代码语言:javascript
运行
复制
class Animal:
    DOG = 1
    CAT = 2

x = Animal.DOG

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

代码语言:javascript
运行
复制
from enum import Enum

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

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

print(Animal.DOG.value)
# 1

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

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

代码语言:javascript
运行
复制
class Animal(Enum):
    DOG, CAT = range(2)

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

代码语言:javascript
运行
复制
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
票数 924
EN

Stack Overflow用户

发布于 2010-02-02 15:21:46

下面是一个实现:

代码语言:javascript
运行
复制
class Enum(set):
    def __getattr__(self, name):
        if name in self:
            return name
        raise AttributeError

下面是它的用法:

代码语言:javascript
运行
复制
Animals = Enum(["DOG", "CAT", "HORSE"])

print(Animals.DOG)
票数 347
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档