Vor einiger Zeit habe ich über Haskell docs geschaut und festgestellt, dass es ein funktionaler Kompositionsoperator ist. Also habe ich diese kleine Dekorateur umgesetzt:Ist es eine gute Idee, eine Syntax Sugar zu haben, um die Komposition in Python zu funktionieren?
from functools import partial
class _compfunc(partial):
def __lshift__(self, y):
f = lambda *args, **kwargs: self.func(y(*args, **kwargs))
return _compfunc(f)
def __rshift__(self, y):
f = lambda *args, **kwargs: y(self.func(*args, **kwargs))
return _compfunc(f)
def composable(f):
return _compfunc(f)
@composable
def f1(x):
return x * 2
@composable
def f2(x):
return x + 3
@composable
def f3(x):
return (-1) * x
@composable
def f4(a):
return a + [0]
print (f1 >> f2 >> f3)(3) #-9
print (f4 >> f1)([1, 2]) #[1, 2, 0, 1, 2, 0]
print (f4 << f1)([1, 2]) #[1, 2, 1, 2, 0]
Das Problem: ohne Sprachunterstützung wir diese Syntax nicht auf eingebauten Funktionen oder Lambda-Ausdrücke wie diese verwenden:
((lambda x: x + 3) >> abs)(2)
Die Frage: ist es nützlich? Lohnt es sich, auf der Python-Mail-Liste diskutiert zu werden?
... aber es ist immer noch möglich, etwas wie dieses zu schreiben: drucken (zusammensetzbar (Lambda x: x + 3) >> zusammensetzbar (abs)) (- 4) – si14