当我尝试取消 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/