C'est ce qu'on appelle des fonctions partielles et il y a au moins 3 façons de le faire. Ma façon préférée utilise lambda car elle évite la dépendance à l'égard d'un paquet supplémentaire et est la moins verbeuse. Supposons que vous ayez une fonction add(x, y)et que vous souhaitiez passer add(3, y)à une autre fonction en tant que paramètre de sorte que l'autre fonction décide de la valeur pour y.
Utilisez lambda
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = lambda y: add(3, y)
result = runOp(f, 1) # is 4
Créez votre propre emballage
Ici, vous devez créer une fonction qui renvoie la fonction partielle. C'est évidemment beaucoup plus verbeux.
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# declare partial function
def addPartial(x):
def _wrapper(y):
return add(x, y)
return _wrapper
# run example
def main():
f = addPartial(3)
result = runOp(f, 1) # is 4
Utiliser partiel à partir de functools
Ceci est presque identique à celui lambdamontré ci-dessus. Alors pourquoi en avons-nous besoin? Il y a peu de raisons . En bref, partialpeut être un peu plus rapide dans certains cas (voir son implémentation ) et que vous pouvez l'utiliser pour une liaison anticipée vs une liaison tardive de lambda.
from functools import partial
# generic function takes op and its argument
def runOp(op, val):
return op(val)
# declare full function
def add(x, y):
return x+y
# run example
def main():
f = partial(add, 3)
result = runOp(f, 1) # is 4
def action1(arg1, arg2=None, arg3=None)comment pourriez-vous passer un argument que vous avez l'intention d'être affecté à arg3, par exemple?