Curry jede Funktion mit Python ....

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.

Oh, sag das nicht so einfach

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.

Wenn Sie Ihre rechte Hand heben, sind Sie für diese Hand verantwortlich

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

Curry jede Funktion mit Python ....
Einführung in Python-Funktionen
Python-Funktionen
10 Funktionen von "Sprache mit Batterie" Python
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Führen Sie regelmäßig eine beliebige Verarbeitung mit Python Twisted durch
Twilio mit Python
In Python integrieren
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
# Python-Grundlagen (Funktionen)
[Anfänger] Python-Funktionen
Bingo mit Python
Zundokokiyoshi mit Python
Verwenden von C ++ - Funktionen aus Python mit pybind11
Python Einfach zu bedienende Funktionen
Python-Grundlagen: Funktionen
Verwenden Sie Python und MeCab mit Azure-Funktionen
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Ich habe Funktionssynthese und Curry mit Python versucht
[Azure-Funktionen / Python] Kettenfunktionen mit Warteschlangenspeicherbindung
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Python-Anfängerhandbuch (Funktionen)
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Python-Grundkurs (12 Funktionen)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
[Python] Memo über Funktionen