如何使用莳萝库对带库的对象进行序列化

时间:2018-10-22 10:32:06

标签: python pickle coroutine shelve dill

我正在使用PyMemoize库来缓存协程。我装饰了协程,但是当Python调用它时,我得到了:

TypeError: can't pickle coroutine objects

之所以会这样,是因为PyMemoize在内部尝试腌制协程并将其存储在Redis中。为此,它使用shelve.Shelf,而后者又使用pickle。问题是,由于未知原因,pickle不支持酸洗协程。

我尝试用dill来腌制协程,并且奏效了。如何告诉shelve使用dill作为序列化后端?

我已经尝试过shelve的猴子补丁了,但是没有用(我不知道为什么):

import shelve
from dill import Pickler, Unpickler
shelve.Pickler = Pickler
shelve.Unpickler = Unpickler

1 个答案:

答案 0 :(得分:0)

您可以保存带有yield的函数,但不能保存生成器。来自documentation:“莳萝还不能腌制这些标准类型: 框架,生成器,追溯。”

此代码有效(Dill版本0.3.0):

import shelve
from dill import Pickler, Unpickler
shelve.Pickler = Pickler
shelve.Unpickler = Unpickler
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()

但是没有莳萝,我们会收到“ TypeError:无法腌制省略号对象”:

import shelve
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()