Bedeutung von "mit" Anweisung ohne "als" Schlüsselwort

Ich bin vertraut mit python's with Aussage als ein Mittel zur Sicherstellung der Finalisierung eines Objekts im Falle einer Ausnahme ausgelöst werden. Das sieht normalerweise aus

 with file.open('myfile.txt') as f: do stuff... 

Was kurz ist

 f = file.open('myfile.txt'): try: do stuff... finally: f.close() 

Oder was auch immer andere Finalisierungsroutine eine Klasse darstellen kann.

Ich kam vor kurzem auf ein Stück Code, das sich mit OpenGL befasste, der dies vorstellte:

 with self.shader: (Many OpenGL commands) 

Beachten Sie, dass Abwesenheit von irgendwelchen as Schlüsselwort. Zeigt dies an, dass die __enter__ und __exit__ Methoden der Klasse noch aufgerufen werden sollen, aber dass das Objekt nie explizit im Block verwendet wird (dh es funktioniert durch globale oder implizite referenzen)? Oder gibt es eine andere Bedeutung, die mir entgeht?

One Solution collect form web for “Bedeutung von "mit" Anweisung ohne "als" Schlüsselwort”

Der Kontextmanager kann optional ein Objekt zurückgeben, das dem mit as Bezeichner zugeordnet werden soll. Und es ist das Objekt, das von der __enter__ Methode zurückgegeben wird, die von as , nicht unbedingt dem Kontextmanager selbst zugeordnet ist.

Die Verwendung as <identifier> hilft beim Erstellen eines neuen Objekts, wie zB der open() Aufruf, aber nicht alle Kontextmanager werden nur für den Kontext erstellt. Sie können wiederverwendbar sein und wurden zum Beispiel bereits erstellt.

Nehmen Sie eine Datenbankverbindung . Sie erstellen die Datenbankverbindung nur einmal, aber viele Datenbankadapter können Sie die Verbindung als Kontextmanager verwenden. Geben Sie den Kontext ein und eine Transaktion wird gestartet, beendet sie und die Transaktion wird entweder verpflichtet (bei Erfolg) oder zurückgesetzt (wenn es eine Ausnahme gibt):

 with db_connection: # do something to the database 

Hier müssen keine neuen Objekte angelegt werden, der Kontext wird mit db_connection.__enter__() und wieder mit db_connection.__exit__() , aber wir haben bereits einen Verweis auf das Verbindungsobjekt.

Nun könnte es sein, dass das Verbindungsobjekt bei der Eingabe ein Cursorobjekt erzeugt. Nun ist es sinnvoll, diesen Cursor-Objekt in einem lokalen Namen zuzuordnen:

 with db_connection as cursor: # use cursor to make changes to the database 

db_connection noch nicht hier genannt, es existiert schon vorher, und wir haben schon einen db_connection auf sie. Aber was auch immer db_connection.__enter__() produziert wird nun dem cursor und kann von dort aus genutzt werden.

Dies geschieht mit Dateipräften. open() gibt ein fileobject.__enter__() und fileobject.__enter__() gibt das fileobject.__enter__() selbst zurück , also kannst du den open() Aufruf in einer with Anweisung verwenden und dem neu erstellten Objekt in einem Schritt anstatt zwei einen Verweis zuweisen. Ohne diesen kleinen Trick musst du verwenden:

 f = open('myfile.txt') with f: # use `f` in the block 

Wenn Sie das alles auf Ihr Shader-Beispiel anwenden, Du hast schon einen Verweis auf self.shader . Es ist sehr wahrscheinlich, dass self.shader.__enter__() einen Verweis auf self.shader , aber da hast du schon eine einwandfreie Referenz, warum self.shader du ein neues lokales dazu?

  • Verwenden von python "mit" -Anweisung mit try-except block
  • Ist es klug, mit Aussagen in Generatoren zu verwenden?
  • Bedingung mit Anweisung in Python
  • AttributeError: __ exit__ auf python 3.4
  • Python's `mit` Anweisung Ziel ist unerwartet Keine
  • Kontext-Manager für Pythons MySQLdb
  • Mit-Anweisung und Threading: Funktion ausführen vor laufen lassen
  • Ändern des Wertes einer Variablen in Python
  • Python ist die beste Programmiersprache der Welt.