[Python-ideas] Allow lambda decorators

Chris Rebert pyideas at rebertia.com
Mon Feb 9 07:02:49 CET 2009


On Sun, Feb 8, 2009 at 9:40 PM, Aahz <aahz at pythoncraft.com> wrote:
<much snippage>
> Maybe I've been corrupted by the functional mindset (I hope not!), but I
> can follow this.  As Carl says, the key is to focus on the scoping
> problem:
>
> def func_maker():
>    fs = []
>    for i in range(10):
>        def f():
>            return i
>        fs.append(f)
>    return fs
>
> This creates a list of function objects, but the way scoping works in
> Python, every single function object returns 9 because that's the final
> value of ``i`` in func_maker().  Living with this wart is an option;
> changing Python's scoping rules to fix the wart is probably not worth
> considering.  Carl is suggesting something in-between, allowing the use
> of lambda combined with decorator syntax to create an intermediate scope
> that hides func_maker()'s ``i`` from f().
>
> I think that's ugly, but it probably is about the best we can do -- the
> other options are uglier.

This will likely get shot down in 5 minutes somehow, but I just want
to put it forward since I personally didn't find it ugly: Has a
declaration been considered (like with `nonlocal`)? Seems a relatively
elegant solution to this problem, imho. I know it was mentioned in a
thread once (with the keyword as "instantize" or "immediatize" or
something similar), but I've been unable to locate it (my Google-chi
must not be flowing today).

The basic idea was (using the keyword "bind" for the sake of argument):

def func_maker():
    fs = []
    for i in range(10):
        def f():
            bind i #this declaration tells Python to grab the value of
i as it is *right now* at definition-time
            return i
        fs.append(f)
    return fs

The `bind` declaration would effectively tell Python to apply an
internal version of the `lambda x=x:` trick/hack/kludge automatically,
thus solving the scoping problem.

I now expect someone will point me to the thread I couldn't find
and/or poke several gaping holes in this idea.

Cheers,
Chris

-- 
Follow the path of the Iguana...
http://rebertia.com



More information about the Python-ideas mailing list