diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index bd3d56f6af595a..1e1865ea81f2f5 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -18,7 +18,7 @@ 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 @@ -26,6 +26,9 @@ lots of shared sub-objects. The keys are ordinary strings. 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. diff --git a/Lib/shelve.py b/Lib/shelve.py index 9f6296667fdb6b..56f1b90cc7e84d 100644 --- a/Lib/shelve.py +++ b/Lib/shelve.py @@ -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): @@ -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 diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py index 5f6a030e018f96..c466fe6c3cf9dd 100644 --- a/Lib/test/test_shelve.py +++ b/Lib/test/test_shelve.py @@ -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) diff --git a/Misc/NEWS.d/next/Library/2026-04-21-03-08-46.gh-issue-113093.3duhNf.rst b/Misc/NEWS.d/next/Library/2026-04-21-03-08-46.gh-issue-113093.3duhNf.rst new file mode 100644 index 00000000000000..63b95c5cfda48b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-04-21-03-08-46.gh-issue-113093.3duhNf.rst @@ -0,0 +1 @@ +Add *mode* parameter to shelve.open().