Shelve Modülü' nün İşlevi

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

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