2017-09-27 6 views
2

eine einfache Funktion Gegeben:Passing Funktion Parameternamen an einem anderen Funktion in Python

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

ich eine andere Funktion zu schreiben, für den Standard-Parameterwert zu ändern entweder a oder b. Der Benutzer kann den zu ändernden Parameter festlegen, indem er var = a oder var = b einstellt. Zum Beispiel:

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

oder

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

In Funktion def B() nach var = a und var = new_value = 10 Einstellung erwarte ich, dass A(var = new_value) die gleiche Wirkung wie A(a = 10) zu erreichen. Kennen Sie den richtigen Weg, um die Funktion def B() zu schreiben? Danke.

Antwort

5

Sie sind fast da. Von Ihrer B() Funktion, während Sie den Anruf zu A() machen, müssen Sie die temp_dict entpacken und übergeben Sie es als Argument an A(). Siehe unten:

>>> 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 

Weitere Informationen darüber, wie diese ** arbeitet mit einem dict, nehmen Sie bitte einen Blick auf:

0

Ich habe mir die Freiheit genommen, etwas zu interpretieren, was der OP sagte, er wollte, d. H. Ändern Sie den Standard-Parameter-Wert, entweder für a oder b. Also, was ich tat, war eine transformierte Funktion A zurückzukehren entweder mit dem a oder b Vorgaben über einen teilweise geändert:

from functools import partial 

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

Probe Ausgänge:

(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 

, die aus der zweiten Hälfte des Antrags ist anders jedoch, dass etwas auf B(var="a",new_value=10) als Funktionssignatur basiert.

Die einzige Sache ist, es würgt glücklich, wenn Sie Keyword-Parameter nicht verwenden:

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