Am 15.07.2011 16:42 schrieb Billy Mays:
A sentinel does provide a work around, but it also passes the problem
onto the caller rather than the callee:
That is right.
BTW, there is another, maybe easier way to do this:
for line in iter(f.readline, ''):
do_stuff(line)
This provides an iterator which yields return values from the given
callable until '' is returned, in which case the iterator stops.
As caller, you need to have knowledge about the fact that you can always
continue.
The functionality which you ask for COULD be accomplished in two ways:
Firstly, one could simply break the "contract" of an iterator (which
would be a bad thing): just have your next() raise a StopIteration and
then continue nevertheless.
Secondly, one could do a similiar thing and have the next() method raise
a different exception. Then the caller has as well to know about, but I
cannot find a passage in the docs which prohibit this.
I just have tested this:
def r(x): return x
def y(x): raise x
def l(f, x): return lambda: f(x)
class I(object):
def __init__(self):
self.l = [l(r, 1), l(r, 2), l(y, Exception), l(r, 3)]
def __iter__(self):
return self
def next(self):
if not self.l: raise StopIteration
c = self.l.pop(0)
return c()
i = I()
try:
for j in i: print j
except Exception, e: print "E:", e
print tuple(i)
and it works.
So I think it COULD be ok to do this:
class NotNow(Exception): pass
class F(object):
def __init__(self, f):
self.file = f
def __iter__(self):
return self
def next(self):
l = self.file.readline()
if not l: raise NotNow
return l
f = F(file("/var/log/messages"))
import time
while True:
try:
for i in f: print "", i,
except NotNow, e:
print "<pause>"
time.sleep(1)
HTH,
Thomas
--
http://mail.python.org/mailman/listinfo/python-list