4

私はこのコピーメソッドを、それを必要とする多くのクラスでかなり長い間使用してきました。

class population (list):
def __init__ (self):
    pass

def copy(self):
    return copy.deepcopy(self)

突然、このエラーが発生し始めました。

     File "C:\Python26\lib\copy.py", line 338, in _reconstruct
    state = deepcopy(state, memo)
  File "C:\Python26\lib\copy.py", line 162, in deepcopy
    y = copier(x, memo)
  File "C:\Python26\lib\copy.py", line 255, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "C:\Python26\lib\copy.py", line 189, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "C:\Python26\lib\copy.py", line 323, in _reconstruct
    y = callable(*args)
  File "C:\Python26\lib\copy_reg.py", line 93, in __newobj__
    return cls.__new__(cls, *args)
TypeError: object.__new__(generator) is not safe, use generator.__new__()
>>> 

行338、162、255、189への参照を含む行は、ここでコピーした「行338」の前にかなりの回数繰り返されました。

4

2 に答える 2

9

ジェネレーターのクローンを作成していますか?ジェネレーターのクローンを作成することはできません。

Gabriel Genellinaによる回答のコピー:


ジェネレーターを「複製」する方法はありません。

py> g = (i for i in [1,2,3])
py> type(g)()
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: cannot create 'generator' instances
py> g.gi_code = code
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: readonly attribute
py> import copy
py> copy.copy(g)
Traceback (most recent call last):
...
TypeError: object.__new__(generator) is not safe, use generator.__new__()
py> type(g).__new__
<built-in method __new__ of type object at 0x1E1CA560>


ジェネレーター関数は「ジェネレーターファクトリー」として機能し、呼び出されると新しいジェネレーターを構築するため、ジェネレーター関数を使用してこれを行うことができます。Python C
APIを使用する場合でも、ジェネレーターを作成するにはフレームオブジェクトが必要です。そして
、私が知っている「オンザフライ」でフレームオブジェクトを作成する方法はありません:(

py> import ctypes
py> PyGen_New = ctypes.pythonapi.PyGen_New
py> PyGen_New.argtypes = [ctypes.py_object]
py> PyGen_New.restype = ctypes.py_object
py> g = (i for i in [1,2,3])
py> g2 = PyGen_New(g.gi_frame)
py> g2.gi_code is g.gi_code
True
py> g2.gi_frame is g.gi_frame
True
py> g.next()
1
py> g2.next()
2

gとg2は同じ実行フレームを共有するため、独立していません。Pythonで新しいフレームを作成する簡単な方法はあり
ません。

py> type(g.gi_frame)()
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: cannot create 'frame' instances

PyFrame_Newを試してみることができますが、それは私の好みにはあまりにも魔法です...

于 2009-09-09T19:38:33.987 に答える
0

これは多くの場合、誤ってイテレータをクラスに複製しようとしたときに発生します。たとえば、PILで、のクローンを作成しようとすると、PixelAccessこのImageエラーがスローされます。

例を見てみましょうpixels = image.load()。のようなことをしようとする代わりにpixels_copy = copy.copy(pixels)、ベースオブジェクトをコピーしてからイテレータを作成する必要があります。したがって、そのコードを。に置き換えますpixels_copy = image.copy().load()

于 2017-06-30T07:07:50.600 に答える