M
Matus
Hallo pylist,
I searches web and python documentation for implementation of pushback
iterator but found none in stdlib.
problem:
========
when you parse a file, often you have to read a line from parsed file
before you can decide if you want that line it or not. if not, it would
be a nice feature to be able po push the line back into the iterator, so
nest time when you pull from iterator you get this 'unused' line.
solution:
=========
I found a nice and fast solution somewhere on the net:
---------------------------------------------------------------------
class Pushback_wrapper( object ):
def __init__( self, it ):
self.it = it
self.pushed_back = [ ]
self.nextfn = it.next
def __iter__( self ):
return self
def __nonzero__( self ):
if self.pushed_back:
return True
try:
self.pushback( self.nextfn( ) )
except StopIteration:
return False
else:
return True
def popfn( self ):
lst = self.pushed_back
res = lst.pop( )
if not lst:
self.nextfn = self.it.next
return res
def next( self ):
return self.nextfn( )
def pushback( self, item ):
self.pushed_back.append( item )
self.nextfn = self.popfn
---------------------------------------------------------------------
proposal:
=========
as this is (as I suppose) common problem, would it be possible to extend
the stdlib of python (ie itertools module) with a similar solution so
one do not have to reinvent the wheel every time pushback is needed?
thx, Matus
I searches web and python documentation for implementation of pushback
iterator but found none in stdlib.
problem:
========
when you parse a file, often you have to read a line from parsed file
before you can decide if you want that line it or not. if not, it would
be a nice feature to be able po push the line back into the iterator, so
nest time when you pull from iterator you get this 'unused' line.
solution:
=========
I found a nice and fast solution somewhere on the net:
---------------------------------------------------------------------
class Pushback_wrapper( object ):
def __init__( self, it ):
self.it = it
self.pushed_back = [ ]
self.nextfn = it.next
def __iter__( self ):
return self
def __nonzero__( self ):
if self.pushed_back:
return True
try:
self.pushback( self.nextfn( ) )
except StopIteration:
return False
else:
return True
def popfn( self ):
lst = self.pushed_back
res = lst.pop( )
if not lst:
self.nextfn = self.it.next
return res
def next( self ):
return self.nextfn( )
def pushback( self, item ):
self.pushed_back.append( item )
self.nextfn = self.popfn
---------------------------------------------------------------------
proposal:
=========
as this is (as I suppose) common problem, would it be possible to extend
the stdlib of python (ie itertools module) with a similar solution so
one do not have to reinvent the wheel every time pushback is needed?
thx, Matus