Py学习  »  Rafay  »  全部回复
回复总数  1
11 年前
回复了 Rafay 创建的主题 » 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 enum34 .代码在py2和py3之间不完全兼容,例如,您需要 __order__ in python 2 ).

  • 使用 $ 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,另一种表达“enums”的方法是使用 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