diff -r 8885fc2e92b3 Lib/dbm/dumb.py --- a/Lib/dbm/dumb.py Tue May 13 11:30:17 2014 +0200 +++ b/Lib/dbm/dumb.py Tue May 13 15:05:35 2014 +0300 @@ -125,8 +125,10 @@ def __getitem__(self, key): if isinstance(key, str): key = key.encode('utf-8') - self._verify_open() - pos, siz = self._index[key] # may raise KeyError + try: + pos, siz = self._index[key] # may raise KeyError + except TypeError: + raise error('DBM object has already been closed') from None f = _io.open(self._datfile, 'rb') f.seek(pos) dat = f.read(siz) @@ -178,8 +180,13 @@ val = val.encode('utf-8') elif not isinstance(val, (bytes, bytearray)): raise TypeError("values must be bytes or strings") - self._verify_open() - if key not in self._index: + + try: + found = key in self._index + except TypeError: + raise error('DBM object has already been closed') from None + + if not found: self._addkey(key, self._addval(val)) else: # See whether the new value is small enough to fit in the @@ -206,9 +213,11 @@ def __delitem__(self, key): if isinstance(key, str): key = key.encode('utf-8') - self._verify_open() # The blocks used by the associated value are lost. - del self._index[key] + try: + del self._index[key] + except TypeError: + raise error('DBM object has already been closed') from None # XXX It's unclear why we do a _commit() here (the code always # XXX has, so I'm not changing it). __setitem__ doesn't try to # XXX keep the directory file in synch. Why should we? Or @@ -226,17 +235,21 @@ def __contains__(self, key): if isinstance(key, str): key = key.encode('utf-8') - self._verify_open() - return key in self._index + try: + return key in self._index + except TypeError: + raise error('DBM object has already been closed') from None def iterkeys(self): self._verify_open() return iter(self._index.keys()) __iter__ = iterkeys - def __len__(self): - self._verify_open() - return len(self._index) + def __len__(self): + try: + return len(self._index) + except TypeError: + raise error('DBM object has already been closed') from None def close(self): self._commit()