将枚举转换为Python中的列表

时间:2019-01-09 12:46:08

标签: python enums assert

我有一个这样定义的枚举:

def make_enum(**enums):
    return type('Enum', (), enums)

an_enum = make_enum(first=1, second=2)

稍后,我想检查一下,我作为函子中的参数使用的值是否是an_enum的一部分。通常我会这样

assert 1 in to_list(an_enum)

如何将枚举对象an_enum转换为列表?如果不可能,如何检查值“是否属于枚举”?

3 个答案:

答案 0 :(得分:3)

我不确定为什么要像您一样定义枚举,有支持的功能方式可以做到这一点:

en_enum = Enum('Numbers', {'first': 1, 'second': 2})

如果这符合您的需求,您可以

>>> en_enum(1)
<Numbers.first: 1>

>>> en_enum(3)
ValueError: 3 is not a valid Numbers

实际上不是成员资格检查,但是您不需要任何特殊的方法/变压器

答案 1 :(得分:2)

Python允许您使用enumerable.nameenumerable.value。为了将枚举类型转换为列表,请尝试使用列表理解。

[el.value for el in an_enum]
# returns: [1, 2]

# Alternatively, look for the names
[el.name for el in an_enum]
# returns: ['first', 'second']

Sidenode:小心断言。如果您的生产环境对此进行了优化,则可能会跳过它们。对于重要的检查,您应该使用

if 1 in [el.value for el in an_enum]:
    pass

答案 2 :(得分:1)

  

如何将枚举对象an_enum转换为列表?

>>> [name for name in dir(an_enum) if not name.startswith('_')]
['first', 'second']
  

如何检查值“是否属于枚举”?

>>> getattr(an_enum, 'first')
1
>>> getattr(an_enum, '1')
Traceback [...] 
AttributeError: type object 'Enum' has no attribute '1'