我主要是C#开发人员,但目前正在使用Python开发项目。
如何用Python表示等效的枚举?
如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到3.3、3.2、3.1、2.7、2.6、2.5和2.4。
对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同enum34。py2和py3之间的代码并不完全兼容,例如,您需要__order__在python 2中使用)。
enum34
要使用enum34,做$ pip install enum34 要使用aenum,做$ pip install aenum 安装enum(无编号)将安装完全不同且不兼容的版本。
$ 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,则表示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