Parsing environment variables in ConfigParser files

Robert Brewer fumanchu at amor.org
Fri Dec 19 13:37:21 EST 2003


Does this snippet from ConfigParser.py give anyone any ideas on how to
do this without subclassing? ;)

class RawConfigParser:
    def __init__(self, defaults=None):
        self._sections = {}
        if defaults is None:
            self._defaults = {}
        else:
            self._defaults = defaults

    def defaults(self):
        return self._defaults


>From the docs: "Default values can be specified by passing them into the
ConfigParser constructor as a dictionary. Additional defaults may be
passed into the get() method which will override all others."

Let's not patch in a single use case when a simple generic solution
already presents itself.


Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org

> -----Original Message-----
> From: Peter Otten [mailto:__peter__ at web.de] 
> Sent: Friday, December 19, 2003 10:21 AM
> To: python-list at python.org
> Subject: Re: Parsing environment variables in ConfigParser files
> 
> 
> Matthew Barnes wrote:
> 
> > I'm considering submitting a patch for Python 2.4 to allow 
> environment
> > variable expansion in ConfigParser files.  The use cases for this
> > should be obvious.  I'd like to be able to specify 
> something like the
> > following in a configuration file:
> > 
> >         [section_name]
> >         data_file=${HOME}/mydata.dat
> > 
> > ...(where HOME=/home/matt) and have ConfigParser 
> automatically expand
> > it to:
> > 
> >         [section_name]
> >         data_file=/home/matt/mydata.dat
> > 
> > The change is pretty straight-forward, but I'm interested 
> in feedback
> > on whether this is a good idea, what the syntax for environment
> > variable references should look like (currently I'm thinking
> > ${varname}), or whether there are any hidden complexities or
> > backward-compatibility concerns.
> > 
> > Matthew Barnes
> 
> I think this can be easily achieved by subclassing the ConfigParser:
> 
> >>> from ConfigParser import ConfigParser
> >>> class ExpandingParser(ConfigParser):
> ...     def getexpanded(self, section, option):
> ...             import os
> ...             return self._get(section, os.path.expandvars, option)
> ...
> >>> p = ExpandingParser()
> >>> p.read("expand.ini")
> >>> p.get("paths", "mydir")
> '$HOME/of/the/brave'
> >>> p.getexpanded("paths", "mydir")
> '/home/peter/of/the/brave'
> >>>
> 
> If you will bother with the library implementation at all, I 
> would prefer
> this level of explicitness, i. e. a dedicated getexpanded() method in
> ConfigParser, or alternatively a subclass that overrides 
> _get() to always
> expand in the getXXX() methods. With both approaches you can 
> stay safely
> away from backwards compatibility problems.
> 
> Peter
> 
> 
> 
> 
> 
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list
> 





More information about the Python-list mailing list