Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären

Ich bin ziemlich neu bei Python, hier ist ein Code, den ich ansehe:

try: connection = getConnection(database) cursor = connection.cursor() cursor.execute("some query") except: log.error("Problem.") raise finally: cursor.close() connection.close() 

Ist das richtig gereinigt? In anderen Sprachen habe ich geschrieben, ich bin gewohnt, so etwas zu machen:

 connection = None cursor = None try: connection = getConnection(database) cursor = connection.cursor() cursor.execute("some query") except: log.error("Problem.") raise finally: if cursor is not None: cursor.close() if connection is not None: connection.close() 

2 Solutions collect form web for “Mit einer Variablen in einem Versuch, Fang, endgültige Aussage, ohne es draußen zu erklären”

Python hat keinen Blockumfang. Alles, was innerhalb des try Blocks definiert ist, steht draußen zur Verfügung.

Das heißt, du hättest doch noch ein Problem: Wenn es der getConnection() , der den Fehler getConnection() , wird der cursor undefiniert, also wird die Referenz im finally Block fehlerhaft.

Ich würde vorschlagen, Kontexte, wie:

 from contextlib import closing try: with closing(getConnection(database)) as connection: with closing(connection.cursor()) as cursor: cursor.execute("some query") except: log.error("Problem") raise 

Dies soll die Schließung sicherstellen (siehe hier ). In manchen Fällen brauchst du nicht einmal zu closing da die Verbindung höchstwahrscheinlich das Kontextprotokoll selbst unterstützt, also das wäre nur with getConnection(database)...

  • Python: Wie erfasse ich eine Variable, die in einem nicht globalen Ahnenumfang angegeben ist?
  • Warum verschachtelte Funktionen auf Variablen von äußeren Funktionen zugreifen können, aber sie nicht ändern dürfen [duplizieren]
  • Python - Wie man eine globale Variable aus einer Funktion
  • Funktion Ortsname Bindung aus einem äußeren Bereich
  • Python-Funktion Anrufe sind Blutungen Umfang, stateful, nicht zu initialisieren Parameter?
  • Was bedeutet Umfang
  • __main__ und scoping in python
  • Python: Variablen sind noch zugänglich, wenn in try oder if definiert?
  • Lambda-Funktion acessing außerhalb variabel [duplicate]
  • Den Block der Befehle, die in der mit Anweisung ausgeführt werden sollen
  • Python eval (kompilieren (...), Sandkasten), Globals gehen in Sandbox, wenn nicht in def, warum?
  • Python ist die beste Programmiersprache der Welt.