Python -Funktionszusammensetzung
-
21-09-2019 - |
Frage
Ich habe versucht, die Funktionszusammensetzung mit einer netten Syntax zu implementieren, und hier habe ich:
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
print f1(2) #4
print f2(2) #5
print (f1 << f2 << f1)(2) #14
print (f3 >> f2)(2) #1
print (f2 >> f3)(2) #-5
Es funktioniert gut mit Ganzzahlen, scheitert jedoch in Listen/Tupeln:
@composable
def f4(a):
a.append(0)
print f4([1, 2]) #None
Wo ist ein Fehler?
Lösung
append
Fügt sich die Einstellung zu, wie Ignacio Vazquez-Abrams sagte (na ja, impliziert)-während Sie dies so beheben konnten, indem Sie nur eine hinzufügen return
Zu Ihrer Funktion hätte es den Nebeneffekt, das Argument zu ändern, das es übergeben wurde:
@composable
def f4(a):
a.append(0)
return a
Es ist am besten, den folgenden noch prägnanteren Code zu verwenden, der auch ein neues Objekt erstellt und zurückgibt:
@composable
def f4(a):
return a + [0]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow