如何使用 dill 库通过 shelve 库进行对象序列化

rom*_*inf 4 python shelve pickle coroutine dill

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

TypeError: can't pickle coroutine objects
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为PyMemoize内部尝试腌制协程并将其存储在 Redis 中。为此,它使用shelve.Shelf,而后者又使用pickle. 问题是,由于未知的原因,pickle不支持 pickling 协程。

我尝试用它来腌制协程dill并且它有效。我如何知道shelve用作dill序列化后端?

我尝试过猴子补丁shelve,但没有成功(我不知道为什么):

TypeError: can't pickle coroutine objects
Run Code Online (Sandbox Code Playgroud)

Vol*_*pey 5

您可以使用收益保存函数,但不能保存生成器。来自文档:“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()
Run Code Online (Sandbox Code Playgroud)

但是如果没有 dill,我们会得到“TypeError:无法腌制省略号对象”:

import shelve
d=shelve.open("shelve.dat")
d['1']=Ellipsis
d.close()
Run Code Online (Sandbox Code Playgroud)

  • 根据记录,当“shelve”因 lambda 不满意而抱怨“AttributeError: Can't pickle local object”时,此修复程序也适用。谢谢! (3认同)