Rozważ następujące:
with open(path, mode) as f:
return [line for line in f if condition]
Czy plik zostanie poprawnie zamknięty, czy też użycie go return
pomija menedżera kontekstu ?
python
return
with-statement
Lekka bryza
źródło
źródło
else
można dodać,with
aby rozwiązać tentry with except
problem. edycja: dodano do językaProcess.terminate()
jest to jeden z niewielu (jedynych?) Scenariuszy, który nie gwarantuje wywołaniafinally
instrukcji: „Pamiętaj, że procedury obsługi wyjścia i klauzule wreszcie itd. Nie będą wykonany."os._exit
jest czasem używany - wychodzi z procesu Python bez wywoływania procedur czyszczących.with
bloku, czy gwarancja obowiązuje tak długo, jak długo generator generuje wartości? tak długo, jak cokolwiek to odwołuje? Czy muszę użyćdel
lub przypisać inną wartość zmiennej, która przechowuje obiekt generatora?ValueError: I/O operation on closed file.
.Tak.
.. jest prawie równoważne z:
Dokładniej,
__exit__
metoda w menedżerze kontekstu jest zawsze wywoływana przy wychodzeniu z bloku (niezależnie od wyjątków, zwrotów itp.). Metoda obiektu pliku__exit__
wywołuje tylkof.close()
(np. Tutaj w CPython )źródło
finally
keywrod jest:def test(): try: return True; finally: return False
.Tak. Mówiąc bardziej ogólnie,
__exit__
metoda With Context Context Manager rzeczywiście zostanie wywołana w przypadkureturn
z wewnątrz kontekstu. Można to przetestować za pomocą:Dane wyjściowe to:
Powyższe dane wyjściowe potwierdzają, że
__exit__
wywołano je mimo wczesnego okresureturn
. W związku z tym menedżer kontekstu nie jest pomijany.źródło
Tak, ale w innych przypadkach może wystąpić pewien efekt uboczny, ponieważ może on zrobić coś (np. Bufor opróżniania) w
__exit__
blokuźródło