@@ -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 ):
0 commit comments