2013-02-14 7 views
6

Ich habe etwas Code in einem Standard threading-Bibliothek (Python 2.6) gelesen und es gab ein Stück Code, der mich wunderte. Es kann auf die folgende Struktur verkürzen werden (vergleiche __bootstrap_inner Verfahren in threading.py):Löschen von Variablen in Python-Standardbibliotheken

def foo(): 
    exc_type, exc_value, exc_tb = sys.exc_info() 
    try: 
     # some code 
    except: 
     # some code 
    finally: 
     del exc_type, exc_value, exc_tb 

Diese Variablen gehen nicht außerhalb von foo Umfang. Gibt es einen Grund, diese Referenzen am Ende zu löschen?

Antwort

8

Ja, zumindest für exc_tb; traceback-Objekte enthalten einen Verweis auf den aktuellen Frame, und dies ist eine zirkuläre Referenz.

Durch das Löschen der lokalen Referenz brechen Sie diesen Kreis, so dass Sie nicht hoffen und darauf vertrauen müssen, dass der Garbage Collector dazu in der Lage ist.

Vom sys.exc_info() function docs:

Warnung: Zuweisen der Rückverfolgungsrückgabewert auf eine lokale Variable in einer Funktion, die eine Ausnahme ist der Umgang wird eine kreisförmige Referenz verursachen. Dadurch wird verhindert, dass alles, auf das von einer lokalen Variablen in der gleichen Funktion oder vom Traceback verwiesen wird, als Garbage Collection behandelt wird. Da die meisten Funktionen keinen Zugriff auf das Traceback benötigen, ist die beste Lösung, etwas wie exctype, value = sys.exc_info()[:2] zu verwenden, um nur den Ausnahmetyp und -wert zu extrahieren. Wenn Sie das Traceback benötigen, löschen Sie es nach der Verwendung (am besten mit einer try ... finally-Anweisung) oder rufen Sie in einer Funktion auf, die selbst keine Ausnahme behandelt.

+0

Ah, ich verstehe. Irgendwie habe ich das in der Dokumentation verpasst. Vielen Dank! – freakish

Verwandte Themen