[ANN] Partial.py: convenient notation for partial application/currying
Jeff Epler
jepler at unpythonic.net
Wed Jun 25 22:24:26 EDT 2003
Hm, interesting.
> >>> mapcall(_.upper, ["list", "of", "strings"])
So you are forced to use 'mapcall' instead of 'map' for some reason? It
seems like you could define _ in such a way that this was not necessary
(this may not fit in with your whole module, though---also, performance of
my approach is untested and uncompared with mapcall(_., ...).
class MethodCaller:
def __init__(self, method_name):
self.method_name = method_name
def __call__(self, obj, *args, **kw):
method = getattr(obj, self.method_name)
return method(*args, **kw)
class UnderscoreMaker:
def __init__(self): pass
def __getattr__(self, m):
return MethodCaller(m)
_ = UnderscoreMaker()
>>> map(_.upper, "abc")
['A', 'B', 'C']
Here's an api idea (no implementation) for currying:
def f(x, y, z): print x, y, z
class C:
f = f
# _[] gives a curryable, and curryable[] curries. _ when currying leaves
# the arg open. If this was integrated in the language, f[_, ...] would
# mean the same thing as _[f][...]
>>> g = _[f][_, _, 'a']
>>> g(1, 2)
1 2 a
# Might as well allow this shorthand
>>> g = _[f, _, 'a']
>>> g(1, 2)
1 a 2
>>> c = C()
# A MethodCaller is also curryable[]. _ means the same thing
>>> g = _.f['a']
>>> g(c, 1)
<__main__.C instance at 0xdeadbeef> a 1
Of course, there are always those who already have a use for _: the
interactive prompt, gettext-style i18n, and god knows what else... Also,
the triple-use of _ seems a bit dirty. Another thing that would be cool is
if Python could perform constant propagation when currying, possibly giving
a better/more efficient function instead of a slower one with more
indirection.
Jeff
PS What? You mean you already had this thread twice this year? Why wasn't
I invited?
More information about the Python-list
mailing list