如何在Python中腌制复杂的枚举值

Ond*_*nik 2 python enums pickle

当我尝试腌制复杂的枚举实例时,总是得到“ ValueError:BLUE不是有效的颜色”。

有什么办法可以腌制和去渍吗?

from pickle import loads, dumps
from enum import Enum


class ColorType(object):

    def __init__(self, counter, name):
        self.counter = counter
        self.name = name

    def __str__(self):
        return self.name


class Colors(Enum):
    GREEN = ColorType(1, 'GREEN')
    BLUE = ColorType(2, 'BLUE')


color = Colors.BLUE
print(color is loads(dumps(color)))
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 2.7。

Mar*_*ers 5

不要将自定义类用作枚举值;这里没有必要。您的特定示例根本不需要单独的类,您可以使用:

class Colors(Enum):
    GREEN = 1
    BLUE = 2

    def __str__(self):
        return self.name

    @property
    def counter(self):
        return self.value
Run Code Online (Sandbox Code Playgroud)

这有更好的 str().counter行为; 您的代码需要str()应用于Color.<name>.value而不是直接应用于Color.<name>

对于其他自定义方法和属性,请将其直接放在Enum子类上,它们也将成为枚举成员的一部分。如果每个条目需要更多的值,请设置一个元组,然后在__init__方法中将该元拉开。该文档有一个出色的Planet示例,进一步说明了这一点。

演示:

>>> Colors.BLUE
<Colors.BLUE: 2>
>>> Colors.BLUE.value
2
>>> Colors.BLUE.counter
2
>>> str(Colors.BLUE)
'BLUE'
>>> Colors.BLUE is loads(dumps(Colors.BLUE))
True
Run Code Online (Sandbox Code Playgroud)