Karthikeyan Singaravelan <[email protected]> added the comment:
This seems to be a bug with read_dict which is used internally when a
dictionary is directly assigned. In read_dict optionxform is called with key
[0] to check for duplicate and the transformed value is again passed to
self.set which also calls optionxform [1] causing optionxform to be applied
twice. A possible fix would be to assign the transformed key to a temporary
variable to check for duplicate and then pass the original key to self.set ? My
patch gives correct value and no tests fail on master. I can make a PR with
test for this if my analysis is correct.
This fixes the below since the key is stored correctly now.
print(ini['section A']['key 1']) # OK
print(ini['section A']['(key 1)']) # Raises KeyError
I think for iterating over the section items [2] need to be used and the
reported code can be written as below
for key, value in ini.items('section A'):
print(key + ', ' + value)
[0]
https://github.com/python/cpython/blob/ea446409cd5f1364beafd5e5255da6799993f285/Lib/configparser.py#L748
[1]
https://github.com/python/cpython/blob/ea446409cd5f1364beafd5e5255da6799993f285/Lib/configparser.py#L903
[2]
https://docs.python.org/3.8/library/configparser.html#configparser.ConfigParser.items
# sample reproducer
import io
import configparser
ini = configparser.ConfigParser()
ini.optionxform = lambda x: '(' + x + ')'
ini.read_dict({'section A': {'key 1': 'value 1'}})
inifile = io.StringIO()
ini.write(inifile)
print(inifile.getvalue())
$ ./python.exe ../backups/bpo35838_1.py
[section A]
((key 1)) = value 1
# Possible patch
$ git diff -w | cat
diff --git a/Lib/configparser.py b/Lib/configparser.py
index 79a991084b..1389f4ac08 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -745,13 +745,13 @@ class RawConfigParser(MutableMapping):
raise
elements_added.add(section)
for key, value in keys.items():
- key = self.optionxform(str(key))
+ option_key = self.optionxform(str(key))
if value is not None:
value = str(value)
- if self._strict and (section, key) in elements_added:
- raise DuplicateOptionError(section, key, source)
- elements_added.add((section, key))
- self.set(section, key, value)
+ if self._strict and (section, option_key) in elements_added:
+ raise DuplicateOptionError(section, option_key, source)
+ elements_added.add((section, option_key))
+ self.set(section, str(key), value)
def readfp(self, fp, filename=None):
"""Deprecated, use read_file instead."""
$ ./python.exe ../backups/bpo35838_1.py
[section A]
(key 1) = value 1
----------
nosy: +xtreak
versions: +Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue35838>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com