dersblog

Python with komutu, ContextManager

Bir bloğun etrafında yapılacak öncesi / sonrası işlemlerini, daha özel olarak sürekli tekrarlanan rutin temizlik hareketlerini modülerize hale getirmek için Python with kullanılabilir. Standart örnek

with open('/tmp/workfile', 'r') as f:    read_data = f.read()

Örnekteki with şunları yapar; kod bloğuna girmeden önce dosya açılir, çıktıktan sonra kapanır, bloktan çıkış nasıl olursa olsun. Fakat bu örnek bazı şeyleri göstermiyor; birincisi öpen komutu özel şekilde kodlanmıştır ki with ile kullanılabilsin. Daha kısa bir örnek

from contextlibimport contextmanager

@contextmanager
def tag(name):
    print "<%s>" % name
    yield
    print "</%s>" % namewith tag("h1"):
    print "foo"

Burada tag komutunun with ile nasil kullanilabilir hale getirildigini goruyoruz. tag icindeki yield komutu bir "yer isaretleyici / tutucu (placeholder)", islem o noktaya gelince with blogunun icindeki komutlar isletilir, yukaridaki ornekte print komutu. Bir ornek daha

from contextlib import contextmanagerimport os

@contextmanagerdef working_directory(path):
    current_dir = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(current_dir)

with working_directory("data/stuff"):
    # data/stuff icinde bir seyler yap

Örnekte working_directory with ile çağrıldığı zaman parametre olarak verilen string bir dizin olarak kabul edilir, o dizine "gidilir", sonra with bloğunda tanımlanan şeyler yapılır (yield), ve sonra o dizinden çıkılır. Çıkış işleminin finally içinde yapılması, işleyiş sırasında istisna (Exception) olsa / atılsa bile bu işin yapılmasını garantiler (open kodlamasında da herhalde benzer işler yapılıyor, açılmış dosyayı kapatmak için).

Kısaca with ile kullanılan bloklar "çevresinde" hep olacak / beraber olmasını istediğimiz kod parçalarını biraraya koyabiliriz.

http://docs.python.org/2/tutorial/inputoutput.html

http://docs.python.org/2/library/contextlib.html

http://stackoverflow.com/questions/3012488/what-is-the-python-with-statement-designed-for


Yukarı