我如何在Python中表示'Enum'?

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

我如何表示Python中Enum的等价物?


如PEP 435中所述,Enum已被添加到Python 3.4中。它也被反向移植到pypi上的3.3,3.2,3.1,2.7,2.6,2.5和2.4。

对于更高级的枚举技术尝试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'
    

    在PEP 435之前,Python没有相同的功能,但可以实现自己的功能。

    我自己,我喜欢保持简单(我在网上看到过一些非常复杂的例子),像这样的...

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

    在Python 3.4(PEP 435)中,可以使Enum成为基类。 这可以让你获得一些额外的功能,如PEP所述。 例如,枚举值不同于整数。

    class Animal(Enum):
        DOG = 1
        CAT = 2
    
    print(Animal.DOG)
    <Animal.DOG: 1>
    

    如果您不想输入值,请使用以下快捷方式:

    class Animal(Enum):
        DOG, CAT = range(2)
    

    这是一个实现:

    class Enum(set):
        def __getattr__(self, name):
            if name in self:
                return name
            raise AttributeError
    

    这是它的用法:

    Animals = Enum(["DOG", "CAT", "HORSE"])
    
    print(Animals.DOG)
    
    链接地址: http://www.djcxy.com/p/2665.html

    上一篇: How can I represent an 'Enum' in Python?

    下一篇: Can you loop through all enum values?