Parse config file and command-line arguments, to get a single collection of options

Raymond Hettinger python at rcn.com
Thu May 26 01:15:35 EDT 2011


On May 25, 9:38 pm, Ben Finney <b... at benfinney.id.au> wrote:
> Howdy all,
>
> Python's standard library has modules for configuration file parsing
> (configparser) and command-line argument parsing (optparse, argparse). I
> want to write a program that does both, but also:
>
> * Has a cascade of options: default option values, overridden by config
>   file options, overridden by command-line options.
>
> * Reads a different, or even additional, configuration file if specified
>   on the command-line (e.g. --config-file foo.conf) and yet still obeys
>   the above cascade.
>
> * Allows a single definition of an option (e.g. logging level) to define
>   the same option for parsing from configuration files and the command
>   line.
>
> * Unifies the parsed options into a single collection for the rest of
>   the program to access without caring where they came from.
>
> How can I achieve this with minimum deviation from the Python standard
> library?

One thought is start with something like ChainMap,
http://code.activestate.com/recipes/305268-chained-map-lookups/?in=user-178123
, or some variant to unify multiple mapping objects into a single
prioritized collection.  A mapping for command line args can be made
by using vars() on an argparse namespace to create a dictionary.
ConfigParser's mapping is accessible via its get() method.  With a
ChainMap style object you can add other option sources such as
os.environ.  This should get you started on your grand unified, do-
everything-at-once vision with minimal deviation from the standard
library.

Raymond






More information about the Python-list mailing list