ungetch in Python
anton muhin
antonmuhin at rambler.ru
Wed Dec 24 13:56:54 EST 2003
Scott Fenton wrote:
> Hello and merry chrismas/new years/<insert winter holiday> everyone,
>
> I'm writing a small parser for a minilanguage in Python,
> and I was wondering --- is there any equiv. of C's ungetch
> or Scheme's peek-char in python? That is, is there a way to
> look at a character without taking it off of the input stream
> or is there a way to put it back on the input stream afterwards?
> I googled around and didn't come up with anything that didn't
> involve curses, which I don't want to use. Any help?
>
> TIA
> -Scott
Merry christmas & Happy New Year!
First of all I'd rather suggest to use one of parsers for Python---there
are plenty of them and they are really nice.
To your question: I don't remember this kind of function is Standard
Lib, but chances are it is there. But still you can emulate it with your
own iterator class.
Here comes an example:
class UngetIter(object):
def __init__(self, it):
self.it_ = iter(it)
self.hasUnget_ = False
self.last_ = None
def __iter__(self):
return self
def next(self):
if self.hasUnget_:
self.hasUnget_ = False
return self.last_
return self.it_.next()
def unget(self, o):
assert not self.hasUnget_, 'Only one unget allowed!'
self.hasUnget_ = True
self.last_ = o
i = UngetIter('abc')
for n, e in enumerate(i):
if n % 2 == 1:
print 'unget', e
i.unget(e)
else:
print e
Warning: almost not tested.
If you want to unget more than one char, you can just use a list of
objects to unget.
regards,
anton.
More information about the Python-list
mailing list