【问题标题】:how to deepcopy when pickling is not possible无法进行酸洗时如何进行深度复制
【发布时间】:2016-03-13 04:31:14
【问题描述】:

我正在尝试对 Python 3.4 中的字典进行深度复制,但其中一些值不是“可选取的”,即当我尝试对字典进行深度复制时,它会引发 RuntimeError 异常

*** RuntimeError: Pickling of "DataObject" instances is not enabled (http://www.boost.org/libs/python/doc/v2/pickle.html)

深度复制字典的最佳选择是什么?

到目前为止,我正在递归地遍历字典并创建一个新字典,但我想知道是否有更强大和更优雅的解决方案。

注意:我无法修改 DataObject 结构以支持酸洗。

【问题讨论】:

    标签: python python-3.x dictionary pickle deep-copy


    【解决方案1】:

    您可以在copyreg module 中添加复制函数来处理无法腌制的类型:

    import copyreg
    
    pickle_dataobject(do):
        return DataObject, (do.arg1, do.arg2)
    
    copyreg.pickle(DataObject, pickle_dataobject)
    

    这个想法是您返回一个构造函数和要传递给构造函数以重新创建原始值的参数。

    然后,只要ob is DataObject 为真,copy.deepcopy() 函数就会使用上面的pickle_dataobject() 获取副本(在copyreg.pickle() 将您的函数添加到的copyreg.dispatch_table 字典中查找该类)。

    【讨论】:

    • 我知道这是正确的做法。可悲的是,就我而言,我没有很好地了解所有 DataObject 参数。我使用 C++ 库的一些“特殊”(烦人的)swig 接口,这些接口有很多类似的问题。如果无法列出所有参数,我看不出如何使用此方法。也就是说,我认为这是要走的路,所以我会将其标记为正确答案。
    • @zom-pro:那么,你现在如何创建新实例?它是否可能是另一个包含您需要挂钩的东西的类?这个想法是,您仍然将所有内容留给copy.deepcopy(),但教它如何复制特定类型,而无需直接更改这些类型。但是,如果这些对象是作为某些容器类的内部数据结构创建的,请改为向copyreg 介绍容器类。
    • 可以使用 Python 2.7 copy_reg。在 Python 3 中,copy_reg 模块已重命名为 copyreg。
    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2013-12-03
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多