如何在Python中表示“枚举”?
2022-09-05 01:04:24
我主要是一名C#开发人员,但我目前正在用Python开发一个项目。
我如何在Python中表示枚举的等效物?
我主要是一名C#开发人员,但我目前正在用Python开发一个项目。
我如何在Python中表示枚举的等效物?
枚举已添加到 Python 3.4 中,如 PEP 435 中所述。它还在pypi上向后移植到3.3,3.2,3.1,2.7,2.6,2.5和2.4。
对于更高级的枚举技术,请尝试使用 aenum 库(2.7,3.3+,与 .代码在py2和py3之间并不完全兼容,例如,你需要__order__
python 2)。enum34
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来表达“枚举”的另一种方式是打字。文字
。
例如:
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
在PEP 435之前,Python没有等效的,但你可以实现自己的。
我自己,我喜欢保持简单(我在网上看到过一些非常复杂的例子),像这样的东西......
class Animal:
DOG = 1
CAT = 2
x = Animal.DOG
在 Python 3.4 (PEP 435) 中,您可以将 Enum 设为基类。这为您提供了一些额外的功能,如 PEP 中所述。例如,枚举成员与整数不同,它们由 a 和 .name
value
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"
如果不想键入值,请使用以下快捷方式:
class Animal(Enum):
DOG, CAT = range(2)
Enum
实现可以转换为列表并且是可迭代的。其成员的顺序是声明顺序,与它们的值无关。例如:
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