2024-04-23 20:02:40 发布
网友
我主要是一个C#开发人员,但我目前正在用Python开发一个项目。
如何在Python中表示等同于枚举的值?
在PEP 435之前,Python没有对等的版本,但是您可以实现自己的版本。
我自己,我喜欢保持简单(我在网上看到过一些非常复杂的例子),就像这样。。。
class Animal: DOG = 1 CAT = 2 x = Animal.DOG
在Python 3.4(PEP 435)中,可以将Enum设为基类。这将为您提供一点额外的功能,如PEP中所述。例如,枚举成员不同于整数,它们由name和value组成。
name
value
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实现can be converted to lists and are iterable。其成员的顺序是声明顺序,与成员的值无关。例如:
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
枚举已添加到Python 3.4中,如PEP 435所述。在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之间的代码不完全兼容,例如,您需要^{} in python 2)。
enum34
$ pip install enum34
aenum
$ pip install aenum
安装enum(无编号)将安装完全不同且不兼容的版本。
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'
以下是一个实现:
class Enum(set): def __getattr__(self, name): if name in self: return name raise AttributeError
Animals = Enum(["DOG", "CAT", "HORSE"]) print(Animals.DOG)
在PEP 435之前,Python没有对等的版本,但是您可以实现自己的版本。
我自己,我喜欢保持简单(我在网上看到过一些非常复杂的例子),就像这样。。。
在Python 3.4(PEP 435)中,可以将Enum设为基类。这将为您提供一点额外的功能,如PEP中所述。例如,枚举成员不同于整数,它们由
name
和value
组成。如果不想键入值,请使用以下快捷方式:
Enum
实现can be converted to lists and are iterable。其成员的顺序是声明顺序,与成员的值无关。例如:枚举已添加到Python 3.4中,如PEP 435所述。在pypi上也是backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4。
要获得更高级的枚举技术,请尝试aenum library(2.7,3.3+,与} in python 2 )。
enum34
作者相同)。py2和py3之间的代码不完全兼容,例如,您需要^{enum34
,请执行$ pip install enum34
aenum
,请执行$ pip install aenum
安装
enum
(无编号)将安装完全不同且不兼容的版本。或同等地:
在早期版本中,实现枚举的一种方法是:
其用法如下:
您还可以通过以下方式轻松支持自动枚举:
用起来像这样:
可以通过以下方式添加对将值转换回名称的支持:
这将覆盖具有该名称的任何内容,但对于在输出中呈现枚举非常有用。如果反向映射不存在,它将抛出KeyError。举第一个例子:
以下是一个实现:
其用法如下:
相关问题 更多 >
编程相关推荐