Curry n'importe quelle fonction avec Python ...

Curry une fonction arbitraire en Python est assez gênant (Référence: Essayez d'écrire du curry en Python).

Cependant, vous pouvez utiliser des objets appelables pour donner l'impression qu'il est bouclé. Easy Nakoto.

Oh, ne dis pas ça facilement

En ce qui concerne le curry, vous voudrez travailler dur pour pétrir l'expression lambda, mais avec cette méthode, vous pouvez faire la même chose simplement en concevant l'implémentation de la méthode Dunder.

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__

Cette instance Curried prend les arguments un par un et continue de créer des instances Curried jusqu'à ce qu'elle remplisse les arguments de la fonction d'origine. Ce n'est pas seulement une fonction, mais c'est un objet appelable comme une fonction.

Si vous levez la main droite, vous serez responsable de cette main

Utilisez-le de cette façon.

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

À première vue, on dirait que vous appelez une fonction bouclée, non?

Il peut également être utilisé pour les méthodes objet.

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

Vous pouvez également réutiliser des fonctions curry (qui semblent persistantes, mais celle-ci n'est pas vraiment une fonction) que vous ne pouviez pas faire dans l'article de référence.

add2 = Curried(add)(2)
print(add2(3))
print(add2(4))
5
6

Recommended Posts

Curry n'importe quelle fonction avec Python ...
Introduction aux fonctions Python
Fonctions Python
10 fonctions du "langage avec batterie" python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Effectuez périodiquement un traitement arbitraire avec Python Twisted
Twilio avec Python
Intégrer avec Python
Essayez d'utiliser Python avec Google Cloud Functions
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
# Bases de Python (fonctions)
[Débutant] Fonctions Python
Bingo avec python
Zundokokiyoshi avec python
Utilisation des fonctions C ++ de python avec pybind11
Fonctions Python faciles à utiliser
bases de python: fonctions
Utiliser Python et MeCab avec Azure Functions
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
J'ai essayé la synthèse de fonctions et le curry avec python
[Azure Functions / Python] Fonctions de chaîne avec liaison de stockage de file d'attente
Communication série avec Python
Zip, décompressez avec python
Guide du débutant Python (fonctions)
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Cours de base Python (12 fonctions)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
[Python] Mémo sur les fonctions