Module shelve je zajímavou kombinací slovníku, schopností modulu pickle a databázového backendu – umožňuje totiž komunikovat s daty zapiklenými na souborový systém (v podobě jisté databáze) pomocí slovníkových metod.
Stručně se dá říct, že po otevření příslušné databáze (zcela průhledně pomocí metody open()) se výsledný objekt chová skoro úplně stejně, jako kdyby to byl slovník – k datům se přistupuje pomocí jejich klíče (kterými však mohou být pouze řetězce), jen příslušnými hodnotami jsou zapiklené pythoní struktury a celý tento „slovník“ je uložen na souborovém systému.
shelve používá jako databázový backend ten z modulů dbm
, který je dostupný. Bohužel však jak dbm.gnu
, tak dbm.ndbm
fungují pouze na unixových platformách a vyžadují externí software (natožpak kompletně externí modul pybsddb). Je proto dosti pravděpodobné, že nakonec bude shelve používat modul dbm.dumb
.
Jak už název napovídá, modul dbm.dumb není určen pro rychlé zpracování (je celý napsán v Python'u) a ani není tak používán (a tím pádem ani testován za většího provozu) jako ostatní moduly. Narozdíl od nich se však můžete spolehnout na jeho přítomnost v základní instalaci Python'u.
*.dat
a *.dir
. Při jejím používání pak přibude soubor *.bak
. Jméno souborů odpovídá jménu filename, které přiřadíte databázi otevřením pomocí příkazu shelve.open(filename)
Objekt shelve
se vlastně chová jako soubor (stream) – před prací s daty ve „slovníku“ je třeba příslušnou databázi otevřít a na konci zase spořádaně uzavřít (jinak riskujete nezapsání dat). Stejně jako u souboru je preferovaným způsobem práce v Python'u 3.x využití kontextu with (za pomoci contextlib.closing()
):
Objekt shelve
podporuje skoro všechny metody slovníku, ale zároveň má několik vlastních:
shelve |
dict |
význam |
---|---|---|
cache | — |
pracovní cache perzistentního slovníku (z praktického hlediska je to objekt dict )
|
clear | clear | |
close | — | sesynchronizuje a uzavře perzistentní slovník |
— | copy | |
dict | — | objekt starající se o práci s piklenými hodnotami v perzistentním slovníku nad příslušným databázovým backendem * |
— | fromkeys | |
get | get | |
items | items | |
keyencoding | — |
deskriptor hodnoty parametru keyencoding (určuje kódování, v němž jsou uloženy klíče perzistentního slovníku) |
keys | keys | |
open | — | otevře perzistentní slovník |
pop | pop | |
popitem | popitem | |
setdefault | setdefault | |
sync | — |
– vyprázdní cache a provede synchronizaci
– při writeback=True zapíše všechny čekající (nepřiřazovací) operace |
update | update | |
values | values | |
writeback | — |
deskriptor hodnoty parametru writeback (určuje chování perzistentního slovníku vůči operacím upravujícím jeho obsah) |
dbm.dumb
jde o objekt _Database
, který je nadstavbou nad ABC (= Abstract Base Class) collections.MutableMapping
, která je základem mapovacích typů.
Plná forma otevření slovníkové databáze a význam jednotlivých parametrů jest:
filename
– jméno databázového souboru (či souborů)
flag
– způsob otevření databáze (r pro čtení, w pro zápis, c pro čtení a zápis, n pro čtení a zápis nad vždy novou databází)
protocol
– verze piklícího protokolu (podle verze Python'u, takže pro trojkový 3)
writeback
– způsob zápisu dat do paměti a databáze (viz následující slajd)
Ve výchozím nastavení atribute writeback=False
jsou hodnoty do databáze zapsány jen a pouze při přímém přiřazení nebo synchronizaci, tj. pro kód typu:
Nastavení atributu writeback=True
způsobí, že začne fungovat i kód typu..
..ovšem za tu cenu, že všechny uvedené operace budou probíhat pouze v paměti (v rámci cache perzistentního slovníku) a k jejich vlastnímu zápisu do databáze dojde až při nejbližší synchronizaci (ať už vyvolané uměle pomocí d.sync() nebo při samotném uzavření databáze pomocí d.close()).
Jelikož shelve používá na pozadí modul pickle a piklící formát není nijak zabezpečen proti nebezpečným datům =>
Nezapomínejte na rozdílné chování modulu shelve při zápisu dat podle hodnoty atributu writeback!
Modul shelve nepodporuje konkurenční přístup při zápisu => má-li jeden program databázi otevřenou pro zápis, nepřipojujte se k ní žádným dalším! Pro čtení však počet přístupů podobné omezení nemá.
Díky použitému databázovému backendu sdílí modul shelve i jeho nedostatky – ukládané hodnoty nemohou být příliš veliké a v řídkých případech může dojít ke kolizi klíčů.