Funktion löschen

8

Ich versuche eine Funktion zum Löschen einer anderen Funktion zu erstellen.

%Vor%

ist was ich bisher habe, aber aus irgendeinem Grund funktioniert es nicht.

%Vor%

scheint nicht den Trick zu machen. Ich weiß, dass man es leicht machen kann, nur

%Vor%

aber ich versuche es anders zu machen. Wie?

    
Bobby Tables 28.04.2012, 20:49
quelle

3 Antworten

13

Das Löschen einer Funktion ist nicht wirklich etwas, was Sie an der Funktion selbst vornehmen; Es ist etwas, was du mit dem Namensraum machst, in dem es lebt. (Genauso wie du die Nummer 3 aus einer Liste entfernst, ist es nichts, was du mit der Nummer 3 machst, sondern mit der Liste.)

Angenommen, Sie sagen

%Vor%

Dann (mehr oder weniger) haben Sie zwei Namen, foo und bar , für genau die gleiche Funktion. Angenommen, Sie rufen delete_function(foo) oder delete_function(bar) auf. Das exakt gleiche Ding , nämlich ein Funktionsobjekt, wird an delete_function übergeben. Aber was Sie eigentlich entfernen möchten, ist die Assoziation zwischen dem Namen foo oder bar und diesem Objekt - und es gibt keine Möglichkeit, wie delete_function oder foo oder etwas anderes, das du loswerden willst.

(Naja ... Eigentlich ist es da. Es gibt hässliche Hacky-Dinge, die Sie tun können, damit der Code in bar mehr darüber weiß, wie er heißt. Aber denken Sie nicht einmal darüber nach, darüber nachzudenken.)

Also. Ihre Optionen sind wie folgt. (1) Nasty hacky Dinge, wie gerade erwähnt. Nicht. (2) Übergeben Sie delete_function nicht das Funktionsobjekt, sondern Informationen über den Namen der Funktion und die Sache, von der Sie versuchen, sie zu löschen. Das ist hässlich und plump. (3) Mach dir keine Mühe.

Ich empfehle dringend # 3, es sei denn ist der einzige Grund, warum Sie das tun, mehr über Python zu erfahren. In letzterem Fall könnte ein guter Ausgangspunkt sein Ссылка .

    
Gareth McCaughan 28.04.2012, 20:57
quelle
7

Da foo global ist, können Sie es aus den globalen Definitionen löschen:

%Vor%     
Omri Barel 28.04.2012 20:58
quelle
4

Es wird einfach nicht funktionieren.

Was Sie versuchen, ist im Wesentlichen der Namensraum des Aufrufers.

Versuchen Sie Folgendes:

%Vor%

Beachten Sie, dass

  1. die Einheimischen dict bei 0 und 2 sind identisch, und bei 1 fast - außer es hat die zusätzliche Zuordnung von foo .
  2. del ist eine Anweisung und keine Funktion

Wenn Sie das del in einer Funktion delete_function() ausführen, wird im Wesentlichen die Zuweisung innerhalb Ihrer Funktion entfernt (was wirkungslos ist, weil die Funktion sofort beendet wird), während der Aufrufer die Zuweisung behält.

Streng genommen löscht del keine Objekte, sondern lediglich Zuweisungen von Namen an Objekte. Objekte werden "automatisch" gelöscht (Garbage Collection), sobald sie nicht mehr referenziert sind.

Es könnte funktionieren, was Sie versuchen, indem Sie den Stapelrahmen und die Übergabe des Namens, der als Zeichenfolge gelöscht werden soll, tun, aber es wäre ein PITA.

Vielleicht versuchst du

%Vor%

oder

%Vor%

? Aber ich denke, es ist nicht garantiert, dass es wirklich das echte lokale Wörterbuch ändert, es könnte genauso gut auf einer Kopie funktionieren und somit wirkungslos bleiben ...

    
glglgl 28.04.2012 20:54
quelle

Tags und Links