Do czego służy słowo kluczowe "z" pythona?Do czego służy słowo kluczowe "z" pythona?
Przykład z: http://docs.python.org/tutorial/inputoutput.html
>>> with open('/tmp/workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
Do czego służy słowo kluczowe "z" pythona?Do czego służy słowo kluczowe "z" pythona?
Przykład z: http://docs.python.org/tutorial/inputoutput.html
>>> with open('/tmp/workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
w Pythonie słowo kluczowe with
jest używany podczas pracy z niezagospodarowanych zasobów (jak strumienie plików). Jest podobny do oświadczenia using
w VB.NET i C#. Pozwala to upewnić się, że zasób zostanie "wyczyszczony", gdy kod, który z niego korzysta, zakończy działanie, nawet jeśli zostaną wprowadzone wyjątki. Dostarcza "cukru syntaktycznego" dla bloków try/finally
.
Od Python Docs:
Oświadczenie
with
wyjaśnia kod, który wcześniej byłoby użyćtry...finally
bloki, aby zapewnić czyste-up kod jest wykonywany. W tej sekcji omówię oświadczenie, ponieważ będzie ono powszechnie używane. W następnej sekcji przeanalizuję szczegóły implementacji i pokażę, jak pisać obiekty do użycia z tym stwierdzeniem.Oświadczenie
with
jest strukturą sterowania przepływem, którego podstawowa struktura jest następująca:with expression [as variable]: with-block
Wyrażenie jest oceniane i powinno doprowadzić do obiektu, który obsługuje protokół zarządzania kontekst (czyli ma
__enter__()
i__exit__()
metody).
Aktualizacja poprawiono objaśnienie VB na komentarz Scotta Wiśniewskiego. Rzeczywiście mylę with
z using
.
Jakie metody są stosowane w celu zamknięcia otwartego zasobu? Co się stanie, jeśli utworzę własny obiekt systemu plików, który ma własne specjalne metody otwierania/zamykania, czy słowo kluczowe "z" będzie z nim współpracować? Czy też "z" działa tylko z wbudowanymi typami zasobów Pythona? – MikeN
W Pythonie wygląda na to, że niestandardowy obiekt musiałby zaimplementować (lub dziedziczyć z czegoś, co implementuje) metody '__enter__' i' __exit__'. Z IronPython (python na.Netto) możesz zaimplementować z IDisposable i to go pokryje. Nie wiesz, jaki jest najlepszy sposób w czystym Pythonie lub innych frameworkach. –
FYI: to mylące wyrażenie "using" w VB.NET, które zachowuje się jak blok "z" w python, z instrukcją "with" w VB, która jest zupełnie inna. Zobacz: http://msdn.microsoft.com/en-us/library/htd05whh.aspx i http://msdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx –
Explanation from the Preshing on Programming blog:
Jest to przydatne, gdy masz dwa powiązane operacje, które chcesz wykonać jako para, z bloku kodu pomiędzy. Klasycznym przykładem jest otwierania pliku, manipulując plik, a następnie zamykając go:
with open('output.txt', 'w') as f: f.write('Hi there!')
Powyższy z oświadczeniem automatycznie zamknąć plik po zagnieżdżonego bloku kodu. (Kontynuuj czytanie, aby zobaczyć, jak dokładnie występuje zamknięcie ). Zaletą użycia instrukcji with jest to, że jest ona gwarantowana, aby zamknąć plik, bez względu na to, jak kończy się zagnieżdżony blok. Jeśli wystąpi wyjątek przed końcem bloku, zamknie plik , zanim wyjątek zostanie przechwycony przez zewnętrzną procedurę obsługi wyjątku. Jeśli zagnieżdżony blok miał zawierać instrukcję return lub instrukcję break lub , instrukcja with automatycznie zamknąłaby plik również w tych przypadkach.
Zrozumiałem to znacznie lepiej niż zaakceptowana odpowiedź. Dzięki. – rayryeng
Znalazłem pełne wyjaśnienie na przykładach, tutaj: http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890
wielkie wyjaśnienie :) – jax
może to pomóc: http://effbot.org/zone/python-with-statement.htm – Domenic