> I've checked in an update to Raymond's PEP 289 which (I hope) > clarifies a lot of things, and settles the capturing of free > variables. I had another early-morning idea about how to deal with the free variable issue, which could also be used when you have another form of closure (lambda, def) and you want to capture some of its free variables. Suppose there were a special form of assignment new x = expr If x is not used in any nested scope, this is the same as a regular assignment. But if it is, and consequently x is kept in a cell, instead of replacing the contents of the cell, this creates a *new* cell which replaces the previous one in the current scope. But any previously create closure will still be holding on to the old cell with its old value. If you do this in a loop, you will end up with a series of incarnations of the variable, each of which lives in its own little scope. Using this, Tim's pipeline example would become pipe = source for new p in predicates: new pipe = e for e in pipe if p(e) For generator expressions, Tim's idea of just always capturing the free variables is probably better, since it doesn't require recognising a subtle problem and then applying a furtherly-subtle solution. But it seemed like a stunningly brilliant idea at 3:27am this morning, so I thought I'd share it with you. :-) Greg Ewing, Computer Science Dept, +--------------------------------------+ University of Canterbury, | A citizen of NewZealandCorp, a | Christchurch, New Zealand | wholly-owned subsidiary of USA Inc. | greg at cosc.canterbury.ac.nz +--------------------------------------+
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4