[Python-Dev] line numbers, pass statements, implicit returns

Guido van Rossum guido at python.org
Sun Apr 2 08:18:17 CEST 2006


On 4/1/06, Jeremy Hylton <jeremy at alum.mit.edu> wrote:
> There are several test cases in test_trace that are commented out.  We
> did this when we merged the ast-branch and promised to come back to
> them.  I'm coming back to them now, but the test aren't documented
> well and the feature they test isn't specified well.
>
> The failing tests I've looked at so far involving pass statements and
> implicit "return None" statements generated by the compiler.  The
> tests seem to verify that
>
>     1) if you have a function that ends with an if/else where the body
> of the else is pass,
>         there is no line number associated with the return
>     2) if you have a function that ends with a try/except where the
> body of the except is pass,
>         there is a line number associated with the return.
>
> Here's a failing example
>
> def ireturn_example():
>     a = 5
>     b = 5
>     if a == b:
>         b = a+1
>     else:
>         pass
>
> The code is traced and test_trace verifies that the return is
> associated with line 4!
>
> In these cases, the ast compiler will always associate a line number
> with the return.  (Technically with the LOAD_CONST preceding the
> RETURN_VALUE.)  This happens pretty much be accident.  It always
> associates a line number with the first opcode generated after a new
> statement is visited.  Since a Pass statement node has no opcode, the
> return generates the first opcode.
>
> Now I could add some special cases to the compiler to preserve the old
> behavior, the question is: Why bother?  It's such an unlikely case (an
> else that has no effect).  Does anyone depend on the current behavior
> for the ireturn_example()?  It seems sensible to me to always generate
> a line number for the pass + return case, just so you see the control
> flow as you step through the debugger.

Makes sense to me. I can't imagine what this was testing except
perhaps a corner case in the algorithm for generating the (insanely
complicated) linenumber mapping table.

> The other case that has changed is that the new compiler does not
> generate code for "while 0:"  I don't remember why <0.5 wink>.  There
> are several test cases that verify line numbers for code using this
> kind of bogus construct.  There are no lines anymore, so I would
> change the tests so that they don't expect the lines in question.  But
> I have no idea what they are trying to test.  Does anyone know?

Not me. This is definitely not part of the language spec! :-)

--
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list