Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Doc/library/shelve.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@ lots of shared sub-objects. The keys are ordinary strings.


.. function:: open(filename, flag='c', protocol=None, writeback=False, *, \
serializer=None, deserializer=None)
mode=0o666, serializer=None, deserializer=None)

Open a persistent dictionary. The filename specified is the base filename for
the underlying database. As a side-effect, an extension may be added to the
filename and more than one file may be created. By default, the underlying
database file is opened for reading and writing. The optional *flag* parameter
has the same interpretation as the *flag* parameter of :func:`dbm.open`.

.. versionchanged:: 3.15
The *mode* parameter was added.

By default, pickles created with :const:`pickle.DEFAULT_PROTOCOL` are used
to serialize values. The version of the pickle protocol can be specified
with the *protocol* parameter.
Expand Down
6 changes: 3 additions & 3 deletions Lib/shelve.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,9 +236,9 @@ class DbfilenameShelf(Shelf):
"""

def __init__(self, filename, flag='c', protocol=None, writeback=False, *,
serializer=None, deserializer=None):
mode=0o666, serializer=None, deserializer=None):
import dbm
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback,
Shelf.__init__(self, dbm.open(filename, flag, mode), protocol, writeback,
serializer=serializer, deserializer=deserializer)

def clear(self):
Expand All @@ -249,7 +249,7 @@ def clear(self):
self.dict.clear()

def open(filename, flag='c', protocol=None, writeback=False, *,
serializer=None, deserializer=None):
mode=0o666, serializer=None, deserializer=None):
"""Open a persistent dictionary for reading and writing.

The filename parameter is the base filename for the underlying
Expand Down
18 changes: 18 additions & 0 deletions Lib/test/test_shelve.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,24 @@ def test_close(self):
else:
self.fail('Closed shelf should not find a key')

def test_mode(self):
# Bulletproof test for mode parameter
import os
import tempfile

# Ek fresh temporary directory mein file banate hain
with tempfile.TemporaryDirectory() as tmpdir:
temp_fn = os.path.join(tmpdir, "test_shelf")
try:
# Sirf check karna hai ki 'mode' accept ho raha hai bina crash ke
with shelve.open(temp_fn, mode=0o666) as s:
s['key'] = 'value'

# Check ki koi na koi file generate hui ya nahi
self.assertTrue(len(os.listdir(tmpdir)) > 0)
except Exception as e:
self.fail(f"shelve.open failed with mode parameter: {e}")

def test_open_template(self, filename=None, protocol=None):
os.mkdir(self.dirname)
self.addCleanup(os_helper.rmtree, self.dirname)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add *mode* parameter to shelve.open().
Loading