with a finally
#
Čteš-li tyto materiály poprvé, tuto sekci můžeš s klidným svědomím přeskočit. Pokročilejším ale doporučuju vsadit věci do širšího kontextu.
Příkaz with pracuje s tzv. kontextem (tady s kontextem otevřeného
souboru), který má začátek a konec a při ukončení je potřeba něco udělat
(tady zavřít soubor).
Kontext je v podstatě zkratka pro try/finally. Pamatuješ si na finally?
Toto:
with open('basnicka.txt', encoding='utf-8') as soubor:
# Zpracování souboru
obsah = soubor.read()
je zkratka pro:
soubor = open('basnicka.txt', encoding='utf-8')
try:
# Zpracování souboru
obsah = soubor.read()
finally:
# Ukončení kontextu
soubor.close()
Jak with tak finally zaručí, že se soubor vždy uzavře:
když se zpracování povede, ale i když v něm nastane výjimka,
nebo když z něj vyskočíš pomocí return nebo break:
def nacti_cele_cislo(jmeno_souboru):
with open(jmeno_souboru, encoding='utf-8') as soubor:
return int(soubor.read())
# I když "return" vyskočí z funkce (nebo int() zbůsobí ValueError),
# soubor se zavře.
# Pro vyzkoušení napiš do souboru 'cislo.txt' nějaké číslo.
print(nacti_cele_cislo('cislo.txt') * 11)
Chování příkazu with závisí na objektu, se kterým jej použiješ.
Pro soubor – výsledek funkce open – se soubor na konci bloku zavře.
Podobných „samozavíracích“ objektů, které se dají použít s with, existuje
v různých knihovnách víc.
Typické jsou objekty, které se starají o připojení např. k jinému počítači
nebo k databázi, kdy je po práci dobré spojení ukončit a „uklidit po sobě“.
Z lekce o testování si možná pamatuješ with pytest.raises(...):.
Výsledek pytest.raises na konci bloku with kontroluje, že v rámci bloku
nastala správná výjimka.