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.
Continuations are represented by an embedded newline then
leading whitespace. Blank lines, lines beginning with a '#',
and just about everything else are ignored."""cursect= None #None, or a dictionary
optname =None
lineno=0
e= None #None, or an exception
comment_line_cache = [] #comment or blank line temp cache
whileTrue:
line=fp.readline()if notline:breaklineno= lineno + 1
#comment or blank line?
if line.strip() == '' or line[0] in '#;':
comment_line_cache.append(line.strip())continue
if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":#no leading whitespace
comment_line_cache.append(line.strip())continue
#continuation line?
if line[0].isspace() and cursect is not None andoptname:
value=line.strip()ifvalue:
cursect[optname].append(value)#a section header or option header?
else:#is it a section header?
mo =self.SECTCRE.match(line)ifmo:
sectname= mo.group('header')
self.comment_line_dict[sectname]=comment_line_cache
comment_line_cache=[]if sectname inself._sections:
cursect=self._sections[sectname]elif sectname ==DEFAULTSECT:
cursect=self._defaultselse:
cursect=self._dict()
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 isNone:raiseMissingSectionHeaderError(fpname, lineno, line)#an option line?
else:
mo=self._optcre.match(line)ifmo:
optname, vi, optval= mo.group('option', 'vi', 'value')
optname=self.optionxform(optname.rstrip())
self.comment_line_dict["%s.%s"%(cursect['__name__'], optname)] =comment_line_cache
comment_line_cache=[]#This check is fine because the OPTCRE cannot
#match if it would set optval to None
if optval is notNone:if vi in ('=', ':') and ';' inoptval:#';' 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= ''cursect[optname]=[optval]else:#valueless option handling
cursect[optname] =optvalelse:#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 note:
e=ParsingError(fpname)
e.append(lineno, repr(line))#if any parsing errors occurred, raise an exception
ife:raisee#join the multi-line values collected while reading
all_sections =[self._defaults]
all_sections.extend(self._sections.values())for options inall_sections:for name, val inoptions.items():ifisinstance(val, list):
options[name]= '\n'.join(val)