shelve problem

Michael Mulcahy mikegmulcahy at eircom.net
Tue Mar 2 11:58:28 EST 2004


Hi All,

Problem: Shelve module doesn't like me

OS: Win2000
version: 2.3.3 

Here is simple reproduction code and the error that occurs:

import shelve, anydbm
try:
    test = shelve.open('hello', 'r') # file hello does not exist
except:
    pass # this is called as hello does not exist

Exception exceptions.AttributeError: "DbfilenameShelf instance has no
attribute 'writeback'" in
>>> 

Stack:
'__main__', line 7: pass
'shelve'.__del__(), line 148: self.close()
'shelve'.close(), line 140: self.sync()
> 'shelve'.sync, line 151: if self.writeback and self.cache:

Forgive me if this query is obvious but I have searched mailing lists
and google but could not resolve the issue.

Speculative Analysis:

shelve.open calls the DbfilenameShelf constructor passing the filename
"hello".

The DbfilenameShelf constructor does the following:

    def __init__(self, filename, flag='c', protocol=None,
writeback=False, binary=None):
        import anydbm
        Shelf.__init__(self, anydbm.open(filename, flag), protocol,
writeback, binary)

The function anydbm.open throws an exception because:
    1. the filename does not exist 
    2. the flag does not not contain a 'c' or an 'n' 
    (See anydbm.py line 77)

As the file "hello" does not exist the exception is thrown and caught
in my code.

I presume that python constructs the DbfilenameShelf object but does
not construct the parent shelf object because of that exception.

Then when python is cleaning up it destructs the DbfilenameShelf
object which I presume calls the destructor of the parent shelf
object. As the shelf object was not created due to initial exception,
python could not see the attributes and hence the Attribute Error
exception.

Comments Anyone?

Any questions please do not hesitate to contact me.

Michael.



More information about the Python-list mailing list