Das Currying einer beliebigen Funktion in Python ist ziemlich mühsam (Referenz: Versuchen Sie, Curry in Python zu schreiben).
Sie können jedoch aufrufbare Objekte verwenden, damit es so aussieht, als wäre es lockig. Einfach Nakoto.
Wenn es um Curry geht, sollten Sie hart arbeiten, um den Lambda-Ausdruck zu kneten. Mit dieser Methode können Sie dies jedoch auch tun, indem Sie die Implementierung der Dunder-Methode entwickeln.
import re
class Curried:
def __init__(self, f, regex=None, *args, **kwargs):
self.__f = f
self.__regex = regex if regex is not None else \
re.compile('{}\\(\\) missing \\d+ required'.format(f.__name__))
self.__args = args if args is not None else ()
self.__kwargs = kwargs if kwargs is not None else {}
def __call__(self, *arg, **kwarg):
cls = type(self)
new_args = self.__args + arg
new_kwargs = dict(**self.__kwargs, **kwarg)
try:
return self.__f(*new_args, **new_kwargs)
except TypeError as e:
if self.__regex.match(e.args[0]):
return cls(self.__f, self.__regex, *new_args, **new_kwargs)
else:
raise e
@property
def __name__(self):
return self.__f.__name__
Diese "Curried" -Instanz nimmt nacheinander Argumente auf und erstellt weiterhin "Curried" -Instanzen, bis sie die Argumente der ursprünglichen Funktion ausfüllt. Es ist nicht nur eine Funktion, sondern ein aufrufbares Objekt wie eine Funktion.
Verwenden Sie es so.
def add(x, y):
return x + y
def add3(x, y, z):
return x + y + z
print(Curried(add)(2)(3))
print(Curried(add3)(2)(3)(4))
5
9
Auf den ersten Blick sieht es so aus, als würden Sie eine lockige Funktion aufrufen, oder?
Es kann auch für Objektmethoden verwendet werden.
class Foo(object):
def __init__(self, seed=1):
self.seed = seed
def add(self, x, y):
return self.seed * (x + y)
def multiply(self, x, y):
return self.seed * x * y
f = Foo(3)
print(Curried(f.add)(2)(3))
print(Curried(f.multiply)(2)(3))
15
18
Sie können auch Curry-Funktionen (die dauerhaft zu sein scheinen, aber diese Funktion ist nicht wirklich eine Funktion) wiederverwenden, die im Referenzartikel nicht möglich waren.
add2 = Curried(add)(2)
print(add2(3))
print(add2(4))
5
6
Recommended Posts