[Python-ideas] Infix application of binary functions
Carl M. Johnson
cmjohnson.mailinglist at gmail.com
Thu Jul 22 06:22:58 CEST 2010
Last time, I swear! I caught a bug in the last version. Since I
mutated my instances (not very Haskell-like!!), you couldn’t use the
same function more than once. Here’s a new version that lets you use
the same function again:
class InfixArity(object):
def __init__(self, arity):
self.arity = arity
def __call__(self, func):
self.func = func
return self
def __add__(self, arg):
return InfixHelper(self.func, self.arity, arg)
__radd__ = __add__
__floordiv__ = __rfloordiv__ = __add__
__truediv__ = __rtruediv__ = __add__
class InfixHelper(object):
def __init__(self, func, arity, firstarg):
self.func = func
self.arity = arity
self.args = [firstarg]
def __add__(self, arg):
self.args.append(arg)
if len(self.args) < self.arity:
return self
else:
return self.func(*self.args)
__radd__ = __add__
__floordiv__ = __rfloordiv__ = __add__
__truediv__ = __rtruediv__ = __add__
Infix = lambda func: InfixArity(2)(func)
I imagine it would be possible to make an n-arity class that could
work like “average // 1 // 2 // 3 // 4 // done” or maybe one that has
you use a different operator for the last argument, but I leave that
as an exercise for the reader.
-- Carl Johnson
On Wed, Jul 21, 2010 at 5:49 PM, Carl M. Johnson
<cmjohnson.mailinglist at gmail.com> wrote:
> Thought about it some more. Here’s a more general formula:
>
> class InfixArity(object):
> def __init__(self, arity):
> self.arity = arity
> self.args = []
>
>
> def __call__(self, func):
> self.func = func
> return self
>
> def __add__(self, arg):
> self.args.append(arg)
> if len(self.args) < self.arity:
> return self
> else:
> return self.func(*self.args)
>
> __radd__ = __add__
>
> Infix = lambda func: InfixArity(2)(func)
>
> And of course, one can use __mul__ or __div__ or whatever to taste. "1
> // add // 2” doesn’t make me instantly vomit in my mouth. ;-)
>
> -- Carl Johnson
>
More information about the Python-ideas
mailing list