2012-05-29 12 views
5

Ich habe eine Frage über diesen auf der Prüfung den folgenden Code:wann Funktionsstack Daten in Python freigeben?

1,

def file_close_test(): 
    f = open('/tmp/test', 'w+') 

if __name__ == '__main__': 
    file_close_test() 
    # wait to see whether file closed. 
    import time 
    time.sleep(30) 

2,

def file_close_on_exc_test(): 
    f = open('/tmp/test', 'w+') 
    raise Exception() 

def exception_wrapper(): 
    try: 
     file_close_on_exc_test() 
    except: 
     pass 
    # wait to see whether file closed. 
    import time 
    time.sleep(10) 

if __name__ == '__main__': 
    exception_wrapper() 
    import time 
    time.sleep(30) 
  1. Die Objektdatei geschlossen, wenn die file_close_test Ausfahrten, weil keine Hinweis darauf.
  2. Nach der Ausnahme ausgelöst, das Dateiobjekt nicht geschlossen.so denke ich, die verwandten Stapel Daten nicht freigegeben.
  3. Nach exception_wrapper beenden, die Datei automatisch geschlossen.

Können Sie das für mich erklären? Vielen Dank.

Antwort

3

Die Ausnahme enthält ein Traceback-Objekt, mit dem auf alle lokalen Variablen in jedem Stapelrahmen zugegriffen werden kann, der aktiv war, als die Ausnahme ausgelöst wurde. Das bedeutet, dass Sie weiterhin auf die Datei zugreifen können, bis der Ausnahmekontext gelöscht ist.

Auch nach dem sleep() am Ende exception_wrapper könnten Sie sys.exc_info verwenden in der geöffneten Datei wie folgt zu erhalten:

tb = sys.exc_info()[2] 
print tb.tb_next.tb_frame.f_locals['f'] 

All dies ist natürlich spezifisch für die jeweilige Python-Implementierung Sie verwenden. Bei anderen Implementierungen werden Dateien möglicherweise erst implizit geschlossen, wenn sie nicht mehr benötigt werden.

Die Quintessenz ist, dass Sie nie von Pythons Referenzzählung oder Garbage Collection abhängig sein sollten, um Ressourcen wie offene Dateien zu bereinigen, tun Sie es immer explizit.

+1

Es ist auch nicht so schwer: 'mit öffnen ('/ tmp/test', 'w +') als f:' –

+0

es hilft mir sehr, danke :) – yancl