This module is an extension to Python's standard configparser module that adds file and line number information to each stored option. This is primarily useful in reporting error messages: you can point your user to exactly where a bad value occurred:
try:
timeout = config.getint('connection', 'retry')
except ValueError:
filename, line = config.get_location('connection', 'retry')
logging.error("retry must be an integer (%s:%d)", filename, line)
...
This package is compatible with both Python 2 and 3.
Install with pip:
$ pip install configlines
Given the following two configuration files:
# Line one of data1.cfg
[some_section]
foo = 1
[DEFAULT]
bar = 2
# Line one of data2.cfg
[some_section]
baz = 3
You can read and manipulate them exactly the same as the standard module:
>>> from configlines import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read(['data1.cfg', 'data2.cfg'])
>>> cfg.get('some_section', 'foo')
'1'
You can also access file and line information:
>>> cfg.get_location('some_section', 'foo')
('data1.cfg', 3)
>>> cfg.get_location('some_section', 'bar')
('data1.cfg', 6)
>>> cfg.get_location('some_section', 'baz')
('data2.cfg', 3)
In addition to get_location
, this module also provides get_line
and
get_filename
functions for convenience.
If an option didn't come from a file, (i.e., you set it programmatically,) then line number information will not be present:
>>> cfg.set('some_section', 'qwerty', '1234')
>>> cfg.get_location('some_section', 'qwerty')
None
Overwriting options programmatically will erase line number information:
>>> cfg.get_location('some_section', 'foo')
('data1.cfg', 3)
>>> cfg.set('some_section', 'foo', '1234')
>>> cfg.get_location('some_section', 'foo')
None
Line number information can be set explicitly:
>>> cfg.set('some_section', 'foo', '1234', location=('somefile.cfg',10))
>>> cfg.get_location('some_section', 'foo')
('somefile.cfg', 10)
>>> cfg.set('some_section', 'foo', '1234', location='preserve')
>>> cfg.get_location('some_section', 'foo')
('somefile.cfg', 10)
>>> cfg.set_location('some_section', 'foo', ('otherfile.cfg', 50))
>>> cfg.get_location('some_section', 'foo')
('otherfile.cfg', 50)