当前位置: 首页 > 面试题库 >

如何在Python中表示“枚举”?

雍河
2023-03-14
问题内容

我主要是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,做$ 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


 类似资料:
  • 问题内容: 如何用Python表示等效的枚举? 问题答案: 如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到 和。 对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同enum34。py2和py3之间的代码并不完全兼容,例如,在python 2中需要)。 要使用enum34,做$ pip install enum34 要使用aenum,

  • 问题内容: Unicode字符串如何在Python的内存中按字面表示? 例如,我可以在内存中可视化为等效的ASCII字节。整数可以认为是2的恭维表示形式。但是,即使以3个字节长表示,我如何在内存中可视化原义代码点? 是否有将其存储在内存中的特定方法?Python 2和Python 3是否有区别? 问题答案: 我假设您想了解CPython(标准实现)。Python 2和Python 3.0-3.2对

  • 问题内容: 如何在python中表示无穷大?无论您在程序中输入哪个数字,任何数字都不得大于此无穷大表示形式。 问题答案: 在Python中,您可以执行以下操作: 在Python 3.5中,您可以执行以下操作: 接着: 永远是真的。当然,除非指出,否则x也是无穷大或“ nan”(“非数字”)。 另外(Python的ONLY 2.X)中,在比较,较小,例如: 将返回true。

  • rank ▲ ✰ vote url 7 1112 431 1201 url 在Python里如何用枚举类型? 我是一个C#开发者,但是我现在做的工作是关于Python的. 怎么在Python里代替枚举类型呢? PEP435标准里已经把枚举添加到Python3.4版本,在Pypi中也可以向后支持3.3, 3.2, 3.1, 2.7, 2.6, 2.5, 和 2.4版本. 如果想向后兼容$ pip i

  • 问题内容: 我有两个环境和。在督促环境中,我们有三个数据中心,并和分期有一个数据中心。每个数据中心只有几台机器,我为它们定义了常量,如下所示: 现在,我在同一个类中定义了另一个常量,该常量将DC分组为每种环境类型的计算机列表。 现在在其他班上,根据我所处的环境,我会得到或。 现在,我认为可以用某种Enum更好地表示它,而不必像上面定义的那样定义常量,但是我不知道该怎么办?我从此开始,但是对于如何为

  • 我有一个java对象,它有一个名为type的属性,代表一个枚举: 当使用springfox在yaml中生成规范时,该对象在引用对象TypeValue时生成以下输出: 我想做的是在生成doc时忽略枚举类型,从规范中删除枚举类型。这就是我想要的: type:对象属性:op:type:string路径:type:string值:type:对象属性:{}标题:补丁 我尝试使用@ApiModelProper