Python3 - 将枚举转换为不同的数据类型

时间:2018-03-25 22:47:49

标签: python python-3.x enums type-conversion enumeration

我目前正在使用以下类型的枚举:

class System(Enum):
  FIRST = 1
  SECOND = 2

现在我希望能够做到以下几点:

a = System.FIRST
url = a.getSystemURL()

其中枚举成员FIRSTSECOND的网址当然不同。

我可以创建一个字典,其中枚举成员作为键,url作为值,但这不能保证如果我以后添加枚举成员,我将记得添加相应的字典条目。< / p>

是否有一种干净的方法来为枚举成员提供具有多个值的枚举?并列举这些不同的价值观?

这样的事情:

class System(Enum):
  Values = (Value, url, something)
  FIRST = 1, 'https://www.example.com', 42
  SECOND = 2, 'https://www.test.com', 13

4 个答案:

答案 0 :(得分:4)

文档中有an example这样的内容。如果类定义了__init__方法,则枚举值将作为参数传递给它。这意味着您可以像这样定义枚举:

class System(Enum):
    FIRST = 1, 'https://www.example.com', 42
    SECOND = 2, 'https://www.test.com', 13

    def __init__(self, value, url, something):
        self.value_ = value
        self.url = url
        self.something = something

(请注意value是枚举保留的特殊属性,因此我将属性value_命名为避免名称冲突。)

您现在可以在每个枚举成员上访问这些属性:

>>> System.FIRST.url
'https://www.example.com'

答案 1 :(得分:1)

stdlib Enumaenum 1 都可以轻松支持您的用例(尽管stdlib版本需要更多工作)。

stdlib enum 3.4+(请参阅__new____init__解释的文档。)

import enum
class System(enum.Enum):

    def __new__(cls, *args, **kwds):
        value = len(cls.__members__) + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj

    def __init__(self, url, something):
        self.url = url
        self.something = something

    FIRST = 'https://www.example.com', 42
    SECOND = 'https://www.test.com', 13

aenum - 适用于Python 2和3代码。 aenum也使一些事情变得更容易 - 上面的代码将是:

import aenum
class System(aenum.AutoNumberEnum):
    _init_ = 'url something'
    FIRST = 'https://www.example.com', 42
    SECOND = 'https://www.test.com', 13

并在使用中:

--> System.FIRST
<System.First: 1>

--> System.FIRST.url
'https://www.example.com'

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者。

答案 2 :(得分:0)

将值设为namedtuple

from collections import namedtuple
from enum import Enum

Entry = namedtuple('Entry', ['value', 'url', 'something'])

class System(Enum):
  FIRST = Entry(1, 'https://www.example.com', 42)
  SECOND = Entry(2, 'https://www.test.com', 13)

print(System.FIRST.value.url)
# https://www.example.com

答案 3 :(得分:0)

您是否尝试过编写的代码?它已经正常工作!当然你没有真的有多个值,你有一个元组值 - 但这不是问题:

>>> class System(Enum):
...     FIRST = 1, 'https://www.example.com', 42
...     SECOND = 2, 'https://www.test.com', 13
>>> _, url, _ = System.SECOND.value
>>> url
'https://www.example.com'
>>> a = System.FIRST
>>> url = a.value[1]
>>> url
'https://www.example.com'

您可以采取一些措施来改善这一点,例如使用namedtuple代替普通tuple,这样您就可以写a.value.url代替a.value[1],但是你已经写了一些有效的东西。