40 Stimmen

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++, bei dem ein Objekt bei seiner Erstellung initialisiert wird. Wenn dies fehlschlägt, wird eine eine Ausnahme. Auf diese Weise weiß der Programmierer, dass das Objekt niemals in einem halbfertigen Zustand belassen wird. Python kann so viel tun.

RAII arbeitet aber auch mit den Scoping-Regeln von C++ um die sofortige Zerstörung des Objekts sicherzustellen. Sobald die Variable vom Stapel springt, wird sie zerstört. Dies kann in Python geschehen, aber nur wenn es keine externen oder zirkulären Referenzen gibt.

Noch wichtiger ist, dass ein Name für ein Objekt so lange existiert, bis die Funktion, in der es sich befindet in der es steht, beendet wird (und manchmal länger). Variablen auf der Modulebene werden bleiben für die gesamte Lebensdauer des Moduls bestehen.

Ich würde gerne eine Fehlermeldung erhalten, wenn ich so etwas mache:

for x in some_list:
    ...

... 100 lines later ...

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

Ich könnte die Namen manuell löschen, nachdem ich sie benutzt habe, aber das wäre ziemlich unschön und würde mich viel Mühe kosten.

Und in diesem Fall möchte ich, dass es das tut, was ich meine:

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 führt ein gewisses Scoping durch, aber nicht auf der Ebene der Einrückung, sondern nur auf der Funktionsebene. Es scheint albern zu verlangen, dass ich eine neue Funktion zu erstellen, nur damit ich die Variablen einordnen und einen Namen wiederverwenden kann.

Python 2.5 hat die Anweisung "mit" aber das erfordert, dass ich explizit in __enter__ y __exit__ Funktionen und scheint im Allgemeinen mehr auf das Aufräumen von Ressourcen wie Dateien und Mutex-Sperren unabhängig vom Exit-Vektor. Es hilft nicht beim Scoping. Oder übersehe ich etwas?

Ich habe nach "Python RAII" und "Python scope" gesucht und konnte nichts finden, was die das Problem direkt und verbindlich behandelt. Ich habe alle PEPs durchgesehen. Das Konzept scheint nicht angesprochen zu werden innerhalb von Python.

Bin ich ein schlechter Mensch, weil ich Scoping-Variablen in Python haben möchte? Ist das einfach zu unpythonisch?

Verstehe ich es nicht?

Vielleicht versuche ich, die Vorteile der dynamischen Aspekte der Sprache zu schmälern. Ist es egoistisch, manchmal den Geltungsbereich erzwungen haben zu wollen?

Bin ich faul, weil ich den Compiler/Interpreter brauche? meine fahrlässigen Fehler bei der Wiederverwendung von Variablen bemerkt? Nun, ja, natürlich bin ich faul, aber bin ich auf eine schlechte Art und Weise faul?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X