When this conversation started discussing namespaces, it occurred to me that we've had a number of suggestions for "statement-local" namespaces shot down. It seems that they'd solve this case as well as the intended case. I don't expect this to be acceptable, but since it solves part of this problem as well as dealing with the issues for which it was originally created, I thought I'd point it out.

I'm talking about the requests that we add the let/where statement found in functional languages. Both add one new keyword. The syntax is:

let:
    assignments
in:
    statements

or

statement where:
    assignments

which creates a namespace containing names bound in "assignments" for the duration of statement (or statements, as the case may be). I'm going to go with the let version, because it's not clear how what the syntax should be for where on a def statement.

The original examples were things like:

let:
    sumsq = sum(a * a for a in mylist)
in:
    value =  sumsq * 3 - sumsq

So you can deal with the case of wanting to preserve values during a binding with something like:

res = []
for i in range(20):
    let:
        i = i
    in:
        res.append(lambda x: x + i)

Allowing a def in the statements means you can write the counter example with something like:

let:
    counter = 0
in:
    def inc(change=1):
        nonlocal counter
        counter += change
        return counter

We have to declare counter nonlocal in order to rebind it in this case.

The odd thing here is that bindings in statements happen in the namespace that the let occurs in, but lookups of nonlocal variables include the namespace created by the let.

      <mike