代码之家  ›  专栏  ›  技术社区  ›  user9115052

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

  •  3
  • user9115052  · 技术社区  · 7 年前

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

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

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

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

    其中枚举成员的url FIRST SECOND 当然是不同的。

    我可以创建一个字典,枚举成员作为键,URL作为值,但这不能保证如果我以后添加枚举成员,我会记得添加相应的字典条目。

    是否有一种干净的方法可以让枚举成员具有多个值?命名这些不同的值?

    类似这样:

    class System(Enum):
      Values = (Value, url, something)
      FIRST = 1, 'https://www.example.com', 42
      SECOND = 2, 'https://www.test.com', 13
    
    4 回复  |  直到 7 年前
        1
  •  4
  •   Aran-Fey Kevin    7 年前

    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'
    
        2
  •  1
  •   Ethan Furman    7 年前

    stdlib和 Enum aenum 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 Enum 这个 enum34 backport ,以及 Advanced Enumeration ( aenum ) 图书馆

        3
  •  0
  •   Patrick Haugh    7 年前

    将值设为a 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
    
        4
  •  0
  •   abarnert    7 年前

    你试过你写的代码吗?它已经开始工作了!你当然不会 真正地 如果有多个值,则只有一个元组值,但这不是问题:

    >>> 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] ,但你已经写了一些有用的东西。