scoping weirdness

Tom Good Tom_Good1 at excite.com
Thu Aug 30 13:02:10 EDT 2001


"Alex Martelli" <aleax at aleax.it> wrote in message news:<9mkt0t01cno at enews1.newsguy.com>...
> "Tom Good" <Tom_Good1 at excite.com> wrote in message
> news:ac677656.0108291503.4d211cd6 at posting.google.com...
> > "Alex Martelli" <aleax at aleax.it> wrote in message
>  news:<9md62v01ne3 at enews1.newsguy.com>...
> > > Currying-to-argumentlessness is a frequent enough need
> > > (since Tk &c all want lots of argumentless callables)
> > > that one may want to rename 'curry_to_argumentlessness'
> > > to something more concise and put it in sitecustomize
> > > or thereabouts.
> >
> > How about 'curry_all'?
> >
> > . . . 'curry_extra_spicy' comes to mind, too, but it is too many
> characters :-)
> 
> Another frequent need, almost as frequent as currying all
> arguments, is currying all but one, to get a one-argument
> callable suitable for filter (or map -- it seems to me that
> most of my map calls are with 1-arg callables).  Problem
> with this is that there's no obvious syntax to specify
> which one argument you want left "free" (uncurried) -- I
> think that hardwiring it to the first one would cover a
> majority of cases, but far from all.   Hmmmm....
> 
> 
> Alex

Currying all but the first one probably would work most of the time. 
For a little more flexibility, maybe specify by index which argument
to leave free:


# ---- begin code ----

from __future__ import nested_scopes

def curry_all_but(index, *args, **kwds):
    def curried_func(single_arg):
        return args[0](*(args[1:index] + (single_arg,) + 
                         args[index:]), **kwds)
    return curried_func

def test(a, b):
    print "you chose %s, %s" % (a,b)

if __name__ == "__main__":
    f1 = curry_all_but(1, test, 'B')
    f1('A')

    f2 = curry_all_but(2, test, 'B')
    f2('A')

# ---- end code ----

Output:

you chose A, B
you chose B, A



More information about the Python-list mailing list