[Python-Dev] more timely detection of unbound locals (original) (raw)

Steven D'Aprano steve at pearwood.info
Mon May 9 18:39:14 CEST 2011


Eli Bendersky wrote:

I think you are making an unwarranted assumption about what is "more expected". I presume you are thinking that the expected behaviour is that foo() should:

print global x (5) assign 1 to local x print local x (1) If we implemented this change, there would be no more questions about UnboundLocalError, but instead there would be lots of questions like "why is it that globals revert to their old value after I change them in a function?". True, but this is less confusing and follows the rules in a more straightforward way. x = 1 without a 'global x' assigns a local x, this make sense and is similar to what happens in C where an inner declaration temporarily shadows a global one.

I disagree that it is less confusing. Instead of a nice, straightforward error that you can google, the function will silently do the wrong thing, giving no clue that weirdness is happening.

def spam(): if x < 0: # refers to global x x = 1 # now local if x > 0: # could be either global or local x = x - 1 # local on the LHS of the equal # sometimes global on the RHS else: x += 1 # local x, but what value does it have?

Just thinking about debugging the mess that this could make gives me a headache.

-- Steven



More information about the Python-Dev mailing list