Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4453cf5

Browse files
committed
merge 3.4 (#19385)
2 parents 5e746f2 + e3083d3 commit 4453cf5

3 files changed

Lines changed: 40 additions & 4 deletions

File tree

Lib/dbm/dumb.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,14 @@ def _commit(self):
118118

119119
sync = _commit
120120

121+
def _verify_open(self):
122+
if self._index is None:
123+
raise error('DBM object has already been closed')
124+
121125
def __getitem__(self, key):
122126
if isinstance(key, str):
123127
key = key.encode('utf-8')
128+
self._verify_open()
124129
pos, siz = self._index[key] # may raise KeyError
125130
f = _io.open(self._datfile, 'rb')
126131
f.seek(pos)
@@ -173,6 +178,7 @@ def __setitem__(self, key, val):
173178
val = val.encode('utf-8')
174179
elif not isinstance(val, (bytes, bytearray)):
175180
raise TypeError("values must be bytes or strings")
181+
self._verify_open()
176182
if key not in self._index:
177183
self._addkey(key, self._addval(val))
178184
else:
@@ -200,6 +206,7 @@ def __setitem__(self, key, val):
200206
def __delitem__(self, key):
201207
if isinstance(key, str):
202208
key = key.encode('utf-8')
209+
self._verify_open()
203210
# The blocks used by the associated value are lost.
204211
del self._index[key]
205212
# XXX It's unclear why we do a _commit() here (the code always
@@ -209,21 +216,26 @@ def __delitem__(self, key):
209216
self._commit()
210217

211218
def keys(self):
219+
self._verify_open()
212220
return list(self._index.keys())
213221

214222
def items(self):
223+
self._verify_open()
215224
return [(key, self[key]) for key in self._index.keys()]
216225

217226
def __contains__(self, key):
218227
if isinstance(key, str):
219228
key = key.encode('utf-8')
229+
self._verify_open()
220230
return key in self._index
221231

222232
def iterkeys(self):
233+
self._verify_open()
223234
return iter(self._index.keys())
224235
__iter__ = iterkeys
225236

226237
def __len__(self):
238+
self._verify_open()
227239
return len(self._index)
228240

229241
def close(self):

Lib/test/test_dbm_dumb.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
"""
44

55
import io
6+
import operator
67
import os
78
import unittest
89
import dbm.dumb as dumbdbm
910
from test import support
11+
from functools import partial
1012

1113
_fname = support.TESTFN
1214

@@ -190,12 +192,31 @@ def test_context_manager(self):
190192
with dumbdbm.open(_fname, 'r') as db:
191193
self.assertEqual(list(db.keys()), [b"dumbdbm context manager"])
192194

193-
# This currently just raises AttributeError rather than a specific
194-
# exception like the GNU or NDBM based implementations. See
195-
# http://bugs.python.org/issue19385 for details.
196-
with self.assertRaises(Exception):
195+
with self.assertRaises(dumbdbm.error):
197196
db.keys()
198197

198+
def test_check_closed(self):
199+
f = dumbdbm.open(_fname, 'c')
200+
f.close()
201+
202+
for meth in (partial(operator.delitem, f),
203+
partial(operator.setitem, f, 'b'),
204+
partial(operator.getitem, f),
205+
partial(operator.contains, f)):
206+
with self.assertRaises(dumbdbm.error) as cm:
207+
meth('test')
208+
self.assertEqual(str(cm.exception),
209+
"DBM object has already been closed")
210+
211+
for meth in (operator.methodcaller('keys'),
212+
operator.methodcaller('iterkeys'),
213+
operator.methodcaller('items'),
214+
len):
215+
with self.assertRaises(dumbdbm.error) as cm:
216+
meth(f)
217+
self.assertEqual(str(cm.exception),
218+
"DBM object has already been closed")
219+
199220
def tearDown(self):
200221
_delete_files()
201222

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ Core and Builtins
5757
Library
5858
-------
5959

60+
- Issue #19385: Make operations on a closed dbm.dumb database always raise the
61+
same exception.
62+
6063
- Issue #21207: Detect when the os.urandom cached fd has been closed or
6164
replaced, and open it anew.
6265

0 commit comments

Comments
 (0)