【问题标题】:How to use dill library for object serialization with shelve library如何使用 dill 库和 shelve 库进行对象序列化
【发布时间】:2019-03-26 09:41:51
【问题描述】:

我正在使用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

【问题讨论】:

    标签: python pickle coroutine shelve dill


    【解决方案1】:

    您可以使用收益保存函数,但不能保存生成器。来自documentation:“dill 还不能腌制这些标准类型: 框架、生成器、回溯。”

    此代码有效(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()
    

    但是如果没有 dill 我们会得到“TypeError: can't pickle ellipsis objects”:

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

    【讨论】:

    • 郑重声明,当shelve 抱怨AttributeError: Can't pickle local object 因为它对 lambdas 不满意时,此修复也有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多