Re: Dangerous behavior of list(generator)

Discussion in 'Python' started by exarkun@twistedmatrix.com, Dec 14, 2009.

  1. Guest

    On 06:46 am, wrote:
    >On 12/13/2009 10:29 PM, wrote:
    >>Doesn't matter. Sometimes it makes sense to call it directly.

    >
    >It only makes sense to call next (or .__next__) when you are prepared
    >to explicitly catch StopIteration within a try..except construct.
    >You did not catch it, so it stopped execution.
    >
    >Let me repeat: StopIteration is intended only for stopping iteration.
    >Outside that use, it is a normal exception with no special meaning.


    You cut out the part of my message where I wrote that one might have
    forgotten the exception handling code that you posit is required, and
    that the current behavior makes debugging this situation unnecessarily
    challenging.

    Jean-Paul
    , Dec 14, 2009
    #1
    1. Advertising

  2. On Mon, 14 Dec 2009 14:31:44 +0000, exarkun wrote:

    > On 06:46 am, wrote:
    >>On 12/13/2009 10:29 PM, wrote:
    >>>Doesn't matter. Sometimes it makes sense to call it directly.

    >>
    >>It only makes sense to call next (or .__next__) when you are prepared to
    >>explicitly catch StopIteration within a try..except construct. You did
    >>not catch it, so it stopped execution.
    >>
    >>Let me repeat: StopIteration is intended only for stopping iteration.
    >>Outside that use, it is a normal exception with no special meaning.

    >
    > You cut out the part of my message where I wrote that one might have
    > forgotten the exception handling code that you posit is required, and
    > that the current behavior makes debugging this situation unnecessarily
    > challenging.


    I don't see why you think this is any more challenging to debug than any
    other equivalent bug. If anything I would think it was easier to debug:
    if the problem is that you get a StopIteration traceback, well that's
    easy and straightforward, and if the problem is that you don't (and
    consequently you end up with fewer items in the list than you expect),
    the obvious debugging technique is to build the list by hand and inspect
    each item before adding it to the list:

    L = []
    for i, item in enumerate(iterable):
    print i, item,
    value = item() # raises StopIteration
    print value
    L.append(value)

    That will expose the StopIteration exception and reveal the problem.

    But even if I have missed something, and it is a challenging problem to
    debug, oh well. It should be a quite unusual situation to come across.


    --
    Steven
    Steven D'Aprano, Dec 14, 2009
    #2
    1. Advertising

  3. Carl Banks Guest

    On Dec 14, 2:48 pm, Steven D'Aprano <st...@REMOVE-THIS-
    cybersource.com.au> wrote:
    > On Mon, 14 Dec 2009 14:31:44 +0000, exarkun wrote:
    > > On 06:46 am, wrote:
    > >>On 12/13/2009 10:29 PM, wrote:
    > >>>Doesn't matter. Sometimes it makes sense to call it directly.

    >
    > >>It only makes sense to call next (or .__next__) when you are prepared to
    > >>explicitly catch StopIteration within a try..except construct. You did
    > >>not catch it, so it stopped execution.

    >
    > >>Let me repeat: StopIteration is intended only for stopping iteration.
    > >>Outside that use, it is a normal exception with no special meaning.

    >
    > > You cut out the part of my message where I wrote that one might have
    > > forgotten the exception handling code that you posit is required, and
    > > that the current behavior makes debugging this situation unnecessarily
    > > challenging.

    >
    > I don't see why you think this is any more challenging to debug than any
    > other equivalent bug.


    "Errors should never pass silently."

    I'm not saying it's necessarily difficult to debug--although building
    a list by hand to test it is a lot more work than reading an exception
    traceback--but it'a stark violation of a Zen and common sense, so it
    is more serious than other sorts of errors.


    Carl Banks
    Carl Banks, Dec 14, 2009
    #3
  4. On Mon, 14 Dec 2009 15:26:25 -0800, Carl Banks wrote:

    > On Dec 14, 2:48 pm, Steven D'Aprano <st...@REMOVE-THIS-
    > cybersource.com.au> wrote:
    >> On Mon, 14 Dec 2009 14:31:44 +0000, exarkun wrote:
    >> > On 06:46 am, wrote:
    >> >>On 12/13/2009 10:29 PM, wrote:
    >> >>>Doesn't matter. Sometimes it makes sense to call it directly.

    >>
    >> >>It only makes sense to call next (or .__next__) when you are prepared
    >> >>to explicitly catch StopIteration within a try..except construct. You
    >> >>did not catch it, so it stopped execution.

    >>
    >> >>Let me repeat: StopIteration is intended only for stopping iteration.
    >> >>Outside that use, it is a normal exception with no special meaning.

    >>
    >> > You cut out the part of my message where I wrote that one might have
    >> > forgotten the exception handling code that you posit is required, and
    >> > that the current behavior makes debugging this situation
    >> > unnecessarily challenging.

    >>
    >> I don't see why you think this is any more challenging to debug than
    >> any other equivalent bug.

    >
    > "Errors should never pass silently."


    StopIteration isn't an error, it's a signal. The error is *misusing*
    StopIteration, and the above Zen no more applies than it would if I did
    x-y instead of y-x and complained that I got no traceback. Some errors
    are programming mistakes, and they are the deadliest error because they
    can and do pass silently. There's nothing you can do about that except
    Don't Make Mistakes.


    > I'm not saying it's necessarily difficult to debug--although building a
    > list by hand to test it is a lot more work than reading an exception
    > traceback


    Of course. Nobody said the life of a programmer was all beer and
    skittles :)


    > --but it'a stark violation of a Zen and common sense, so it is
    > more serious than other sorts of errors.


    I'm happy to accept it is a Gotcha, but a bug? I'm not convinced.



    --
    Steven
    Steven D'Aprano, Dec 15, 2009
    #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. Martin Maurer
    Replies:
    3
    Views:
    4,773
    Peter
    Apr 19, 2006
  2. Tom Machinski

    Dangerous behavior of list(generator)

    Tom Machinski, Dec 13, 2009, in forum: Python
    Replies:
    0
    Views:
    223
    Tom Machinski
    Dec 13, 2009
  3. Gabriel Genellina

    Re: Dangerous behavior of list(generator)

    Gabriel Genellina, Dec 13, 2009, in forum: Python
    Replies:
    14
    Views:
    375
    Martin v. Loewis
    Jan 2, 2010
  4. Replies:
    10
    Views:
    418
    Peter Otten
    Dec 14, 2009
  5. Replies:
    4
    Views:
    255
    Martin v. Loewis
    Jan 2, 2010
Loading...

Share This Page