with
Menedżer kontekstu: automatyczne przygotowanie i sprzątanie zasobów.
Przykład
#from contextlib import contextmanager
@contextmanager
def lesson(title):
print(f"Start: {title}")
try:
yield title.upper()
finally:
print(f"Koniec: {title}")
with lesson("pętle") as name:
print(f"Uczymy się: {name}")Definicja i zastosowanie
#Instrukcja with używa menedżera kontekstu, który przygotowuje zasób przed blokiem i sprząta po nim, nawet jeśli w bloku wystąpi błąd. Najbardziej znany przykład to otwieranie pliku: po wyjściu z bloku plik zostanie zamknięty automatycznie.
Menedżerami kontekstu są też na przykład blokady wątków, połączenia z bazą danych czy tymczasowe zmiany ustawień. Możesz używać kilku naraz, oddzielając je przecinkami.
Własny menedżer kontekstu napiszesz jako klasę z metodami __enter__ i __exit__ albo prościej, jako funkcję z dekoratorem @contextmanager z modułu contextlib.
Składnia
#with wyrazenie as nazwa:
...Więcej przykładów
#with open("notatki.txt", "w", encoding="utf-8") as file:
file.write("Pętla for przechodzi po elementach\n")
with open("notatki.txt", encoding="utf-8") as file:
print(file.read().strip())Plik zostanie zamknięty po każdym bloku with, nawet gdyby zapis zgłosił błąd.
Dobre praktyki
#- Pliki zawsze otwieraj przez
with. Nie musisz pamiętać oclose(), a plik zamknie się także po błędzie. - Przy plikach tekstowych podawaj
encoding="utf-8", żeby polskie znaki działały tak samo na każdym systemie.
Powiązane hasła
#- open()Otwiera plik do odczytu lub zapisu i zwraca obiekt pliku.
- try, except, else, finallyObsługa wyjątków: przechwytywanie błędów bez przerywania programu.
- yieldTworzy generator: funkcję zwracającą kolejne wartości na żądanie.
- classDefiniuje klasę: szablon obiektów łączący dane i funkcje, które na nich działają.
Widzisz błąd albo brakuje przykładu? Napisz do nas.