From 08ed38a6b05de4138b467c0d5ebcf94adcecb19a Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Thu, 26 Sep 2002 19:37:36 +0000 Subject: Previous fix depended on the "code cleanup and general bug fix patch" already being applied. This is portion of that patch that does not add new functionality. --- Lib/ConfigParser.py | 119 +++++++++++++++++++++++++--------------------------- 1 file changed, 57 insertions(+), 62 deletions(-) diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py index 9b74a63..327f9ea 100644 --- a/Lib/ConfigParser.py +++ b/Lib/ConfigParser.py @@ -83,13 +83,12 @@ ConfigParser -- responsible for for parsing a list of write the configuration state in .ini format """ -import string, types import re __all__ = ["NoSectionError","DuplicateSectionError","NoOptionError", "InterpolationError","InterpolationDepthError","ParsingError", "MissingSectionHeaderError","ConfigParser", - "MAX_INTERPOLATION_DEPTH"] + "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] DEFAULTSECT = "DEFAULT" @@ -191,7 +190,7 @@ class ConfigParser: Raise DuplicateSectionError if a section by the specified name already exists. """ - if self.__sections.has_key(section): + if section in self.__sections: raise DuplicateSectionError(section) self.__sections[section] = {} @@ -200,7 +199,7 @@ class ConfigParser: The DEFAULT section is not acknowledged. """ - return section in self.sections() + return section in self.__sections def options(self, section): """Return a list of option names for the given section name.""" @@ -209,7 +208,7 @@ class ConfigParser: except KeyError: raise NoSectionError(section) opts.update(self.__defaults) - if opts.has_key('__name__'): + if '__name__' in opts: del opts['__name__'] return opts.keys() @@ -223,7 +222,7 @@ class ConfigParser: configuration files in the list will be read. A single filename may also be given. """ - if type(filenames) in types.StringTypes: + if isinstance(filenames, basestring): filenames = [filenames] for filename in filenames: try: @@ -260,40 +259,39 @@ class ConfigParser: The section DEFAULT is special. """ + d = self.__defaults.copy() try: - sectdict = self.__sections[section].copy() + d.update(self.__sections[section]) except KeyError: - if section == DEFAULTSECT: - sectdict = {} - else: + if section != DEFAULTSECT: raise NoSectionError(section) - d = self.__defaults.copy() - d.update(sectdict) # Update with the entry specific variables - if vars: + if vars is not None: d.update(vars) option = self.optionxform(option) try: - rawval = d[option] + value = d[option] except KeyError: raise NoOptionError(option, section) if raw: - return rawval + return value + return self._interpolate(section, option, value, d) + def _interpolate(self, section, option, rawval, vars): # do the string interpolation - value = rawval # Make it a pretty variable name - depth = 0 - while depth < 10: # Loop through this until it's done - depth = depth + 1 - if value.find("%(") >= 0: + value = rawval + depth = MAX_INTERPOLATION_DEPTH + while depth: # Loop through this until it's done + depth -= 1 + if value.find("%(") != -1: try: - value = value % d + value = value % vars except KeyError, key: raise InterpolationError(key, option, section, rawval) else: break - if value.find("%(") >= 0: + if value.find("%(") != -1: raise InterpolationDepthError(option, section, rawval) return value @@ -301,64 +299,64 @@ class ConfigParser: return conv(self.get(section, option)) def getint(self, section, option): - return self.__get(section, string.atoi, option) + return self.__get(section, int, option) def getfloat(self, section, option): - return self.__get(section, string.atof, option) + return self.__get(section, float, option) + + _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, + '0': False, 'no': False, 'false': False, 'off': False} def getboolean(self, section, option): - states = {'1': 1, 'yes': 1, 'true': 1, 'on': 1, - '0': 0, 'no': 0, 'false': 0, 'off': 0} v = self.get(section, option) - if not states.has_key(v.lower()): + if v.lower() not in self._boolean_states: raise ValueError, 'Not a boolean: %s' % v - return states[v.lower()] + return self._boolean_states[v.lower()] def optionxform(self, optionstr): return optionstr.lower() def has_option(self, section, option): """Check for the existence of a given option in a given section.""" - if not section or section == "DEFAULT": + if not section or section == DEFAULTSECT: option = self.optionxform(option) - return self.__defaults.has_key(option) - elif not self.has_section(section): + return option in self.__defaults + elif section not in self.__sections: return 0 else: option = self.optionxform(option) - return self.__sections[section].has_key(option) + return (option in self.__sections[section] + or option in self.__defaults) def set(self, section, option, value): """Set an option.""" - if not section or section == "DEFAULT": + if not section or section == DEFAULTSECT: sectdict = self.__defaults else: try: sectdict = self.__sections[section] except KeyError: raise NoSectionError(section) - option = self.optionxform(option) - sectdict[option] = value + sectdict[self.optionxform(option)] = value def write(self, fp): """Write an .ini-format representation of the configuration state.""" if self.__defaults: - fp.write("[DEFAULT]\n") + fp.write("[%s]\n" % DEFAULTSECT) for (key, value) in self.__defaults.items(): fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) fp.write("\n") - for section in self.sections(): - fp.write("[" + section + "]\n") - sectdict = self.__sections[section] - for (key, value) in sectdict.items(): - if key == "__name__": - continue - fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) + for section in self.__sections: + fp.write("[%s]\n" % section) + for (key, value) in self.__sections[section].items(): + if key != "__name__": + fp.write("%s = %s\n" % + (key, str(value).replace('\n', '\n\t'))) fp.write("\n") def remove_option(self, section, option): """Remove an option.""" - if not section or section == "DEFAULT": + if not section or section == DEFAULTSECT: sectdict = self.__defaults else: try: @@ -366,31 +364,29 @@ class ConfigParser: except KeyError: raise NoSectionError(section) option = self.optionxform(option) - existed = sectdict.has_key(option) + existed = option in sectdict if existed: del sectdict[option] return existed def remove_section(self, section): """Remove a file section.""" - if self.__sections.has_key(section): + existed = section in self.__sections + if existed: del self.__sections[section] - return 1 - else: - return 0 + return existed # - # Regular expressions for parsing section headers and options. Note a - # slight semantic change from the previous version, because of the use - # of \w, _ is allowed in section header names. + # Regular expressions for parsing section headers and options. + # SECTCRE = re.compile( r'\[' # [ r'(?P
[^]]+)' # very permissive! r'\]' # ] ) OPTCRE = re.compile( - r'(?P