]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127096: Do not recreate unnamed section on every read in ConfigParser (#127228)
authorAndrey Efremov <duxus@yandex.ru>
Sun, 26 Jan 2025 18:33:07 +0000 (01:33 +0700)
committerGitHub <noreply@github.com>
Sun, 26 Jan 2025 18:33:07 +0000 (13:33 -0500)
* Do not recreate unnamed section on every read in ConfigParser

* Remove duplicate section creation code

Lib/configparser.py
Lib/test/test_configparser.py
Misc/NEWS.d/next/Library/2024-11-24-22-06-42.gh-issue-127096.R7LLpQ.rst [new file with mode: 0644]

index 420dce77c234e1c7a13a52835cdea7921c228f0d..9dc4fa515cfcbea4c1ba894103af616955d3b9cd 100644 (file)
@@ -1105,11 +1105,7 @@ class RawConfigParser(MutableMapping):
     def _handle_rest(self, st, line, fpname):
         # a section header or option header?
         if self._allow_unnamed_section and st.cursect is None:
-            st.sectname = UNNAMED_SECTION
-            st.cursect = self._dict()
-            self._sections[st.sectname] = st.cursect
-            self._proxies[st.sectname] = SectionProxy(self, st.sectname)
-            st.elements_added.add(st.sectname)
+            self._handle_header(st, UNNAMED_SECTION, fpname)
 
         st.indent_level = st.cur_indent_level
         # is it a section header?
@@ -1118,10 +1114,10 @@ class RawConfigParser(MutableMapping):
         if not mo and st.cursect is None:
             raise MissingSectionHeaderError(fpname, st.lineno, line)
 
-        self._handle_header(st, mo, fpname) if mo else self._handle_option(st, line, fpname)
+        self._handle_header(st, mo.group('header'), fpname) if mo else self._handle_option(st, line, fpname)
 
-    def _handle_header(self, st, mo, fpname):
-        st.sectname = mo.group('header')
+    def _handle_header(self, st, sectname, fpname):
+        st.sectname = sectname
         if st.sectname in self._sections:
             if self._strict and st.sectname in st.elements_added:
                 raise DuplicateSectionError(st.sectname, fpname,
index e3c5d08dd1e7d124ce26e1dd573a16e99e0c2031..bde805eb741c33d690d9d30f1fe8b068ea55b0fb 100644 (file)
@@ -2174,6 +2174,15 @@ class SectionlessTestCase(unittest.TestCase):
         with self.assertRaises(configparser.UnnamedSectionDisabledError):
             configparser.ConfigParser().add_section(configparser.UNNAMED_SECTION)
 
+    def test_multiple_configs(self):
+        cfg = configparser.ConfigParser(allow_unnamed_section=True)
+        cfg.read_string('a = 1')
+        cfg.read_string('b = 2')
+
+        self.assertEqual([configparser.UNNAMED_SECTION], cfg.sections())
+        self.assertEqual('1', cfg[configparser.UNNAMED_SECTION]['a'])
+        self.assertEqual('2', cfg[configparser.UNNAMED_SECTION]['b'])
+
 
 class MiscTestCase(unittest.TestCase):
     def test__all__(self):
diff --git a/Misc/NEWS.d/next/Library/2024-11-24-22-06-42.gh-issue-127096.R7LLpQ.rst b/Misc/NEWS.d/next/Library/2024-11-24-22-06-42.gh-issue-127096.R7LLpQ.rst
new file mode 100644 (file)
index 0000000..8619296
--- /dev/null
@@ -0,0 +1,2 @@
+Do not recreate unnamed section on every read in
+:class:`configparser.ConfigParser`. Patch by Andrey Efremov.