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)
您可以使用收益保存函数,但不能保存生成器。来自文档:“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)
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |