我主要是一名 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/