2009-09-02 8 views

Odpowiedz

247

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.

+4

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

+9

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. –

+1

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 –

325

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.

+57

Zrozumiałem to znacznie lepiej niż zaakceptowana odpowiedź. Dzięki. – rayryeng

+7

Znalazłem pełne wyjaśnienie na przykładach, tutaj: http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890

+1

wielkie wyjaśnienie :) – jax