[Python-ideas] Infix functions
Andrew Barnert
abarnert at yahoo.com
Sat Feb 22 03:16:23 CET 2014
From: Mathias Panzenböck <grosser.meister.morti at gmx.net>
Sent: Friday, February 21, 2014 5:45 PM
>Am 2014-02-21 23:05, schrieb Andrew Barnert:
>> While we're discussing crazy ideas inspired by a combination of a long-abandoned PEP and Haskell idioms (see the implicit lambda thread), here's another: arbitrary infix operators:
>>
>> a `foo` b == foo(a, b)
>>
>
>If you really want to you could do this:
This is basically the same trick you use in Haskell to allow arbitrary expressions rather than just identifiers to be used infix. Which I don't think you actually want to allow. Also, it requires you to declare certain functions as infix-able rather than just use any functions arbitrarily. Of course that does allow you to give the infix version a different name than the prefix version, like bar = infix(foo), or even bar = infix(partial(Spam(2).long_method_name, 'eggs')), which could I suppose be useful.
One question about the implementation:
> class infix2(object):
> __slots__ = 'func', 'arg1'
>
> def __init__(self,func,arg1):
> self.func = func
> self.arg1 = arg1
>
> def __call__(*args,**kwargs):
> self, args = args[0], args[1:]
> return self.func(self.arg1,*args,**kwargs)
First, why not just:
def __call__(self, *args, **kwargs):
return self.func(self.arg1, *args, **kwargs)
More importantly, I assume this is to allow auto-partialing, so "spam" |foo is a normal function of one argument that you can pass around? That doesn't actually work the same way as Haskell operators, and it looks pretty weird in Python too, and I can't think of when you'd want it, but it is clever.
More information about the Python-ideas
mailing list