Syntactic structure for 'until <Exception>:' loop

Discussion in 'Python' started by eblume, Jan 12, 2011.

  1. eblume

    eblume Guest

    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!
    eblume, Jan 12, 2011
    #1
    1. Advertising

  2. eblume

    Ian Kelly Guest

    On 1/11/2011 7:22 PM, eblume wrote:
    > 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
    Ian Kelly, Jan 12, 2011
    #2
    1. Advertising

  3. eblume

    eblume Guest

    On Jan 11, 6:53 pm, Ian Kelly <> wrote:
    > On 1/11/2011 7:22 PM, eblume wrote:
    >
    > > <snip>

    >
    > 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
    eblume, Jan 12, 2011
    #3
  4. eblume

    Peter Otten Guest

    Ian Kelly wrote:

    > 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)
    Peter Otten, Jan 12, 2011
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Remi Villatel

    Loop until condition is true

    Remi Villatel, Jun 18, 2005, in forum: Python
    Replies:
    40
    Views:
    1,112
    Mike Meyer
    Jun 23, 2005
  2. placid
    Replies:
    6
    Views:
    5,484
    placid
    Aug 11, 2006
  3. yogi_bear_79
    Replies:
    2
    Views:
    249
    yogi_bear_79
    Mar 11, 2008
  4. Replies:
    4
    Views:
    97
    A. Sinan Unur
    Feb 25, 2007
  5. Isaac Won
    Replies:
    9
    Views:
    370
    Ulrich Eckhardt
    Mar 4, 2013
Loading...

Share This Page