我最近遇到了一个特殊的问题,插槽和泡菜。我已经将问题隔离到以下设置:
import operator
import pickle
class BinaryOperator(object):
__slots__ = ("a", "b")
operator = None
def __init__(self, a=None, b=None):
self.a = a
self.b = b
def execute(self):
return self.operator(self.a, self.b)
class Add(BinaryOperator):
__slots__ = ()
operator = operator.add
if __name__ == "__main__":
# This works as intended
add = Add(1, 1)
assert add.execute() == 2
# This fails:
# Traceback (most recent call last):
# File "slotstest.py", line 26, in <module>
# assert pickle_add.execute() == 2
# File "slotstest.py", line 14, in execute
# return self.operator(self.a, self.b)
# AttributeError: a
pickle_add = pickle.loads(pickle.dumps(add))
assert pickle_add.execute() == 2
# Workaround using pickling version
pickle_add = pickle.loads(pickle.dumps(add, -1))
assert pickle_add.execute() == 2这个问题不会发生在Python 3上,我认为这与泡菜协议的新版本有关。
如何使Add与默认Python2.7版本的泡菜兼容?
发布于 2015-02-23 01:06:01
如果需要支持古老的泡菜协议,请在类中添加特殊方法来设置和恢复实例状态,例如
def __getstate__(self):
return self.a, self.b
def __setstate__(self, state):
self.a, self.b = statehttps://stackoverflow.com/questions/28665411
复制相似问题