Skip to content

Commit 0210194

Browse files
committed
Fixes __setitem__ on parser['DEFAULT'] reported in issue #16820.
1 parent 5da5702 commit 0210194

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

Lib/configparser.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,10 @@ def __setitem__(self, key, value):
960960

961961
# XXX this is not atomic if read_dict fails at any point. Then again,
962962
# no update method in configparser is atomic in this implementation.
963-
self.remove_section(key)
963+
if key == self.default_section:
964+
self._defaults.clear()
965+
else:
966+
self.remove_section(key)
964967
self.read_dict({key: value})
965968

966969
def __delitem__(self, key):

Lib/test/test_configparser.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,34 @@ def test_clear(self):
797797
self.assertEqual(set(cf.sections()), set())
798798
self.assertEqual(set(cf[self.default_section].keys()), {'foo'})
799799

800+
def test_setitem(self):
801+
cf = self.fromstring("""
802+
[section1]
803+
name1 {0[0]} value1
804+
[section2]
805+
name2 {0[0]} value2
806+
[section3]
807+
name3 {0[0]} value3
808+
""".format(self.delimiters), defaults={"nameD": "valueD"})
809+
self.assertEqual(set(cf['section1'].keys()), {'name1', 'named'})
810+
self.assertEqual(set(cf['section2'].keys()), {'name2', 'named'})
811+
self.assertEqual(set(cf['section3'].keys()), {'name3', 'named'})
812+
self.assertEqual(cf['section1']['name1'], 'value1')
813+
self.assertEqual(cf['section2']['name2'], 'value2')
814+
self.assertEqual(cf['section3']['name3'], 'value3')
815+
cf['section2'] = {'name22': 'value22'}
816+
self.assertEqual(set(cf['section2'].keys()), {'name22', 'named'})
817+
self.assertEqual(cf['section2']['name22'], 'value22')
818+
self.assertNotIn('name2', cf['section2'])
819+
cf['section3'] = {}
820+
self.assertEqual(set(cf['section3'].keys()), {'named'})
821+
self.assertNotIn('name3', cf['section3'])
822+
cf[self.default_section] = {}
823+
self.assertEqual(set(cf[self.default_section].keys()), set())
824+
self.assertEqual(set(cf['section1'].keys()), {'name1'})
825+
self.assertEqual(set(cf['section2'].keys()), {'name22'})
826+
self.assertEqual(set(cf['section3'].keys()), set())
827+
800828

801829
class StrictTestCase(BasicTestCase):
802830
config_class = configparser.RawConfigParser

0 commit comments

Comments
 (0)