Kent Johnson <[EMAIL PROTECTED]> wrote in
news:[EMAIL PROTECTED]: 

> Here is a simple function that scans through an input file and
> groups the lines of the file into sections. Sections start with
> 'Name:' and end with a blank line. The function yields sections
> as they are found.
> 
> def makeSections(f):
>      currSection = []
> 
>      for line in f:
>          line = line.strip()
>          if line == 'Name:':
>              # Start of a new section
>              if currSection:
>                  yield currSection
>                  currSection = []
>              currSection.append(line)
> 
>          elif not line:
>              # Blank line ends a section
>              if currSection:
>                  yield currSection
>                  currSection = []
> 
>          else:
>              # Accumulate into a section
>              currSection.append(line)
> 
>      # Yield the last section
>      if currSection:
>          yield currSection
> 
> There is some obvious code duplication in the function - this bit
> is repeated 2.67 times ;-): 
>              if currSection:
>                  yield currSection
>                  currSection = []
> 
> As a firm believer in Once and Only Once, I would like to factor
> this out into a separate function, either a nested function of
> makeSections(), or as a separate method of a class
> implementation. Something like this:
> 
> 
> The problem is that yieldSection() now is the generator, and
> makeSections() is not, and the result of calling yieldSection()
> is a new iterator, not the section... 
> 
> Is there a way to do this or do I have to live with the
> duplication? 
> 
> Thanks,
> Kent
> 
>

This gets rid of some duplication by ignoring blanklines altogether, 
which might be a bug...

 def makeSections2(f):
    currSection = []
    for line in f:
        line = line.strip()
        if line:
            if line == 'Name:':
                if currSection:
                    yield cs
                    currSection = []
            currSection.append(line)
    if currSection:
        yield currSection

but 

 def makeSections2(f):
    currSection = []
    for line in f:
        line = line.strip()

        if line:
            if line == 'Name:':
                if currSection:
                    yield currSection
                    currSection = []
            currSection.append(line)

        elif currSection:
                yield currSection

    if currSection:
        yield currSection

should be equivalent.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to