2017-09-27 4 views
2

Étant donné une fonction simple:passage nom du paramètre de fonction à une autre fonction en Python

def A(a = 1, b = 2): 
    return a+b 

Je veux écrire une autre fonction pour changer la valeur du paramètre par défaut, soit pour a ou b. Et l'utilisateur peut spécifier le paramètre à modifier en définissant var = a ou var = b. Par exemple:

def B(var = 'a', new_value = 10): 
    temp_dict = {var:new_value} 
    ans = A(var) 
    return ans  

ou

def B(var = 'a', new_value = 10): 
    ans = A(var = new_value) 
    return ans 

En fonction def B(), après avoir réglé var = a et var = new_value = 10, je me attends A(var = new_value) pour atteindre le même effet que A(a = 10). Connaissez-vous la bonne façon d'écrire la fonction def B()? Merci.

Répondre

5

Vous y êtes presque. De votre B() fonction, tout en faisant l'appel à A(), vous devez décompresser le temp_dict et passez-le comme un argument à A(). Voir ci-dessous:

>>> def A(a = 1, b = 2): 
...  return a+b 
... 

>>> def B(var = 'a', new_value = 10): 
...  temp_dict = {var:new_value} 
...  ans = A(**temp_dict) 
     #  ^unpack the dict, and pass it as an argument 
...  return ans 
... 

>>> B() 
12 

Pour plus de détails sur la façon dont cette ** fonctionne avec un dict, s'il vous plaît jeter un oeil à:

0

J'ai pris la liberté d'interpréter un peu ce que le PO disait vouloir, c'est-à-dire changer la valeur du paramètre par défaut, pour a ou b. Donc, ce que je faisais était de retourner une fonction transformée A avec soit l'un ou par défaut b changé par un partiel:

from functools import partial 

def B3(var ="a", new_value=10): 
    return partial(A, **{var:new_value}) 

sorties d'échantillons:

(Pdb) f = B3("a",10) 
(Pdb) f() 
12 
(Pdb) f = B3("b",10) 
(Pdb) f() 
11 
(Pdb) f(a=10) 
20 
(Pdb) f(b=13) 
14 
(Pdb) f(a=5,b=5) 
10 

qui est différent de la 2ème moitié de la demande cependant, celui d'avoir quelque chose basé sur B(var="a",new_value=10) comme signature de fonction.

La seule chose est, il étrangle heureux si vous n'utilisez des paramètres mot-clé:

(Pdb) f(7,7) 
*** TypeError: A() got multiple values for keyword argument 'b'