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
This commit is contained in:
Andrey Efremov 2025-01-27 01:33:07 +07:00 committed by GitHub
parent 5d9b62005a
commit 914c232e93
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 8 deletions

View 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,

View 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):

View File

@ -0,0 +1,2 @@
Do not recreate unnamed section on every read in
:class:`configparser.ConfigParser`. Patch by Andrey Efremov.