summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Efremov <duxus@yandex.ru>2025-01-26 18:33:07 (GMT)
committerGitHub <noreply@github.com>2025-01-26 18:33:07 (GMT)
commit914c232e9391e8e5014b089ba12c75d4a3b0cc7f (patch)
tree1ab8add0c27b5f4f2051144ce6da2f08a09ee6d9
parent5d9b62005a110164c6be5bf412d344917e872e10 (diff)
downloadcpython-914c232e9391e8e5014b089ba12c75d4a3b0cc7f.zip
cpython-914c232e9391e8e5014b089ba12c75d4a3b0cc7f.tar.gz
cpython-914c232e9391e8e5014b089ba12c75d4a3b0cc7f.tar.bz2
gh-127096: Do not recreate unnamed section on every read in ConfigParser (#127228)
* Do not recreate unnamed section on every read in ConfigParser * Remove duplicate section creation code
-rw-r--r--Lib/configparser.py12
-rw-r--r--Lib/test/test_configparser.py9
-rw-r--r--Misc/NEWS.d/next/Library/2024-11-24-22-06-42.gh-issue-127096.R7LLpQ.rst2
3 files changed, 15 insertions, 8 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py
index 420dce7..9dc4fa5 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -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,
diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py
index e3c5d08..bde805e 100644
--- a/Lib/test/test_configparser.py
+++ b/Lib/test/test_configparser.py
@@ -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
index 0000000..8619296
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-11-24-22-06-42.gh-issue-127096.R7LLpQ.rst
@@ -0,0 +1,2 @@
+Do not recreate unnamed section on every read in
+:class:`configparser.ConfigParser`. Patch by Andrey Efremov.