2013-02-14 8 views
6

Czytałem niektóre kodu w standardowej bibliotece threading (Python 2.6) i był kawałek kodu, który mnie zastanawiać. Można go skrócić do następującej strukturze (w porównaniu do metody __bootstrap_inner w threading.py):Usuwanie zmiennych w bibliotekach standardowych Python

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 

Zmienne te nie wykraczają poza zakres foo. Czy jest jakikolwiek powód do usunięcia tych odniesień na końcu?

Odpowiedz

8

Tak, przynajmniej dla exc_tb; obiekty traceback przechowują odwołanie do bieżącej ramki, co powoduje, że jest to odwołanie cykliczne.

Usuwając lokalny odnośnik, przerwiesz ten krąg, więc nie musisz mieć nadziei i ufać, że śmieciarz będzie w stanie to zrobić.

Z sys.exc_info() function docs:

ostrzegawczy: przypisywanie wartości powrotu Traceback do lokalnej zmiennej w funkcji, który obsługuje wyjątek spowoduje okrągły odniesienie. Zapobiegnie to gromadzeniu śmieci przez elementy, do których odwołuje się zmienna lokalna w tej samej funkcji lub przez traceback. Ponieważ większość funkcji nie wymaga dostępu do śledzenia, najlepszym rozwiązaniem jest użycie czegoś takiego, jak exctype, value = sys.exc_info()[:2], aby wyodrębnić tylko typ i wartość wyjątku. Jeśli potrzebujesz funkcji traceback, pamiętaj o usunięciu jej po użyciu (najlepiej zrobić to za pomocą instrukcji try ... finally) lub zadzwoń pod numer exc_info() w funkcji, która sama nie obsługuje wyjątku.

+0

Ah, rozumiem. Jakoś tęskniłem za tym w dokumentach. Dziękuję Ci! – freakish

Powiązane problemy