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

This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。

我主要是C#开发人员,但目前正在使用Python开发项目。

我怎样才能代表Python中的枚举?

参考方案

如PEP 435中所述,将枚举添加到Python 3.4中。在pypi上也已经是backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4了。

对于更高级的Enum技术,请尝试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'
    

    Python pytz时区函数返回的时区为9分钟 - python

    由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

    在返回'Response'(Python)中传递多个参数 - python

    我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

    Python exchangelib在子文件夹中读取邮件 - python

    我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

    R'relaimpo'软件包的Python端口 - python

    我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

    Python ThreadPoolExecutor抑制异常 - python

    from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…