2016-02-12 1 views
0

Je ne suis pas sûr de la façon précise de formuler la question car il est plus facile de démontrer simplement avec du code. Je voudrais avoir une fonction qui accepte un nombre variable d'un ensemble de 3 arguments obligatoires et 1 facultatifs. A titre d'exemple, matplotlib.pyplot.plot() peut accepter n'importe quel nombre de (x, y, color) ensemble de variables. Je voudrais copier ce comportement, mais je ne suis pas sûr de la bonne façon de le faire en utilisant * args ou similaire. Ci-dessous, j'illustre le comportement que je voudrais.Passer un nombre arbitraire d'un ensemble de variables à la fonction Python

myFunc(name, lo, hi, step) # Do something 
myFunc(name, lo, hi, step, name2, low2, hi2, step2) # Do something for name and name2 
myFunc(name, lo, hi, name2, low2, hi2) # Same as above but use default step for both 

La seule façon que je peux penser est en boucle à travers les arguments et effectuer une série de contrôles sur assurez-vous qu'il satisfait le type de (name, lo, hi, step) et de vérifier si step est même donné, mais je voudrais savoir s'il y a un moyen plus efficace de le faire.

Edit:

Je voulais que le comportement ci-dessus puisque ma fonction utilise le premier ensemble pour identifier un paramètre et créer une boucle while. S'il reste d'autres ensembles de paramètres, il s'appelle récursivement pour construire une boucle while imbriquée avec les paramètres restants, etc. Si aucun ensemble supplémentaire ne reste, il effectuera une mesure de données, puis reviendra. De cette façon, je peux traverser un espace multidimensionnel arbitrairement grand en utilisant une seule fonction récursive.

+0

Peut-être que vous voulez ** kwargs. Ceux-ci vous permettront des arguments de mots-clés optionnels –

+0

Il y a des parties de l'API de 'matplotlib' que je trouve vraiment horrible - C'est l'une d'entre elles. :-). Dans ce cas, je recommanderais d'avoir la fonction/méthode appelée un nombre de fois avec 3 arguments obligatoires et 1 argument optionnel. . . Cela serait-il possible pour votre cas d'utilisation? – mgilson

+0

Vérifiez ce post: http://stackoverflow.com/questions/3394835/args-and-kwargs – Jaco

Répondre

0

Quelque chose comme ça est ce que vous cherchez?

list_of_things = [('name', 'lo', 'hi', 'step'), 
        ('name2', 'lo2', 'hi2'), 
        ('name3', 'lo3', 'hi3', 'step3') 
] 
def myFunc(name, lo, hi, step='default'): 
           # do something 
def callMyFunc(x):  
    for i in x: 
     myFunc(*i)   # pass the contents of the tuple as arguments 

Si vous ne voulez pas le tuple des articles commandés, vous devez nommer chacun des arguments et de les soumettre le nom.

+0

Sorte de, mais j'ai besoin de la boucle for à l'intérieur de la fonction, pour ainsi dire. Fondamentalement, je vérifie combien de tuples que j'ai, et la fonction change en fonction du nombre qui a été passé. Plus spécifiquement, il traite le premier ensemble et s'il reste d'autres tuples, j'appelle récursivement la fonction. – Snyder005

+0

Je l'ai édité pour placer la boucle for à l'intérieur d'une deuxième fonction. L'appel de cette fonction avec la liste traitera chaque ligne à l'intérieur, une par une. Basé sur votre question mise à jour, cela peut ne pas aider. – jlbnjmn