shelve implementation

David Fisher python at rose164.wuh.wustl.edu
Tue Feb 1 05:46:47 EST 2000


>>>>>>>>>>>>>>>>>> Original Message <<<<<<<<<<<<<<<<<<

On 1/31/00, 10:34:36 AM, Robin Becker <robin at jessikat.demon.co.uk> wrote 
regarding shelve implementation:


> can someone explain why shelve uses StringIO as an intermediate rather
> than doing the pickles direct

> ie shelve uses
>         def __getitem__(self, key):
>                 f = StringIO(self.dict[key])
>                 return Unpickler(f).load()

>         def __setitem__(self, key, value):
>                 f = StringIO()
>                 p = Pickler(f)
>                 p.dump(value)
>                 self.dict[key] = f.getvalue()


> whereas I would have done
>         def __getitem__(self, key):
>                 return loads(self.dict[key])

>         def __setitem__(self, key, value):
>                 self.dict[key] = dumps(value)

Well, I wasn't there but...  After glancing through shelve.py, 
pickle.py, cPickle.c, and marshal.c, and consulting with my 
numerologist, I have constructed the following plausible (i.e. Wrong) 
explaination.

The code in shelve would be faster than your code if the module 
cStringIO was available and the module cPickle wasn't.  Loads() and 
dumps() don't get rid of the StringIO() call, just move it into the 
pickle module, and pickle imports StringIO() from module StringIO, not 
cStringIO.  After consulting a chicken's innards, I suspect (i.e. 
Don't know) that cStringIO wasn't available at the time, and was 
actually inspired by the existance of pickle (now i'm really 
reaching).

Anyway, to make a long story short, i'm sure it made sense at the 
time.
If you wait a while, i'm sure that someone who was actually there, 
constructing mnemonic circuits with stone knives and bear skins, will 
tell you what they were thinking <wink>.

On another archeologial note, both cStringIO and cPickle are copyright 
Digital Creations and are the only modules that i have found:

#define UNLESS(E) if(!(E))

which lets them write code like:

	UNLESS(PyArg_ParseTuple(...))
		return NULL;

which i think is unbearably cute.







More information about the Python-list mailing list