keeping state in an iterator object by rebinding next()

iteration.nth at gmail.com iteration.nth at gmail.com
Thu Mar 20 00:34:44 EDT 2008


On Mar 19, 3:36 pm, Wilbert Berendsen <wbs... at xs4all.nl> wrote:
> Hi,
>
> i am writing a simple parser, that generates tokens. The parser needs to
> maintain some state, because some parts of the file consist of different
> tokens. I thought the object could simply remember its state by assigning
> it's next() method to the method that is currently parsing. When the state
> changes, the called method rebinds next() and the next token will be returned
> by that function. Here's an example, proving that this indeed works.
>
> >>> class A:
>
> ...  def a(self):
> ...   self.next = self.b
> ...   return 1
> ...  def b(self):
> ...   self.next = self.a
> ...   return 2
> ...  def __iter__(self):
> ...   return self
> ...>>> a=A()
> >>> a.a()
> 1
> >>> a.next()
> 2
> >>> a.next()
> 1
> >>> j=0
> >>> for i in a:
>
> ...  j += 1
> ...  if j > 10: break        # prevent from running endlessly
> ...  print i
> ...
> 2
> 1
> 2
> 1
> 2
> 1
> 2
> 1
> 2
> 1
>
>
>
> my question is: is this legal Python? An iterator could save the next() method
> object, and in that case it could stop working.... It works now, because
> apparently the for- construct resolves 'next' each time for the object before
> calling it.
>
> The other solution would be just jumping to the correct method from within the
> next() method. But that gives an extra call...
>
> Met vriendelijke groet,
> Wilbert Berendsen
>
> --http://www.wilbertberendsen.nl/
> "You must be the change you wish to see in the world."
>         -- Mahatma Gandi

""""

 "You must be the change you wish to see in the world."
        -- Mahatma Gandi
""""
JFYI: Mahatma Gandhi  (NOT Gandi).



More information about the Python-list mailing list