2013-02-08 7 views
12

Jestem ciekawy, czy jest uważane za bezpieczne lub dobrej praktyki, aby polegać na Pythona z ... jak oświadczenie. Na przykład podczas otwierania pliku:Czy dobrą praktyką jest polegać na python's z ... jak oświadczenie

with open("myfile","w") as myFile: 
    #do something 

Tak więc w tym przykładzie zaniedbane jawnie wywołać myFile.close() więc mogę przypuszczać, że to było nazywane po pyton wyszedł oświadczenie with...as wywołując obiektów __exit__() metody. Jest to dobra praktyka/bezpieczne zależeć od tego czy byłoby lepiej, aby zawsze jawnie wywołać file.close()

+0

Czy wiesz, że Twój przykładowy kod próbował odczytać plik otwarty do pisania? – geoffspear

+0

Ups, napisałem szybki przykład, naprawiłem to teraz. – Blaine

Odpowiedz

17

To właśnie menedżerowie kontekstowe są dla, polegać na im aby zamknąć plik dla ciebie. Menedżerowie kontekstu są wywoływani, nawet jeśli wystąpił wyjątek.

Alternatywą jest użycie finally blok Zamiast:

myFile = open("myfile","w") 
try: 
    # do something with myFile 
finally: 
    myFile.close() 

ale ponieważ blok wewnątrz try: może być długo, do czasu można dostać się do rachunku finally zapomnieli czego ustawienie to za.

Kontekstowe menedżery są jeszcze potężniejsze. Ponieważ metoda __exit__ jest informowana o wszelkich wyjątkach, mogą one również działać jako procedury obsługi wyjątków (zignoruj ​​wyjątek, utwórz inny itd.).

4

Tak, oświadczenie with jest lepszym sposobem. Od wersji Python 2.5 obiekt pliku został wyposażony w metody __enter__() i . Metoda __exit__() zamyka obiekt pliku.

Python gwarantuje, że zadzwoni pod metodę __exit__(), ale nie ma gwarancji, że metoda __exit__() zamknie zasób, szczególnie w przypadku kodu zewnętrznego. Musisz to sprawdzić ręcznie.