copy.deepcopy löst TypeError für Objekte mit selbstdefinierter __new __ () -Methode aus

8

Ich möchte einen Symboltyp implementieren, der die bereits vorhandenen Symbole (in _sym_table gespeichert) speichert und sie zurückgibt, wenn sie existieren, oder neue erstellen. Der Code:

%Vor%

Aber wenn ich copy.deepcopy in einer Liste solcher Symbol Instanzen aufruft, wird eine Exception ausgelöst:

%Vor%

Fehlermeldungen:

%Vor%

Meine Fragen sind also:

  • Wie kann ich eine tiefe Kopie dieser Objekte mit selbstdefinierten __new__ Methoden erstellen?
  • Und irgendwelche Vorschläge darüber, wann und wie copy.deepcopy verwendet wird?

Vielen Dank!

    
PJ.Hades 16.05.2012, 12:51
quelle

3 Antworten

5

Ein Problem besteht darin, dass deepcopy und copy keine Möglichkeit haben zu wissen, welche Argumente an __new__ übergeben werden sollen. Daher arbeiten sie nur mit Klassen, die keine Konstruktorargumente erfordern.

Der Grund, warum Sie __init__ Argumente haben können, ist, dass __init__ beim Kopieren eines Objekts nicht aufgerufen wird, aber __new__ muss aufgerufen werden, um das neue Objekt zu erstellen.

Wenn Sie also das Kopieren steuern wollen, müssen Sie die speziellen Methoden __copy__ und __deepcopy__ definieren:

%Vor%

Übrigens Singletons sind evil und nicht wirklich in Python benötigt.

    
mata 16.05.2012, 16:25
quelle
1

Mir scheint, dass Sie möchten, dass die Symbolinstanzen Singletons sind. Deepcopy sollte jedoch verwendet werden, wenn Sie eine exakte Kopie einer Instanz wünschen, d. H. Eine andere Instanz, die dem Original entspricht.

Die Verwendung hier widerspricht also dem Zweck von decopy. Wenn Sie es trotzdem zum Laufen bringen wollen, können Sie die Methode __deepcopy__ für Symbol .

    
XORcist 16.05.2012 15:21
quelle
0

Definiere __getnewargs__ - so kannst du nicht nur copy und deepcopy , sondern auch pickle .

    
Neil G 25.03.2015 08:59
quelle

Tags und Links