From 20dc88568916c309ab0a18ba02eb0f12aea018d7 Mon Sep 17 00:00:00 2001 From: ALGONIX Date: Tue, 21 Apr 2026 01:21:41 +0530 Subject: [PATCH 1/3] gh-113093: Add mode parameter to shelve.open --- Doc/library/shelve.rst | 5 ++++- Lib/shelve.py | 6 +++--- Lib/test/test_shelve.py | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) 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..68fdc071dd135b 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) From 9bc4eed69e7733eb832e0d745f106d9829ee6148 Mon Sep 17 00:00:00 2001 From: ALGONIX Date: Tue, 21 Apr 2026 03:12:46 +0530 Subject: [PATCH 2/3] Add news entry for gh-113093 --- .../next/Library/2026-04-21-03-08-46.gh-issue-113093.3duhNf.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2026-04-21-03-08-46.gh-issue-113093.3duhNf.rst 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(). From 718956e34cd17b86be91812e46f9ef69d82f2590 Mon Sep 17 00:00:00 2001 From: ALGONIX Date: Tue, 21 Apr 2026 03:27:27 +0530 Subject: [PATCH 3/3] fix trailing whitespace in test_shelve.py --- Lib/test/test_shelve.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py index 68fdc071dd135b..c466fe6c3cf9dd 100644 --- a/Lib/test/test_shelve.py +++ b/Lib/test/test_shelve.py @@ -66,7 +66,7 @@ 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") @@ -74,12 +74,12 @@ def test_mode(self): # 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)