[Python-ideas] Explicit variable capture list

Greg Ewing greg.ewing at canterbury.ac.nz
Tue Jan 26 18:59:13 EST 2016


Steven D'Aprano wrote:
> Outside of such toys, we often find ourselves closing 
> over at least one variable which is derived from the loop variable, but 
> not the loop variable itself:

Terry's idea of a variant of the for-loop whose body
is a nested scope (with everything that implies) would
address that, because any name assigned within the body
(and not declared nonlocal) would be part of the captured
scope.

> I would not like to see "new" become a keyword.

I'm open to alternatives. Would "foreach" be better
keyword material? We could say

   foreach i in things:
     ...

although the difference between "for" and "foreach"
would be far from obvious.

I'd like to do something with "let", which is famliar
from other languages as a binding-creation construct,
and it doesn't seem a likely choice for a variable
namne.

Maybe if we had a general statement for introducing
a new scope, independent of looping:

   let:
     ...

Then loops other than for-loops could be treated like
this:

   i = 0
   while i < n:
     let:
       x = things[i]
       funcs.append(lambda: process(x))

The for-loop is a special case, because it assigns a
variable in a place where we can't capture it in a
let-block. So we introduce a variant:

   for let x in things:
     funcs.append(lambda: process(x))

Refinements"

1) Other special cases could be provided, but I don't
think any other special cases are strictly needed. For
example, you might want:

   with open(filename) as let f:
     process(f)

but that could be written as

   with open(filename) as f:
     let:
       g = f
       process(g)

2) It may be desirable to allow assignments on the
same line as "let", e.g.

   with open(filename) as f:
     let g = f:
       process(g)

which seems marginally more readable. Also, the
RHS of the assignment would be evaluated outside
the scope being created, allowing

   with open(filename) as f:
     let f = f:
       process(f)

although I'm not sure that's a style that should be
encouraged. Code that apparently assigns something
to itself always looks a bit wanky to me. :-(

-- 
Greg


More information about the Python-ideas mailing list