Frage

Ich habe mit dieser Kopiermethode für eine ganze Weile, in vielen Klassen, die es benötigten.

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

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

Es ist die Herstellung dieser Fehler plötzlich gestartet:

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

die Linien, die die Verweise auf Leitungen 338 umfassen, 162, 255, 189 wurden schon ein paar Mal vor der ‚Linie 338‘ wiederholt, die ich hier kopiert.

War es hilfreich?

Lösung

klonen Sie einen Generator? Generatoren können nicht geklont werden.

Kopieren Antwort von Gabriel Genellina hier:


Es gibt keine Möglichkeit von "Klonen" ein Generator:

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>

Sie können mit einer Generatorfunktion tun, weil es wirkt als „Generator
Fabrik“, einen neuen Generator bauen, wenn sie aufgerufen. Auch die Python C
mit API zu erstellen, einen Generator man ein Frame-Objekt muss - und es gibt keinen Weg
zum Erstellen eines Frame-Objekt "on the fly", die ich kenne: (

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 und g2 die gleiche Ausführung Rahmen, so dass sie nicht unabhängig sind. Es
ist keine einfache Möglichkeit, einen neuen Rahmen in Python zu erstellen:

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

Man könnte versuchen PyFrame_New mit - aber das ist viel zu Magie für meinen Geschmack ...

Andere Tipps

Dies geschieht in vielen Fällen, wenn man aus Versehen den Iterator zu einer Klasse zu klonen versucht. Zum Beispiel in PIL, die PixelAccess eines Image zu klonen versucht, diesen Fehler werfen.

Nehmen wir ein Beispiel, wo pixels = image.load(). Anstatt zu versuchen, so etwas wie pixels_copy = copy.copy(pixels) zu tun, müssen Sie das Basisobjekt kopieren und dann einen Iterator zu erzeugen. So ersetzen Sie das Stück Code mit pixels_copy = image.copy().load().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top