[Python-checkins] r87013 - in python/branches/py3k: Doc/library/dbm.rst Lib/dbm/dumb.py Lib/test/test_dbm_gnu.py Misc/NEWS Modules/_gdbmmodule.c
georg.brandl
python-checkins at python.org
Sat Dec 4 10:14:37 CET 2010
Author: georg.brandl
Date: Sat Dec 4 10:14:36 2010
New Revision: 87013
Log:
#6045: provide at least get() and setdefault() for all dbm modules.
Modified:
python/branches/py3k/Doc/library/dbm.rst
python/branches/py3k/Lib/dbm/dumb.py
python/branches/py3k/Lib/test/test_dbm_gnu.py
python/branches/py3k/Misc/NEWS
python/branches/py3k/Modules/_gdbmmodule.c
Modified: python/branches/py3k/Doc/library/dbm.rst
==============================================================================
--- python/branches/py3k/Doc/library/dbm.rst (original)
+++ python/branches/py3k/Doc/library/dbm.rst Sat Dec 4 10:14:36 2010
@@ -61,10 +61,15 @@
modified by the prevailing umask).
-The object returned by :func:`.open` supports most of the same functionality as
+The object returned by :func:`.open` supports the same basic functionality as
dictionaries; keys and their corresponding values can be stored, retrieved, and
deleted, and the :keyword:`in` operator and the :meth:`keys` method are
-available. Key and values are always stored as bytes. This means that when
+available, as well as :meth:`get` and :meth:`setdefault`.
+
+.. versionchanged:: 3.2
+ :meth:`get` and :meth:`setdefault` are now available in all database modules.
+
+Key and values are always stored as bytes. This means that when
strings are used they are implicitly converted to the default encoding before
being stored.
Modified: python/branches/py3k/Lib/dbm/dumb.py
==============================================================================
--- python/branches/py3k/Lib/dbm/dumb.py (original)
+++ python/branches/py3k/Lib/dbm/dumb.py Sat Dec 4 10:14:36 2010
@@ -203,7 +203,7 @@
# The blocks used by the associated value are lost.
del self._index[key]
# 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 has, so I'm not changing it). __setitem__ doesn't try to
# XXX keep the directory file in synch. Why should we? Or
# XXX why shouldn't __setitem__?
self._commit()
@@ -232,7 +232,7 @@
__del__ = close
- def _chmod (self, file):
+ def _chmod(self, file):
if hasattr(self._os, 'chmod'):
self._os.chmod(file, self._mode)
Modified: python/branches/py3k/Lib/test/test_dbm_gnu.py
==============================================================================
--- python/branches/py3k/Lib/test/test_dbm_gnu.py (original)
+++ python/branches/py3k/Lib/test/test_dbm_gnu.py Sat Dec 4 10:14:36 2010
@@ -32,6 +32,10 @@
key_set.remove(key)
key = self.g.nextkey(key)
self.assertRaises(KeyError, lambda: self.g['xxx'])
+ # get() and setdefault() work as in the dict interface
+ self.assertEqual(self.g.get(b'xxx', b'foo'), b'foo')
+ self.assertEqual(self.g.setdefault(b'xxx', b'foo'), b'foo')
+ self.assertEqual(self.g[b'xxx'], b'foo')
def test_error_conditions(self):
# Try to open a non-existent database.
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Sat Dec 4 10:14:36 2010
@@ -37,7 +37,9 @@
Library
-------
-- Issue 10620: `python -m unittest` can accept file paths instead of module
+- Issue #6045: dbm.gnu databases now support get() and setdefault() methods.
+
+- Issue #10620: `python -m unittest` can accept file paths instead of module
names for running specific tests.
- Issue #9424: Deprecate the `unittest.TestCase` methods `assertEquals`,
Modified: python/branches/py3k/Modules/_gdbmmodule.c
==============================================================================
--- python/branches/py3k/Modules/_gdbmmodule.c (original)
+++ python/branches/py3k/Modules/_gdbmmodule.c Sat Dec 4 10:14:36 2010
@@ -135,6 +135,28 @@
return v;
}
+PyDoc_STRVAR(dbm_get__doc__,
+"get(key[, default]) -> value\n\
+Get the value for key, or default if not present; if not given,\n\
+default is None.");
+
+static PyObject *
+dbm_get(dbmobject *dp, PyObject *args)
+{
+ PyObject *v, *res;
+ PyObject *def = Py_None;
+
+ if (!PyArg_UnpackTuple(args, "get", 1, 2, &v, &def))
+ return NULL;
+ res = dbm_subscript(dp, v);
+ if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
+ PyErr_Clear();
+ Py_INCREF(def);
+ return def;
+ }
+ return res;
+}
+
static int
dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
{
@@ -176,6 +198,29 @@
return 0;
}
+PyDoc_STRVAR(dbm_setdefault__doc__,
+"setdefault(key[, default]) -> value\n\
+Get value for key, or set it to default and return default if not present;\n\
+if not given, default is None.");
+
+static PyObject *
+dbm_setdefault(dbmobject *dp, PyObject *args)
+{
+ PyObject *v, *res;
+ PyObject *def = Py_None;
+
+ if (!PyArg_UnpackTuple(args, "setdefault", 1, 2, &v, &def))
+ return NULL;
+ res = dbm_subscript(dp, v);
+ if (res == NULL && PyErr_ExceptionMatches(PyExc_KeyError)) {
+ PyErr_Clear();
+ if (dbm_ass_sub(dp, v, def) < 0)
+ return NULL;
+ return dbm_subscript(dp, v);
+ }
+ return res;
+}
+
static PyMappingMethods dbm_as_mapping = {
(lenfunc)dbm_length, /*mp_length*/
(binaryfunc)dbm_subscript, /*mp_subscript*/
@@ -378,6 +423,8 @@
{"nextkey", (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__},
{"reorganize",(PyCFunction)dbm_reorganize,METH_NOARGS, dbm_reorganize__doc__},
{"sync", (PyCFunction)dbm_sync, METH_NOARGS, dbm_sync__doc__},
+ {"get", (PyCFunction)dbm_get, METH_VARARGS, dbm_get__doc__},
+ {"setdefault",(PyCFunction)dbm_setdefault,METH_VARARGS, dbm_setdefault__doc__},
{NULL, NULL} /* sentinel */
};
More information about the Python-checkins
mailing list