Python-如何在Python中表示“Enum”?

发布于 2021-02-02 23:23:58

如何用Python表示等效的枚举?

关注者
0
被浏览
205
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到 3.3、3.2、3.1、2.7、2.6、2.52.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'
    


  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    我喜欢保持简单(我在网上看到了一些非常复杂的示例),就像这样…

    class Animal:
        DOG = 1
        CAT = 2
    
    x = Animal.DOG
    

    在Python 3.4(PEP 435)中,你可以将Enum设为基类。这会给你带来一些额外的功能,如PEP中所述。例如,枚举成员与整数不同,它们由a name和a 组成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实现可以转换为列表并且可以迭代。其成员的顺序是声明顺序,与它们的值无关。例如:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看