Syntactic structure for 'until <Exception>:' loop

E

eblume

I'm still quite new to Python and I'm probably going about this
entirely the wrong way, but it recently struck me that there might be
the need for a control flow loop based on exception handling. First
let me give the proposed syntax:

until <Exception[, Exception]...>:
do_something()

This would be exactly equivalent to (but much more compact than):

while True:
try:
do_something()
except Exception:
break

Now, why would anyone want this structure? In my case, I'm using it
(well, the latter form of it, obviously) to loop over an iterator
object that was not created via the 'for obj in collection:' syntax.
Here's the actual code snippet:

headers = self.reader.next()
... intermediate code ....
while True:
try:
line = self.reader.next()
except StopIteration:
return data
data.append(line)

I'm sure I'm doing this in a very backward and wrong way, and would
appreciate tips on a better way to accomplish the same task. Obviously
there is an existing syntax which handles the same situations, and I
don't suspect that this will be an embraced proposal, I'm more hoping
to spark some conversation.

Thanks!
 
I

Ian Kelly

This would be exactly equivalent to (but much more compact than):

while True:
try:
do_something()
except Exception:
break

Or perhaps:

try:
while True:
do_something()
except Exception:
pass
Now, why would anyone want this structure? In my case, I'm using it
(well, the latter form of it, obviously) to loop over an iterator
object that was not created via the 'for obj in collection:' syntax.
Here's the actual code snippet:

headers = self.reader.next()
... intermediate code ....
while True:
try:
line = self.reader.next()
except StopIteration:
return data
data.append(line)

I'm sure I'm doing this in a very backward and wrong way, and would
appreciate tips on a better way to accomplish the same task. Obviously
there is an existing syntax which handles the same situations, and I
don't suspect that this will be an embraced proposal, I'm more hoping
to spark some conversation.


reader_iter = iter(self.reader)
headers = reader_iter.next()
# intermediate code
for line in reader_iter:
data.append(line)
return data


Also note that recommended best practice is to wrap the "headers =
reader_iter.next()" line in a try-except in case it raises a
StopIteration. Otherwise it could get propagated silently up to some
unrelated for loop higher in the stack, resulting in unexpected behavior.

Cheers,
Ian
 
E

eblume

reader_iter = iter(self.reader)
headers = reader_iter.next()
# intermediate code
for line in reader_iter:
     data.append(line)
return data

Also note that recommended best practice is to wrap the "headers =
reader_iter.next()" line in a try-except in case it raises a
StopIteration.  Otherwise it could get propagated silently up to some
unrelated for loop higher in the stack, resulting in unexpected behavior.

Cheers,
Ian

That's brilliant, exactly the code I was looking for. Thanks very much
Ian!

Erich
 
P

Peter Otten

Ian said:
reader_iter = iter(self.reader)
headers = reader_iter.next()
# intermediate code
for line in reader_iter:
data.append(line)
return data

If data is a list the for loop can be replaced with

data.extend(reader_iter)

or, if data is an empty list created within the function

data = list(reader_iter)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top