是否可以添加名为'无'的值。枚举类型?

时间:2016-08-04 17:28:38

标签: python enums

我可以添加名为'无'的值。一个枚举? 例如

from enum import Enum
class Color(Enum):
    None=0 #represent no color at all
    red = 1
    green = 2
    blue = 3

color=Color.None

if (color==Color.None):
    #don't fill the rect
else:
    #fill the rect with the color

这个问题与我之前的问题有关 How to set a variable's subproperty?

当然,我了解None中的上述enum并不起作用。 但是从供应商的代码中,我确实看到了这样的事情: bird.eye.Color=bird.eye.Color.enum.None 我检查了type(bird.eye.Color) 这是一个<class 'flufl.enum._enum.IntEnumValue'> 所以使用flufl.enum。我认为使用flufl.enumEnum应该没有什么不同。 非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以使用Enum构造函数执行此操作,而不是创建子类

>>> from enum import Enum
>>> 
>>> Color = Enum('Color', {'None': 0, 'Red': 1, 'Green': 2, 'Blue': 3})
>>> Color.None
<Color.None: 0

编辑:这适用于python 2的enum34 backport。在python 3中,您将能够使用Enum属性创建None,但您不会能够使用点表示法访问。

>>> Color.None
SyntaxError: invalid syntax

奇怪的是,您仍然可以使用getattr

访问它
>>> getattr(Color, 'None')
<Color.None: 0>

答案 1 :(得分:1)

您不能直接执行此操作,因为分配给None是语法错误。

也不应该动态地在枚举类上设置属性,因为这会干扰Enum用于准备类的元类逻辑。

您应该使用小写名称none来避免名称与python&#39; None单例冲突。对于您所描述的用例,这种方法没有任何缺点。

答案 2 :(得分:-2)

不是你尝试的方式,但你可以这样做:

# After defining the class Color as normal, but excluding the part for None...
setattr(Color, 'None', 0)

color = Color.None
if color == Color.None:
    ...

注意:我在Python 2中做了这个。不确定你是否想在Python 2或3中使用它,因为你没有指定,而且我没有在这台机器上安装Python 3的副本来测试。< / p>