python - 如何在 Python 中 pickle 复杂的枚举值

标签 python enums pickle

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

有什么办法可以pickle和unpickle吗?

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)))

我正在使用 Python 2.7。

最佳答案

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

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

    def __str__(self):
        return self.name

    @property
    def counter(self):
        return self.value

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

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

演示:

>>> 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

关于python - 如何在 Python 中 pickle 复杂的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43755807/

相关文章:

c - 使用开关将函数指针映射到字符串

java - ClassLoad 一个 Enum 类型

Django缓存一个大列表

python - 如何在 pkl 文件中编写可在 python 脚本中使用的 write() 方法?

python - 如何向 Seaborn 分布图添加均值线和中线

python - 如果主题标签更改,如何更改 tweepy 中的流?

python - 列表理解的多个条件语句

python - 为什么 numpy.broadcast "transpose"vstack 和类似函数的结果?

c# - 人们可以使用什么代替枚举来获取智能感知的字符串集合?

python - 使用 Pickle 保存 Numpy 数组