我正在使用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.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()
但是没有莳萝,我们会得到"类型错误:无法腌制省略号对象":
import shelve
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()