Ten materiał na temat języka Python wyjaśni Ci do czego służy słowo kluczowe "with" 👀! To nie jest absolutnie fundamentalna wiedza pozwalająca na sprawne posługiwanie się Pythonem, aczkolwiek dzięki temu będziemy mogli wyrażać te same intencje w bardziej zwięzłej formie, przez co nasz kod będzie bardziej profesjonalny 🤩! Zapraszam Cię serdecznie do środka 😄!
CZYM JEST "WITH" W JĘZYKU PYTHON?
Instrukcja "with" jest kolejną z wielu konstrukcji Pythona, których nie zobaczymy w innych językach programowania 😮. Odpowiada za automatyczne zarządzanie dowolnym zasobem od strony bezpieczeństwa ♻️. Konkretniej, chodzi o możliwość operowania na jakimś obiekcie (np. pliku) bez ręcznego pisania instrukcji odpowiedzialnych za inicjalizację, obsługę wyjątków i zakończenie, które są niezbędne do zapewnienia bezpiecznego przepływu kodu ❤️.
Od strony kodu źródłowego, "with" jest "zwiniętą" formą całej konstrukcji do przechwytywania wyjątków, czyli "try", "except" i "finally", która umożliwia bezpieczne operowanie na danym zasobie 👍. Doskonale to widać w oficjalnej dokumentacji, w której ukazano porównanie dwóch kodów źródłowych: z użyciem "with" i bez niego 🔍.
Także jednym zdaniem, "with" w języku Python jest konstrukcją zapewniającą prawidłową i bezpieczną obsługę danego zasobu w kontekście inicjalizacji, przechwytywania wyjątków oraz zamknięcia zasobu , dzięki której nie musimy sami uwzględniać okoliczności, że coś może się nie powieść albo że trzeba zamknąć dany zasób ✅.
Tak wygląda teoria, a teraz czas na praktykę 🎯!
JAK UTWORZYĆ INSTRUKCJĘ "WITH" W JĘZYKU PYTHON?
W Pythonie, instrukcję "with" tworzymy następująco 👇:
with [wywołanie funkcji zwracającej zasób] as [nazwa zmiennej przechowującej pobrany zasób]:
[instrukcje]Popatrzmy na "wzór" instrukcji "with" ("wraz z"), który składa się z następujących wierszy 👇:
- słowo kluczowe "with",
- wywołanie funkcji zwracającej zasób dowolnej postaci, lecz najczęściej będzie to obiekt powstały z klasy,
- słowo kluczowe "as",
- nazwa zmiennej reprezentującej pobrany zasób (alias),
- znak dwukropka (obowiązkowa rzecz, bez której będzie błąd składniowy 🚫),
- instrukcje po zrobieniu obowiązkowego wcięcia (poprzez spację lub tabulator), które mają się wykonać dla pobranego zasobu.
Opiszę krótko każdy z punktów 📝!
Zaczynamy zawsze od słowa "with" 🙂. Następnie wprowadzamy wywołanie funkcji zwracającej zasób, na jakim chcemy przeprowadzić jakieś czynności ↩️. Po nim dopisujemy alias dla wartości zwracanej przez funkcję używając słowa kluczowego "as" i podając nazwę zmiennej. Ostatnim elementem jaki mi się znaleźć w tym samym wierszu jest dwukropek jako obowiązkowa część w Pythonie, bez której zrobi nam się błąd składniowy 🚫.
Na samym końcu przechodzimy do kolejnego wiersza i wykonując również obowiązkowe wcięcie w postaci spacji lub tabulatora (jest to znak dla Pythona, że te instrukcje "należą" do bloku "with" ℹ️), piszemy wszystko to, co chcemy wykonać na zasobie ☑️. Najlepiej, aby to były tylko takie instrukcje, które są bezpośrednio związane z zasobem.
Tak wygląda postać instrukcji "with" w języku Python, którą prawdopodobnie będziesz widzieć najczęściej. No to teraz konkretny przykład 👀!
PRZYKŁAD UŻYCIA INSTRUKCJI "WITH" W JĘZYKU PYTHON
Załóżmy, że chcemy napisać prosty skrypt, w którym dochodzi do otwarcia i odczytania treści pliku tekstowego 📂. Można to zrobić formą tradycyjną, czyli poprzez użycie funkcji "open", tak jak to robiliśmy w załączonym artykule 👇:
my_file = open('file.txt', 'r')i następnie skorzystać z metody "read" 👇:
print(my_file.read())aczkolwiek ten zapis nie chroni nas przed potencjalnymi konsekwencjami spowodowanymi incydentami prowadzącymi do zgłoszenia wyjątku podczas korzystania z tego zasobu np. brak uprawnień do zapisu 💥. Ponadto, musimy ręcznie zamknąć plik metodą "close" 👇:
my_file.close()więc narażamy się na kolejny problem w przypadku, gdy po prostu zapomnimy to zrobić 😬.
Teraz spójrz na użycie instrukcji "with" do tego zadania, która zrobi dokładnie to samo 👇:
with open('file.txt', 'r') as my_file:
print(my_file.read())Wszystko 😁. Korzystając z "with" nie musimy wywoływać metody do zamykania pliku, ponieważ plik zostanie zamknięty za nas 🤩! Ponadto, gdyby cokolwiek nawaliło w trakcie wykonywania instrukcji, to wtedy plik także zostanie zamknięty, aby zapobiec dalszym anomaliom ❤️.
Gdybyś wciąż potrzebował(a) porównania sobie instrukcji "with" do bloku przechwytywania wyjątków, poniżej wygląda ekwiwalent powyższej postaci 👇:
my_file = open('file.txt', 'r')
try:
print(my_file.read())
finally:
my_file.close()To da ten sam efekt 👌.
![]() |
Instrukcja "with" w języku Python to konstrukcja automatycznie zarządzająca zasobem pod kątem inicjalizacji, obsługi wyjątków oraz zamknięcia zasobu. Jest zwięzłym odpowiednikiem przechwytywania wyjątków uwzględniającego bloki "try", "except" oraz "finally".
Mamy omówiony cały temat pod kątem działania instrukcji "with" w języku Python, natomiast warto jeszcze się dowiedzieć od czego zależy możliwość skorzystania z instrukcji "with" i to zostawiłem na deser 🍰!
CO NALEŻY ZROBIĆ, ABY MÓC SKORZYSTAĆ Z INSTRUKCJI "WITH" W JĘZYKU PYTHON NA DANYM ZASOBIE?
Instrukcja "with" w Pythonie nie jest dostępna do użycia od razu 😳. Aby móc z niej skorzystać na naszych obiektach, klasa musi posiadać tzw. "menedżera kontekstu" 🔥! Jest to mechanika automatycznego zarządzania danym obiektem pod kątem pamięci i operacji niezbędnych do prawidłowego funkcjonowania, zarówno od strony inicjalizacji, jak i zakończenia 💡.
Python definiuje menedżer kontekstu dla klasy, bazując na dwóch metodach o specyficznych nazwach 👇:
- "__enter__",
- "__exit__".
"enter" wykonuje instrukcje w momencie "wejścia" do bloku "with", a "exit", po ostatniej instrukcji bloku "with" w momencie "wychodzenia" z niej ✔️. Python dla metod dostępnych do przesłonięcia (czyli do zastąpienia domyślnych instrukcji we wbudowanej metodzie nowymi ℹ️), korzysta z nietypowego oznaczenia w postaci dwóch znaków podkreślenia z rzędu, po obu stronach nazwy metody 💥.
Obie te metody muszą być zdefiniowanie w obrębie klasy, aby jej obiekty były "dopuszczone" do korzystania z instrukcji "with" 🔑! Czyli gdybyśmy pisali własną klasę do obsługi pliku z użyciem instrukcji "with", tak musiałaby wyglądać definicja 👇:
class MyFileHandler:
def __enter__(self):
self.my_file = open('file.txt', 'r')
return self.my_file
def __exit__(self, exc_type, exc, tb):
self.my_file.close()
def read(self):
print(self.my_file.read())Mając metody "__enter__" oraz "__exit__", możemy teraz bez problemu skorzystać z bloku "with", wstawiając w miejsce wyrażenia zwracającego zasób konstruktor 👇:
with MyFileHandler() as my_file_handler:
print(my_file_handler.read())To nam da taki sam efekt 😊. Oto cała "magia" kryjąca się za ułatwieniem pisania przez instrukcję "with" w języku Python 🎉!
Tyle w tym temacie 😎. Od teraz już będziesz wiedzieć czym w Pythonie jest instrukcja "with", jak się z niej korzysta, jakie płyną z niej korzyści oraz w jaki sposób ona działa "pod maską" 🔥! Na pewno kiedyś Ci się przyda 😉!
