Perverse nesting bug
SF bug reporting is still impossible. Little program: def f(): print "outer f.a is", f.a def f(): print "inner f.a is", f.a f.a = 666 f() f.a = 42 f() I'm not sure what I expected it to do, but most likely an UnboundLocalError (the local f hasn't been bound to yet at the time "print outer" executes). In reality it prints: outer f.a is and then blows up with a null-pointer dereference, here: case LOAD_DEREF: x = freevars[oparg]; w = PyCell_Get(x); Py_INCREF(w); /***** THIS IS THE GUY *****/ PUSH(w); break; Simpler program with same symptom: def f(): print "outer f.a is", f.a def f(): print "inner f.a is", f.a f() I *do* get an UnboundLocalError if the body of the inner "f" is changed to "pass": def f(): # this one works fine! i.e., UnboundLocalError print "outer f.a is", f.a def f(): pass f() You'll also be happy to know that this one prints 666 twice (as it should): def f(): def f(): print "inner f.a is", f.a f.a = 666 f() print "outer f.a is", f.a f.a = 42 f() python-gets-simpler-each-release<wink>-ly y'rs - tim
participants (1)
-
Tim Peters