summaryrefslogtreecommitdiffstats
path: root/Lib/shelve.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/shelve.py')
-rw-r--r--Lib/shelve.py24
1 files changed, 19 insertions, 5 deletions
diff --git a/Lib/shelve.py b/Lib/shelve.py
index 7a75445..c8cba85 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -69,10 +69,19 @@ except ImportError:
from StringIO import StringIO
import UserDict
-import warnings
__all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]
+class _ClosedDict(UserDict.DictMixin):
+ 'Marker for a closed dict. Access attempts raise a ValueError.'
+
+ def closed(self, *args):
+ raise ValueError('invalid operation on closed shelf')
+ __getitem__ = __setitem__ = __delitem__ = keys = closed
+
+ def __repr__(self):
+ return '<Closed Dictionary>'
+
class Shelf(UserDict.DictMixin):
"""Base class for shelf implementations.
@@ -95,13 +104,13 @@ class Shelf(UserDict.DictMixin):
return len(self.dict)
def has_key(self, key):
- return self.dict.has_key(key)
+ return key in self.dict
def __contains__(self, key):
- return self.dict.has_key(key)
+ return key in self.dict
def get(self, key, default=None):
- if self.dict.has_key(key):
+ if key in self.dict:
return self[key]
return default
@@ -136,7 +145,12 @@ class Shelf(UserDict.DictMixin):
self.dict.close()
except AttributeError:
pass
- self.dict = 0
+ # Catch errors that may happen when close is called from __del__
+ # because CPython is in interpreter shutdown.
+ try:
+ self.dict = _ClosedDict()
+ except (NameError, TypeError):
+ self.dict = None
def __del__(self):
if not hasattr(self, 'writeback'):