Skip to content

Commit 01db1ce

Browse files
committed
gh-160684: Normalize non-string vars in ConfigParser.items()
1 parent 7b12a41 commit 01db1ce

3 files changed

Lines changed: 19 additions & 0 deletions

File tree

‎Lib/configparser.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,8 @@ def items(self, section=_UNSET, raw=False, vars=None):
991991
# Update with the entry specific variables
992992
if vars:
993993
for key, value in vars.items():
994+
if value is not None:
995+
value = str(value)
994996
d[self.optionxform(key)] = value
995997
value_getter = lambda option: self._interpolation.before_get(
996998
self, section, option, d[option], d

‎Lib/test/test_configparser.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,21 @@ def check_items_config(self, expected):
904904
with self.assertRaises(configparser.NoSectionError):
905905
cf.items("no such section")
906906

907+
def test_items_non_string_vars(self):
908+
cf = self.newconfig(defaults={'default': 'original'})
909+
cf.read_dict({'section': {'value': 'original'}})
910+
for value in (42, 0, False):
911+
for raw in (False, True):
912+
with self.subTest(value=value, raw=raw):
913+
self.assertEqual(
914+
dict(cf.items('section', raw=raw, vars={
915+
'default': value,
916+
'VALUE': value,
917+
'extra': value,
918+
})),
919+
{'default': str(value), 'value': str(value)},
920+
)
921+
907922
def test_popitem(self):
908923
cf = self.fromstring(
909924
f"""
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :meth:`configparser.ConfigParser.items` to convert non-``None`` values
2+
passed in *vars* to strings, consistently with :meth:`~configparser.ConfigParser.get`.

0 commit comments

Comments
 (0)