1

Pythonでshelfオブジェクトをディープコピーすることは可能ですか? ディープコピーしようとすると、次のエラーが発生します。

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__()

シェルフはコピー不可ということですか?

編集:私の問題をもっと詳しく説明した方が良いかもしれません:私は大きな辞書をシェルブオブジェクトとして保持しており、シェルブオブジェクト全体(=これまでに生成したすべてのキー、valペア)を別のファイルに保存したい元のdictに新しいアイテムを追加し続けています。

おそらく、最初にシェルブを同期してディスク上のシェルブ ファイルを明示的にコピーできますが、そのアプローチは好きではありません。

4

2 に答える 2

2

いいえ、コピー可能ではないと思います(クラスにモンキーパッチを適用するか、辞書に変換しない限り)。理由は次のとおりです。

copy.copy()「標準」タイプ ( 、、 および)に依存しないインスタンスのおよびメソッドをcopy.deepcopy()呼び出します。クラスにこれらの属性がない場合は、 および にフォールバックします。(あなたの情報源を見てください)__copy__()__deepcopy__()atomiclisttupleinstance methods__reduce_ex____reduce__copy.py

残念ながら、 shelve オブジェクトは which が定義していない(そしてどちらも定義していないShelf) に基づいています。UserDict.DictMixincopy()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().

shelve モジュールのバグトラッカーに問題を送信することをお勧めします。

于 2013-10-25T09:16:06.150 に答える