RAII in Python - automatische Zerstörung beim verlassen eines Bereichs

Ich habe versucht zu finden, RAII in Python.
Resource Allocation Is Initialization " ist ein Muster in C++, wobei
ein Objekt initialisiert wird, wie es erstellt wird. Wenn es scheitert, dann wirft er
eine Ausnahme. Auf diese Weise wird der Programmierer weiß, dass
das Objekt wird nie verlassen werden, in ein halb-fertiggestellten Zustand. Python
kann so viel tun.

Aber RAII funktioniert auch mit den scoping-Regeln von C++
zur Gewährleistung der Eingabeaufforderung Zerstörung des Objekts. Sobald die variable
off erscheint der stack zerstört wird. Dies kann geschehen, in Python, aber nur
wenn es keine externen oder zirkuläre Referenzen.

Wichtiger ist, einen Namen für ein Objekt noch vorhanden ist, bis die Funktion ist es
in-und Ausgänge (und manchmal mehr). Variablen auf Modulebene werden
bleiben, um für die Lebensdauer des Moduls.

Möchte ich erhalten eine Fehlermeldung, wenn ich etwas wie das hier tun:

for x in some_list:
    ...

... 100 lines later ...

for i in x:
    # Oops! Forgot to define x first, but... where's my error?
    ...

Konnte ich manuell löschen, den Namen nach, ich habe es verwendet,
aber das wäre ziemlich hässlich, und erfordern Anstrengung auf meinem Teil.

Und ich würde es gerne Tun-Was-ich-in diesem Fall Bedeuten:

for x in some_list:
    surface = x.getSurface()
    new_points = []
    for x,y,z in surface.points:
        ...     # Do something with the points
        new_points.append( (x,y,z) )
    surface.points = new_points
    x.setSurface(surface)

Python hat einige scoping, nicht aber an der Einrückung, nur an
die funktionale Ebene. Es scheint albern zu verlangen, dass ich eine neue Funktion
nur um den Umfang der Variablen, so kann ich die Wiederverwendung einen Namen.

Python 2.5 hat die der "with" - Anweisung
aber das erfordert, dass ich explizit setzen in __enter__ und __exit__ Funktionen
und generell scheint sich stärker in Richtung Bereinigung von Ressourcen wie Dateien
und mutex-sperren, unabhängig von der Ausfahrt Vektor. Es hilft nicht, mit der Festlegung des lösungsumfangs.
Oder bin ich etwas fehlt?

Ich gesucht habe für "Python RAII" und "Python-scope" und ich war nicht in der Lage, etwas zu finden, dass
die Frage direkt und verbindlich.
Ich habe gesucht über alle PEPs. Das Konzept scheint nicht angesprochen zu werden
in Python.

Bin ich ein schlechter Mensch, weil ich scoping von Variablen in Python?
Ist das einfach nur zu un-Pythonic?

Bin ich nicht grokking es?

Vielleicht bin ich versucht zu nehmen die Vorteile der dynamischen Aspekte der Sprache.
Ist es egoistisch, manchmal wollen Umfang durchgesetzt?

Bin ich zu faul für den Wunsch der compiler/interpreter
fangen meine fahrlässigen variable Wiederverwendung Fehler? Gut, ja, natürlich bin ich faul,
aber bin ich faul in einem schlechten Weg?

  • RAII ist äquivalent zu Python with Aussage (ich bin eigentlich überrascht, dass die Abkürzung nicht in PEP 343 - es war sicherlich geworfen, um eine Menge in den zugehörigen Diskussionen). Das fehlende element ist Sie für Fragen ist der anonyme scoping-Regeln von C/C++ und kein Python nicht haben (obwohl Sie möglicherweise die latente PEP 3150 von Interesse). Das ist völlig unabhängig von der RAII Frage, obwohl.
  • Danke für die Antwort. Ich dachte, PEP 3150 wurde die Beantwortung meiner Frage, aber dann merkte ich, dass es sagt nichts über das entfernen des Namespaces. Es ist rein zum verschieben der Aufruf der Funktion über den code, bekommt Werte für die Parameter, so dass es mehr als offensichtlich, was der code leistet. Was ich nicht mag, über with ist, dass der name nicht Weggehen, und ich habe zu bewegen-code in __exit__ statt __del__. Gibt es vielleicht eine geschickte wrapper-Objekt, dass würde del den Namen des Objekts und nicht verlangen, dass ich code ein __exit__ Funktion? Idealerweise würde behaupten, dass die ref-Anzahl 0 war.
  • auch wenn der refcount > 0, kann man del den Namen des Objekts aus Ihrem eigenen Bereich und loszuwerden, die Namen - das ist völlig getrennt von tatsächlich zerstören das Objekt. Zum Beispiel, wenn ein Objekt eingesetzt worden war, in einen Behälter, dessen refcount wäre > 0, aber man konnte noch del den Namen, den Sie verwendet, um sich auf das Objekt selbst. Vielleicht ist das auch Teil deiner Verwirrung - del löscht den Namen, nicht auf das zugrunde liegende Objekt. Dies ist eine Unterscheidung in Python, C/C++ - Leute kämpfen mit - Sie sind den Umgang mit Namen und Bindungen auf die Namen, nicht die Variablen/Verweise alloc ' ed und befreit.
InformationsquelleAutor markets | 2011-02-21
Schreibe einen Kommentar