Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Subclassing ConfigParser

Reply
Thread Tools

Subclassing ConfigParser

 
 
Greg Krohn
Guest
Posts: n/a
 
      08-21-2003
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()


 
Reply With Quote
 
 
 
 
Michael Amrhein
Guest
Posts: n/a
 
      08-22-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

 
Reply With Quote
 
 
 
 
Greg Krohn
Guest
Posts: n/a
 
      08-24-2003

"Michael Amrhein" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> 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!


I was getting a ParsingError that showed the line it was choking on, so I
know it was finding the file.

>
> 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.


I _was_ using ActivePython 2.2 (2.3 isn't out yet). I downloaded the 2.3
regular distro last night because I read ConfigParser was cleaned up, but I
haven't had time to mess around with it much.

> 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


Yes, this is great! Everything is working as expected now. Originally I was
expecting code like yours to work in 2.2 and when it didn't I tried all
sorts of elaborate hacks. What a mess. Thank you very much for your reply.

greg


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
ConfigParser: Can I read(ConfigParser.get()) a configuration file anduse it to call a funciton? jamitwidme@gmail.com Python 3 06-26-2008 08:01 PM
Parsing environment variables in ConfigParser files Matthew Barnes Python 6 12-21-2003 12:10 AM
Subclassing ConfigParser question Roy H. Berger Python 2 11-26-2003 03:07 PM
ConfigParser lower-cases options automatically? Matthew Wilson Python 1 11-23-2003 06:56 PM
ConfigParser: buggy or just a mess? Martin Maney Python 1 10-24-2003 08:58 PM



Advertisments