The "right" way to use config files

Fabien fabien.maussion at gmail.com
Sat Aug 9 14:14:20 EDT 2014


On 09.08.2014 19:29, Terry Reedy wrote:
> If possible, functions should *return* their results, or yield their
> results in chunks (as generators). Let the driver function decide where
> to put results.  Aside from separating concerns, this makes testing much
> easier.

I see. But then this is also true for parameters, right? And yet we 
return to my original question ;-)


Let's say my configfile looks like this:

-----------------
### app/config.cfg
# General params
output_dir = '..'
input_file = '..'

# Func 1 params
[func1]
     enable = True
     threshold = 0.1
     maxite = 1
-----------------

And I have a myconfig module which looks like:

-----------------
### app/myconfig.py

import ConfigObj

parser = obj() # parser will be instanciated by initialize

def initialize(cfgfile=None):
    global parser
    parser = ConfigObj(cfgfile, file_error=True)
-----------------

My main program could look like this:

-----------------
### app/mainprogram_1.py

import myconfig

def func1():
     # the params are in the cfg
     threshold = myconfig.parser['func1'].as_float('threshold')
     maxite = myconfig.parser['func1'].as_long('maxite')

     # dummy operations
     score = 100.
     ite = 1
     while (score > threshold) and (ite < maxite):
         score /= 10
         ite += 1

     # dummy return
     return score

def main():
     myconfig.initialize(sys.argv[1])

     if myconfig.parser['func1'].as_bool('enable'):
         results = func1()

if __name__ == '__main__':
     main()
-----------------

Or like this:

-----------------
### app/mainprogram_2.py

import myconfig

def func1(threshold=None, maxite=None):
     # dummy operations
     score = 100.
     ite = 1
     while (score > threshold) and (ite < maxite):
         score /= 10
         ite += 1

     # dummy return
     return score

def main():
     myconfig.initialize(sys.argv[1])

     if myconfig.parser['func1'].as_bool('enable'):
         # the params are in the cfg
         threshold = myconfig.parser['func1'].as_float('threshold')
         maxite = myconfig.parser['func1'].as_long('maxite')
         results = func1(threshold=threshold, maxite=maxite)

if __name__ == '__main__':
     main()
-----------------

In this case, program2 is easier to test/understand, but if the 
parameters become numerous it could be a pain...

As always, I guess I'l have to decide on a case by case basis what is best.










More information about the Python-list mailing list