4

私のコードでは、を使用してクラスのインスタンスのコピーを取得しようとしていますcopy.deepcopy。問題は、状況によっては次のエラーでエラーが発生することです。

TypeError: 'object.__new__(NotImplementedType) is not safe, use NotImplementedType.__new__()'

多くの調査の結果、次のコードを使用してエラーを再現できることがわかりました。

import copy
copy.deepcopy(__builtins__) 

問題は、ある時点でNotImplementedTypeビルトインをコピーしようとしていることのようです。問題は、なぜこれを行うのかということです。__deepcopy__私はクラスでオーバーライドしていませんし、それが常に発生するわけではありません。このタイプのコピーを作成するリクエストがどこから来たのかを追跡するためのヒントはありますか?

copyこれが起こっていることを確認するために、モジュール自体にデバッグコードをいくつか入れましたが、問題が発生するポイントは再帰スタックのはるか下にあり、私が見ているものを大いに活用することは非常に困難です。

4

3 に答える 3

1

ここで説明するように、コピーモジュールでサポートされているpickleプロトコルを使用して、モジュールへのポインタを含むクラスのディープコピー動作をオーバーライドできます。特に、そのクラスに対してとを__getstate__定義できます。__setstate__例えば:

>>> class MyClass:
...     def __getstate__(self):
...         state = self.__dict__.copy()
...         del state['some_module']
...         return state
...     def __setstate__(self, state):
...         self.__dict__.update(state)
...         self.some_module = some_module
于 2009-12-23T18:18:18.577 に答える
1

__deepcopy__メソッドをオーバーライドできます:( Pythonドキュメント

クラスが独自のコピー実装を定義するために、特別なメソッド__copy __()および__deepcopy __( )を定義できます。前者は、浅いコピー操作を実装するために呼び出されます。追加の引数は渡されません。後者は、ディープコピー操作を実装するために呼び出されます。1つの引数、メモ辞書が渡されます。__deepcopy __()実装でコンポーネントのディープコピーを作成する必要がある場合は、コンポーネントを最初の引数として、メモディクショナリを2番目の引数としてdeepcopy()関数を呼び出す必要があります

それ以外の場合は、モジュールをグローバルリストなどに保存できます。

于 2009-12-21T23:59:42.607 に答える