Jednym z wyzwań dla mnie, aby zrozumieć tę with asfunkcję w Pythonie, jest to, że jej potrzeba nie jest oczywista, chyba że masz głębsze zrozumienie ograniczeń języka Python.
Na przykład programista Ruby, Julia, Lua, Go, JavaScript lub Swift nie potrzebuje tego stwierdzenia. Dlaczego?
Sednem problemu jest funkcja ceniona przez wielu programistów Pythona: użycie wcięć do wskazywania bloków kodu.
W JavaScript mógłbym napisać np.
openfile('foobar.txt', function(file) {
// called after file has been opened
// file is a handle to the open file
read_data(file)
...
});
openfile("foobar.txt", function(file)
-- called after file has been opened
-- file is a handle to the open file
read_data(file)
...
end)
openfile("foobar.txt", def (file):
# called after file has been opened
# file is a handle to the open file
read_data(file)
...
Ilustruje korzyści wynikające z posiadania symbolu sygnalizującego koniec bloku kodu zamiast zmiany wcięcia.
Przyjrzyjmy się bliżej korzyściom płynącym z posiadania przyjaznej składni dla wbudowanych zamknięć wielowierszowych. Zilustruję to przykładem kodu Julii, chociaż JavaScript, Lua i wiele innych języków działałoby równie dobrze.
function openfile(callback, filename::String)
file = open(filename)
callback(file)
close(file)
end
openfile(file -> print(readline(file)), "foobar.txt")
openfile("foobar.txt") do file
print(readline(file))
end
Piękno tego sposobu otwierania i zamykania plików polega na tym, że nie zapomnisz zamknąć pliku.
Jak wyjaśniono, trudno jest osiągnąć to samo w Pythonie, jego składnia. Tak with-aszostał wynaleziony. Pokażę, jak poprzedni przykład zostałby zaimplementowany w Pythonie.
class openfile:
def __init_(self, filename):
self.filename
def __enter__(self):
self.file = open(self.filename)
return file
def __exit__(self, exc_type, exc_val, exc_tb):
close(self.file)
Możemy użyć tej klasy do otwarcia i odczytania z pliku w ten sposób:
with openfile("foobar.txt") as file:
print(readline(file))
openfileklasy i przechowujemy nazwę pliku, który chcemy otworzyć.openfileklasy jest przekazywana do with-askonstrukcji, co powoduje __enter__wywołanie jej metody. Ma pozyskać pożądane przez nas surowce. W tym przypadku uchwyt pliku.as. Tak as fileodnosi się do obiektu zwróconego z __enter__. Imiona nie muszą się zgadzać. Mogliśmy as foobarzamiast tego napisać.with-asbloku zostanie uruchomiony, Python wywoła __exit__uwolnienie zasobów. Zostanie to również wywołane w przypadku wyrzucenia jakichkolwiek wyjątków.Istnieje wiele różnych sposobów tworzenia tych klas menedżera kontekstu , poprzez tworzenie podklas lub używanie dekoratorów.
Kiedy wysyłasz żądanie do facebook.com, Twój komputer wyszukuje nazwę domeny, aby przetłumaczyć tę nazwę domeny na adres IP, aby komputer mógł nawiązać to połączenie.
Nasz język jest potężnym narzędziem, które może kształtować nasze myśli, postawy i działania. Nawet pozornie nieszkodliwe terminy mogą utrwalać szkodliwe uprzedzenia i stereotypy.
W zeszłym tygodniu zauważyłem komunikat prasowy, wysłany za pośrednictwem PressGazette (brytyjski serwis informacyjny). W artykule ogłoszono, że Acast, skandynawska firma hostingowa i reklamowa podcastów, będzie przewodzić konsorcjum „prawdopodobnie najbardziej wpływowych” wydawców podcastów.
Niedawno byłem na Linkedin, największej profesjonalnej sieci społecznościowej na świecie, i znalazłem posty obserwowanych przeze mnie niezależnych projektantów, którzy przykuli moją uwagę. Wszyscy zamieszczali zdjęcia z samolotów, na plaży z laptopami, z basenów i biur z niesamowitymi widokami.
Kiedy dorastasz, zwykle słyszysz, że świat jest taki, jaki jest, a twoje życie polega na tym, by żyć swoim życiem w świecie, nigdy nie ryzykując życia, po prostu podążaj wyznaczoną ścieżką i umrzyj w końcu i staraj się nie za bardzo walnij w ściany. Ale to bardzo ograniczone życie.