with

Menedżer kontekstu: automatyczne przygotowanie i sprzątanie zasobów.

Na tej stronie

Przykład

#
Python
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}")
Wynikzapisany wynik, możesz go sprawdzić
Start: pętle
Uczymy się: PĘTLE
Koniec: pętle

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

#
Składnia
with wyrazenie as nazwa:
    ...

Więcej przykładów

#
Otwieranie pliku
Python
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())
Wynikzapisany wynik, możesz go sprawdzić
Pętla for przechodzi po elementach

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ć o close(), 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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.