1

是否可以在 Python 中深度复制搁置对象?当我尝试对其进行深度复制时,出现以下错误:

import shelve,copy
input = shelve.open("test.dict", writeback=True)
input.update({"key1": 1, "key2": 2})
newinput = copy.deepcopy(input)
>> object.__new__(DB) is not safe, use DB.__new__()

这是否意味着书架不可复制?

编辑:如果我详细说明我的问题可能会更好:我将一个大字典作为搁置对象,我想将整个搁置对象(=到目前为止我生成的所有键、值对)保存到一个单独的文件而我不断向原始字典添加新项目。

可能我可以先同步搁置并明确复制磁盘上的搁置文件,但是我不喜欢这种方法。

4

2 回答 2

2

不,我不认为它们是可复制的(除非你猴子修补课程或转换成字典)。原因如下:

copy.copy()并为不依赖于“标准”类型(即、和) 的实例copy.deepcopy()调用__copy__()和方法。如果该类没有这些属性,则回退到and 。(见你的来源)__deepcopy__()atomiclisttupleinstance methods__reduce_ex____reduce__copy.py

不幸的是,搁置对象Shelf基于UserDict.DictMixinwhich 没有定义copy()(也没有Shelf):

类 DictMixin:

# Mixin defining all dictionary methods for classes that already have
# a minimum dictionary interface including getitem, setitem, delitem,
# and keys. Without knowledge of the subclass constructor, the mixin
# does not define __init__() or copy().  In addition to the four base
# methods, progressively more efficiency comes with defining
# __contains__(), __iter__(), and iteritems().

向搁置模块错误跟踪器提交问题可能是个好主意。

于 2013-10-25T09:16:06.150 回答
0

你可以得到一个浅dict(input)拷贝deepcopy。然后可能在新文件上创建另一个搁置并通过该update方法填充它。

newinput = shelve.open("newtest.dict")
newinput.update(copy.deepcopy(dict(input)))
于 2013-10-25T09:03:00.407 回答