Index: Lib/test/test_dbm.py =================================================================== --- Lib/test/test_dbm.py (revision 85567) +++ Lib/test/test_dbm.py (working copy) @@ -160,6 +160,17 @@ self.assertRaises(KeyError, lambda: self.d[b'xxx']) self.d.close() + def test_iter(self): + self.d = dbm.open(self.filename, 'c') + a = [(b'a', b'b'), (b'12345678910', b'019237410982340912840198242')] + for k, v in a: + self.d[k] = v + # An iterator always starts with the first element. + self.assertEqual(sorted(k for k in self.d), sorted(self.d.keys())) + self.assertEqual(sorted(k for k in self.d), sorted(self.d.keys())) + for k in self.d: + break + self.assertEqual(sorted(k for k in self.d), sorted(self.d.keys())) def test_main(): classes = [WhichDBTestCase] Index: Lib/test/test_dbm_gnu.py =================================================================== --- Lib/test/test_dbm_gnu.py (revision 85567) +++ Lib/test/test_dbm_gnu.py (working copy) @@ -33,6 +33,19 @@ key = self.g.nextkey(key) self.assertRaises(KeyError, lambda: self.g['xxx']) + def test_iter(self): + self.g = gdbm.open(filename, 'c') + self.g['a'] = 'b' + self.g['12345678910'] = '019237410982340912840198242' + self.g[b'bytes'] = b'data' + key_set = set(self.g.keys()) + # An iterator always starts with the first element. + self.assertEqual(key_set, {x for x in self.g}) + self.assertEqual(key_set, {x for x in self.g}) + for k in self.g: + break + self.assertEqual(key_set, {x for x in self.g}) + def test_error_conditions(self): # Try to open a non-existent database. unlink(filename) Index: Modules/_gdbmmodule.c =================================================================== --- Modules/_gdbmmodule.c (revision 85567) +++ Modules/_gdbmmodule.c (working copy) @@ -275,6 +275,12 @@ 0, /* sq_inplace_repeat */ }; +static PyObject * +dbm_iter(dbmobject *dbm) +{ + return PyObject_GetIter(dbm_keys(dbm, NULL)); +} + PyDoc_STRVAR(dbm_firstkey__doc__, "firstkey() -> key\n\ It's possible to loop over every key in the database using this method\n\ @@ -407,7 +413,7 @@ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ + (getiterfunc)dbm_iter, /*tp_iter*/ 0, /*tp_iternext*/ dbm_methods, /*tp_methods*/ }; Index: Modules/_dbmmodule.c =================================================================== --- Modules/_dbmmodule.c (revision 85567) +++ Modules/_dbmmodule.c (working copy) @@ -249,6 +249,12 @@ }; static PyObject * +dbm_iter(dbmobject *dbm) +{ + return PyObject_GetIter(dbm_keys(dbm, NULL)); +} + +static PyObject * dbm_get(register dbmobject *dp, PyObject *args) { datum key, val; @@ -354,7 +360,7 @@ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ + (getiterfunc)dbm_iter, /*tp_iter*/ 0, /*tp_iternext*/ dbm_methods, /*tp_methods*/ };