I have tried to use Python's ConfigParser module to save settings. For my app it's important that I preserve the case of each name in my sections. The docs mention that passing str() to ConfigParser.optionxform() would accomplish this, but it doesn't work for me. The names are all lowercase. Am I missing something?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Python pseudocode of what I get:
import ConfigParser,os
def get_config():
config = ConfigParser.ConfigParser()
config.optionxform(str())
try:
config.read(os.path.expanduser('~/.myrc'))
return config
except Exception, e:
log.error(e)
c = get_config()
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]
Caveat:
If you use defaults with ConfigParser, i.e.:
and then try to make the parser case-sensitive by using this:
all your options from config file(s) will keep their case, but
FOO_BAZ
will be converted to lowercase.To have defaults also keep their case, use subclassing like in @icedtrees answer:
Now
FOO_BAZ
will keep it's case and you won't have InterpolationMissingOptionError.The documentation is confusing. What they mean is this:
I.e. override optionxform, instead of calling it; overriding can be done in a subclass or in the instance. When overriding, set it to a function (rather than the result of calling a function).
I have now reported this as a bug, and it has since been fixed.
For me worked to set optionxform immediately after creating the object
Add to your code:
I know this question is answered, but I thought some people might find this solution useful. This is a class that can easily replace the existing ConfigParser class.
Edited to incorporate @OozeMeister's suggestion:
Usage is the same as normal ConfigParser.
This is so you avoid having to set optionxform every time you make a new
ConfigParser
, which is kind of tedious.