J'essaie d'appeler une fonction dans une autre fonction en python, mais je ne trouve pas la bonne syntaxe. Ce que je veux faire est quelque chose comme ceci:
def wrapper(func, args):
func(args)
def func1(x):
print(x)
def func2(x, y, z):
return x+y+z
wrapper(func1, [x])
wrapper(func2, [x, y, z])
Dans ce cas, le premier appel fonctionnera et le second ne fonctionnera pas. Ce que je veux modifier, c'est la fonction wrapper et non les fonctions appelées.
def wrapper(func, *args)
est ce quimethod(params object[] args)
est en C #.*args
doit s'agir du dernier argument de la définition de fonction.The * next to args means "take the rest of the parameters given and put them in a list called args".
Cela les met dans un tuple, pas dans une liste.La façon la plus simple d'encapsuler une fonction
... est d'écrire manuellement un wrapper qui appellerait func () à l' intérieur de lui-même:
En Python, la fonction est un objet, vous pouvez donc passer son nom comme argument d'une autre fonction et le renvoyer. Vous pouvez également écrire un générateur de wrapper pour n'importe quelle fonction anyFunc () :
Veuillez également noter qu'en Python, lorsque vous ne connaissez pas ou ne voulez pas nommer tous les arguments d'une fonction, vous pouvez vous référer à un tuple d'arguments, qui est indiqué par son nom, précédé d'un astérisque entre parenthèses après le nom de la fonction:
Par exemple, vous pouvez définir une fonction qui prendrait n'importe quel nombre d'arguments:
Python permet une manipulation encore plus poussée des arguments de fonction. Vous pouvez autoriser une fonction à prendre des arguments de mot-clé. Dans le corps de la fonction, les arguments de mot-clé sont conservés dans un dictionnaire. Dans les parenthèses après le nom de la fonction, ce dictionnaire est indiqué par deux astérisques suivis du nom du dictionnaire:
Un exemple similaire qui imprime le dictionnaire des arguments de mot-clé:
la source
Vous pouvez utiliser la syntaxe * args et ** kwargs pour les arguments de longueur variable.
Que signifient * args et ** kwargs?
Et du tutoriel officiel python
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
la source
La réponse littérale à votre question (faire exactement ce que vous avez demandé, en changeant uniquement le wrapper, pas les fonctions ou les appels de fonction) est simplement de modifier la ligne
lire
Cela indique à Python de prendre la liste donnée (dans ce cas,
args
) et de transmettre son contenu à la fonction en tant qu'arguments positionnels.Cette astuce fonctionne des deux "côtés" de l'appel de fonction, donc une fonction définie comme ceci:
serait capable d'accepter autant d'arguments de position que vous lui lancez, et de les placer tous dans une liste appelée
args
.J'espère que cela aidera à clarifier un peu les choses. Notez que tout cela est également possible avec les arguments dicts / mots-clés, en utilisant
**
au lieu de*
.la source
Vous devez utiliser la décompression des arguments.
la source
Un petit ajout aux réponses précédentes, car je n'ai pas trouvé de solution à un problème, ce qui ne vaut pas la peine d'ouvrir une nouvelle question, mais m'a conduit ici.
Voici un petit extrait de code, qui combine
lists
,zip()
et*args
, pour fournir un wrapper qui peut traiter un nombre inconnu de fonctions avec un nombre inconnu d'arguments.Gardez à l'esprit que
zip()
cela ne fournit pas de vérification de sécurité pour les listes de longueur inégale, voir les itérateurs de zip affirmant une longueur égale en python .la source