iterator? way of generating all possible combinations?

akameswaran at gmail.com akameswaran at gmail.com
Wed May 31 10:14:16 EDT 2006


Scott David Daniels wrote:
> akameswaran at gmail.com wrote:
> > Scott David Daniels wrote:
> >> Sorry, "re-iterables".  A file re-iterable is:
> >>
> >>      class FileReIterable(object): ...
> >>          def __iter__(self):
> >>              self.file.seek(0)
> >>              return iter(self.file)
> >>
> >> This works if-and-only-if it is only in use once at a time.
> >> If you have multiple simultaneous accesses, you need to do
> >> something like:
> >>
> >>      class FileReIterable2(object): ...
> >>          def __iter__(self):
> >>              self.file.seek(0)
> >>              for line in self.file:
> >>                  nextpos = self.file.tell()
> >>                  yield line
> >>                  self.file.seek(nextpos)
> >
> > Since I was doing this as a self education excercise.  When you say is
> > in use once and only once, you mean I can only use a single instance of
> > the class?
> No.  This works:
>
>      f1 = FileReIterable("one.file")
>      f2 = FileReIterable("another.file")
>      ... free uses of ...
>
> This does not "work":
>
>      gen = FileReIterable("one.file")
>
>      for a in gen:
>          for b in gen:
>              print a, b
>
> This does "work":
>
>      gen = FileReIterable2("one.file")
>
>      for a in gen:
>          for b in gen:
>              print a, b
>
> That is, any instance of FileReIterable must not be used in a
> context where it may be in the midst of iterating a file, gets
> used to produce a result, and then must produce a result from
> the original iteration.
>
> If you think about what must happen to the file read pointer,
> the reason for all of this should become clear.
>
> --Scott David Daniels
> scott.daniels at acm.org

Thanks for the explanation, the issue of the file pointer was pretty
clear - it's why I created multiple files.  I just misunderstood what
you meant by use only one.  What I did miss at first was the fact that
the file object is not re-iterable.  Just plain dumb oversite.

Of course in the end I'm actually more concerned with writing my own
iterators or generators.  I was to busy thinking my errors were in the
recursion to look at the iterable/reiterable issue.   This is a working
version of the die class I started this thread with.

class die(object):
    def __init__(self,sides):
        self.sides=sides

        self.next = 1
    def next(self):
        if self.next <= self.sides:
            current = self.next
            self.next +=1
            return current
        else:
            self.next=1
            raise StopIteration
    def __iter__(self):
        return self




More information about the Python-list mailing list