On Wed, Jul 21, 2010 at 9:07 PM, Carl M. Johnson <cmjohnson.mailinglist@gmail.com> wrote:
There have been questions about whether there are any cases of the given/where/let/whatever solving problems that would otherwise be cumbersome to solve. I think it could help get around certain for-loop gotchas:
funcs = [] for i in range(5): ... def f(): ... print("#", i) ... funcs.append(f) ... [func() for func in funcs] # 4 # 4 # 4 # 4 # 4 [None, None, None, None, None]
D’oh! (This can be a real world problem if you have a list of methods you want to decorate inside a class.)
One current workaround:
funcs = [] for i in range(5): ... def _(): ... n = i ... def f(): ... print("#", n) ... funcs.append(f) ... _() ... [func() for func in funcs] # 0 # 1 # 2 # 3 # 4 [None, None, None, None, None]
Not pretty, but it works.
In let format (I’m leaning toward the format “let [VAR = | return | yield] EXPRESSION where: BLOCK”):
funcs = [] for i in range(5): let funcs.append(f) where: n = i def f(): print("#", n)
[func() for func in funcs]
Still a little awkward, but not as bad, IMHO.
Neither of those seem (imo) better than the other current workaround: funcs = [] for i in range(5): def f(i=i): print("#", i) funcs.append(f) They're all non-obvious idioms, but at least this one is short and easily recognized. Cheers, Chris