Newbie question 2

Peter Otten __peter__ at web.de
Sun Nov 9 05:30:27 EST 2003


Rob wrote:

>> Traceback (most recent call last):
>>   File "C:\Python23\phone.py", line 118, in -toplevel-
>>     dele(dn,dp)
>>   File "C:\Python23\phone.py", line 70, in dele
>>     except (DBNotFoundError, NameError):
>> NameError: global name 'DBNotFoundError' is not defined

You have edited the code since you generated the traceback. 
Try to keep posted code as small as you can and make sure it is in sync with
the posted output.

> def dele(name,ptype):
>         e = shelve.open('C:/phonedata')
>         print e
>         f = name + ':' + ptype
>         print
>         try:
>             del e[str(f)]
>             e.close()
>             print 'Entry deleted.'
>         except (NameError):
>             print 'No Entries with '+ptype+' exist!'

(I'll confine my comments to the dele() function)

The error thrown when you try to delete a shelve entry with a non-existent
key is _bsddb.DBNotFoundError, so you probably want to catch that.
You want the shelve to be always closed, so put the e.close() call into a
finally statement.
The error message in the except clause is misleading as there *may* exist
entries with the shown ptype part of the key.
Don't duplicate constants, i. e. the filename.
Putting it all together:

import shelve, _bsddb

filename = 'C:/phonedata'

def dele(name, ptype):
    key = name + ':' + ptype
    db = shelve.open(filename)
    try:
        try:
            del db[key]
            print 'Entry', key, 'deleted.'
        except _bsddb.DBNotFoundError:
            print 'No Entries with', key, 'exist!'
    finally:
        db.close()

Peter





More information about the Python-list mailing list