我正在使用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
答案 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()