Shelve Modülü' nün İşlevi
Pardus-Linux.org | Wiki sitesinden
Bu çeviri shelve modülünün içerisindeki tanımdan yapılmıştır...
import shelve d = shelve.open(dosyaadı) # dosyayı (g)dbm adıyla, dosya uzantısı vermeden açıyoruz. d[anahtar] = veri # Veriyi anahtar adıyla saklıyoruz. (eğer anahtar adı zaten varsa eski veri silinecektir) veri = d[anahtar] # anahtar adıyla saklanan verinin bir KOPYASINI alıyoruz (Eğer bu adda bir anahtar yoksa KeyError hatası verilir) Bu yapının, anahtara ait verinin bir *kopyasını* döndürdüğüne dikkat edin! del d[anahtar] # anahtar adıyla saklanan veriyi siler. (Eğer bu adda bir anahtar yoksa KeyError hatası verilir) flag = d.has_key(anahtar) # Eğer anahtar varsa "true" döndürülür. "anahtar in d" ifadesi ile aynı işi yapar. liste = d.keys() # varolan bütün anahtarların bir listesi (yavaştır!) d.close() # dosyayı kapat Uygulama şekline bağlı olarak, değişiklikleri diske yazmak için kalıcı sözlüğü kapatmak gerekebileceği gibi, gerekmeyebilir de. Normalde d[anahtar] ifadesi verinin bir KOPYASINI döndürür. Değiştirilebilir veriler değiştirilirken şu noktaya dikkat etmek gerekir: Örneğin eğer d[anahtar] bir listeyse, d[anahtar].append(öğe) yapısı, kalıcı olarak eşlenmiş olan d[anahtar] içinde bir değişiklik yapmaz. Değişen yalnızca kopyanın kendisidir. Bu değişiklik ise dikkate alınmayacak, dolayısıyla append metodunun herhangi bir etkisi olmayacaktır. Kalıcı eşlemeyi etkileyecek şekilde d[anahtar]'a öğe eklemek için şunu kullanın: veri = d[anahtar] veri.append(öğe) d[anahtar] = veri Değiştirilebilir öğelerde sorun yaşamamak için shelve.open satırı içine argüman olarak writeback=True ifadesini ekleyebilirsiniz. Şu şekilde: d = shelve.open(dosyaadı, writeback=True) Böylece eriştiğiniz bütün öğeler önbellekte tutulacak, d.close() komutunu verdiğinizde bunlar kalıcı eşlemeye işlenecektir. Bu şekilde d[anahtar].append(öğe) yapısının istenen biçimde çalışması temin edilmiş olur. Ancak writeback=True argümanı önbellekleme işlemi için belleğe aşırı derecede yüklenilmesine sebep olur. Bu da d.close() komutunun çok yavaş çalışmasına yol açabilir. Eğer yukarıdaki gibi bir açma işlemi gerçekleştirip d'nin öğelerine bu şekilde erişmeye çalışırsanız, d'nin, erişmeye çalıştığınız öğelerin hangisinin değiştirilebilir olduğunu ve/veya hangilerinin gerçekten değiştirildiğini anlama şansı yoktur. Dolayısıyla eriştiğiniz bütün öğeler önbelleğe alınıp, kapanışta hepsinin diske yazılması gerekecektir. Önbellekteki bütün öğeleri diske yazıp önbelleği boşaltmak için d.sync() fonksiyonunu da kullanabilirsiniz. (d.sync() fonksiyonu, eğer mümkünse, aynı zamanda disk üzerindeki kalıcı sözlüğü de senkronize eder.)
