Fix dbshelve and much of dbtables.
diff --git a/Lib/bsddb/dbshelve.py b/Lib/bsddb/dbshelve.py
index 354229d..1f7fdc1 100644
--- a/Lib/bsddb/dbshelve.py
+++ b/Lib/bsddb/dbshelve.py
@@ -37,6 +37,8 @@
class DictMixin: pass
from . import db
+_unspecified = object()
+
#------------------------------------------------------------------------
@@ -163,18 +165,19 @@
return self.db.associate(secondaryDB, _shelf_callback, flags)
- #def get(self, key, default=None, txn=None, flags=0):
- def get(self, *args, **kw):
- # We do it with *args and **kw so if the default value wasn't
- # given nothing is passed to the extension module. That way
- # an exception can be raised if set_get_returns_none is turned
- # off.
- data = self.db.get(*args, **kw)
- try:
- return pickle.loads(data)
- except (TypeError, pickle.UnpicklingError, EOFError):
- return data # we may be getting the default value, or None,
- # so it doesn't need unpickled.
+ def get(self, key, default=_unspecified, txn=None, flags=0):
+ # If no default is given, we must not pass one to the
+ # extension module, so that an exception can be raised if
+ # set_get_returns_none is turned off.
+ if default is _unspecified:
+ data = self.db.get(key, txn=txn, flags=flags)
+ # if this returns, the default value would be None
+ default = None
+ else:
+ data = self.db.get(key, default, txn=txn, flags=flags)
+ if data is default:
+ return data
+ return pickle.loads(data)
def get_both(self, key, value, txn=None, flags=0):
data = pickle.dumps(value, self.binary)