Subclassing ConfigParser

Michael Amrhein michael.amrhein at t-online.de
Fri Aug 22 09:59:08 EDT 2003


Greg Krohn schrieb:

> I'm trying to subclass ConfigParser so I can use a custom __read method (the
> custom format doesn't conform to RFC 822) when needed. Needless to say, it's
> not working as expected.
> 
> In the following code, I bind __read_ini to __read and override __read so it
> can choose between __read_ini and __read_custom. But it seems that
> __read_custom never gets called when I expect it to aways be called. I have
> a feeling this has to do with me not entirely understanding magic atributes
> and name mangling. Anyone have ideas?
> 
> 
> greg
> 
> 
> 
> from ConfigParser import ConfigParser
> 
> class CustomConfigParser(ConfigParser):
>     def __init__(self, defaults=None):
>         ConfigParser.__init__(self, defaults)
> 
>         #Replace the normal __read with my custom __read
>         #while keeping the normal one around if I need it
>         self.__read_ini = ConfigParser._ConfigParser__read
>         ConfigParser._ConfigParser__read = self.__read
> 
>     def __read(self, fp, fpname):
>         #Eventually this will decide between __read_custom
>         #and __read_ini, etc.
>         self.__read_custom(fp, fpname)
> 
>     def __read_custom(self, fp, fpname):
>         print "__read_custom" #This never gets printed.
> 
> cp = CustomConfigParser()
> cp.read('config.ini')
> print cp.sections()
> 
> 
Hi Greg,
are you sure you have a file 'config.ini' in your current working 
directory? ConfigParser is silently ignoring files which cannot be 
opened, so that _read is not called!

BTW, you did not mention the Python version you are using. In Python 2.3 
the method you overwrite is named '_read', not '__read' (so there is no 
name mangling). This is one drawback of overwriting "private" methods, 
when the author renames or removes them, your code is broken.

Anyway, your method of overwriting the method is a bit complicated . You 
can do it much easier: just overwrite _read and call the original method 
when appropriate:

class CustomConfigParser(ConfigParser):
     def __init__(self, defaults=None):
         ConfigParser.__init__(self, defaults)
     def _read(self, fp, fpname):
         if ...                # your criteria for custom ini
         then return self._read_custom(fp, fpname)
         else return ConfigParser._read(self, fp, fpname)

     def _read_custom(self, fp, fpname):
         ...

Michael





More information about the Python-list mailing list