configparser.py

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 473 行 · 第 1/2 页

PY
473
字号
        The `fp' argument must have a `readline' method.  Optional        second argument is the `filename', which if not given, is        taken from fp.name.  If fp has no `name' attribute, `<???>' is        used.        """        if filename is None:            try:                filename = fp.name            except AttributeError:                filename = '<???>'        self.__read(fp, filename)    def get(self, section, option, raw=0, vars=None):        """Get an option value for a given section.        All % interpolations are expanded in the return values, based on the        defaults passed into the constructor, unless the optional argument        `raw' is true.  Additional substitutions may be provided using the        `vars' argument, which must be a dictionary whose contents overrides        any pre-existing defaults.        The section DEFAULT is special.        """        d = self.__defaults.copy()        try:            d.update(self.__sections[section])        except KeyError:            if section != DEFAULTSECT:                raise NoSectionError(section)        # Update with the entry specific variables        if vars is not None:            d.update(vars)        option = self.optionxform(option)        try:            value = d[option]        except KeyError:            raise NoOptionError(option, section)        if raw:            return value        return self._interpolate(section, option, value, d)    def _interpolate(self, section, option, rawval, vars):        # do the string interpolation        value = rawval        depth = MAX_INTERPOLATION_DEPTH        while depth:                    # Loop through this until it's done            depth -= 1            if value.find("%(") != -1:                try:                    value = value % vars                except KeyError, key:                    raise InterpolationError(key, option, section, rawval)            else:                break        if value.find("%(") != -1:            raise InterpolationDepthError(option, section, rawval)        return value    def __get(self, section, conv, option):        return conv(self.get(section, option))    def getint(self, section, option):        return self.__get(section, int, option)    def getfloat(self, section, 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):        v = self.get(section, option)        if v.lower() not in self._boolean_states:            raise ValueError, 'Not a boolean: %s' % v        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 == DEFAULTSECT:            option = self.optionxform(option)            return option in self.__defaults        elif section not in self.__sections:            return 0        else:            option = self.optionxform(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 == DEFAULTSECT:            sectdict = self.__defaults        else:            try:                sectdict = self.__sections[section]            except KeyError:                raise NoSectionError(section)        sectdict[self.optionxform(option)] = value    def write(self, fp):        """Write an .ini-format representation of the configuration state."""        if self.__defaults:            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("[%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 == DEFAULTSECT:            sectdict = self.__defaults        else:            try:                sectdict = self.__sections[section]            except KeyError:                raise NoSectionError(section)        option = self.optionxform(option)        existed = option in sectdict        if existed:            del sectdict[option]        return existed    def remove_section(self, section):        """Remove a file section."""        existed = section in self.__sections        if existed:            del self.__sections[section]        return existed    #    # Regular expressions for parsing section headers and options.    #    SECTCRE = re.compile(        r'\['                                 # [        r'(?P<header>[^]]+)'                  # very permissive!        r'\]'                                 # ]        )    OPTCRE = re.compile(        r'(?P<option>[^:=\s][^:=]*)'          # very permissive!        r'\s*(?P<vi>[:=])\s*'                 # any number of space/tab,                                              # followed by separator                                              # (either : or =), followed                                              # by any # space/tab        r'(?P<value>.*)$'                     # everything up to eol        )    def __read(self, fp, fpname):        """Parse a sectioned setup file.        The sections in setup file contains a title line at the top,        indicated by a name in square brackets (`[]'), plus key/value        options lines, indicated by `name: value' format lines.        Continuation are represented by an embedded newline then        leading whitespace.  Blank lines, lines beginning with a '#',        and just about everything else is ignored.        """        cursect = None                            # None, or a dictionary        optname = None        lineno = 0        e = None                                  # None, or an exception        while 1:            line = fp.readline()            if not line:                break            lineno = lineno + 1            # comment or blank line?            if line.strip() == '' or line[0] in '#;':                continue            if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":                # no leading whitespace                continue            # continuation line?            if line[0].isspace() and cursect is not None and optname:                value = line.strip()                if value:                    cursect[optname] = "%s\n%s" % (cursect[optname], value)            # a section header or option header?            else:                # is it a section header?                mo = self.SECTCRE.match(line)                if mo:                    sectname = mo.group('header')                    if sectname in self.__sections:                        cursect = self.__sections[sectname]                    elif sectname == DEFAULTSECT:                        cursect = self.__defaults                    else:                        cursect = {'__name__': sectname}                        self.__sections[sectname] = cursect                    # So sections can't start with a continuation line                    optname = None                # no section header in the file?                elif cursect is None:                    raise MissingSectionHeaderError(fpname, lineno, `line`)                # an option line?                else:                    mo = self.OPTCRE.match(line)                    if mo:                        optname, vi, optval = mo.group('option', 'vi', 'value')                        if vi in ('=', ':') and ';' in optval:                            # ';' is a comment delimiter only if it follows                            # a spacing character                            pos = optval.find(';')                            if pos != -1 and optval[pos-1].isspace():                                optval = optval[:pos]                        optval = optval.strip()                        # allow empty values                        if optval == '""':                            optval = ''                        optname = self.optionxform(optname.rstrip())                        cursect[optname] = optval                    else:                        # a non-fatal parsing error occurred.  set up the                        # exception but keep going. the exception will be                        # raised at the end of the file and will contain a                        # list of all bogus lines                        if not e:                            e = ParsingError(fpname)                        e.append(lineno, `line`)        # if any parsing errors occurred, raise an exception        if e:            raise e

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?