2016-08-08 10 views
0

I, wie inPython Methoden und „Schalter“

def add(first, second): 
    return first + second 

def sub(): 
    ... 
    return something 

operations = { 
    "Add": add, 
    "Sub": sub 
} 

ret_val = operations[operation] 

Jetzt Wörterbuch als switch-Anweisung zu verwenden, ich versucht, wie kann ich die Argumente hinzuzufügen und Unter und erhalten ihre Antwort übergeben? Zur Zeit gebe ich nichts an die Methoden weiter und teste das ret_val. Was ich sehe ist, dass die Operation aufgerufen wird, aber die Rückkehr kommt nicht zurück. Was ich bekomme, ist der Zeiger auf die Operationsmethode.

Danke!

+3

'Operationen [Operation]' ist die Funktion. Sie müssen die Funktion mit den entsprechenden Argumenten aufrufen, zB: 'operations ['Add'] (1,2)' –

Antwort

1

Um eine Funktion aufzurufen, setzen Sie die Argumente in Klammern, genau so, wie wenn Sie eine Funktion direkt über ihren Namen aufrufen.

ret_val = operations[operation](1, 2) 

Beachten Sie, dass für diese ordnungsgemäß funktionieren kann, alle Funktionen in operations müssen die gleiche Anzahl von Argumenten zu übernehmen. Es wird also nicht funktionieren, wenn add() zwei Argumente braucht, aber sub() nimmt keine, wie Sie gezeigt haben.

Wenn die Funktionen unterschiedliche Anzahl von Argumenten annehmen können, können Sie die Argumente in eine Liste einfügen und den Entpackoperator verwenden.

args = (1, 2) 
ret_val = operations[operation](*args) 

Dann müssen Sie nur sicherstellen, dass args die entsprechende Anzahl von Argumenten für die jeweilige Operation enthält.

+0

Barmar, gibt es eine Möglichkeit, dass der Aufruf oder die Methoden eine unterschiedliche Anzahl von Argumenten haben, oder MUSS das Gleiche sein? – Victor

+0

Sie können den Entpacker verwenden. – Barmar

0

Das Wörterbuch enthält aufrufbare Funktionen. Um sie aufzurufen, fügen Sie einfach die Argumente in Klammern hinzu.

operations[operation](arg1, ...) 
0

Also, die Hauptsache, die Sie vermissen, ist die Ausführung des Funktionsaufrufs. Der bereitgestellte Code packt die Funktionsreferenz richtig, aber Sie benötigen Parens, um sie auszuführen.

Sobald Sie es ausführen, benötigen Sie eine Möglichkeit, Argumente zu übergeben. Da die Anzahl der Argumente je nach Funktion variiert, besteht der beste Weg darin, sowohl eine variable Anzahl von Argumentenlisten (*args) als auch ein Wörterbuch mit Schlüsselwortargumenten (**kwargs) zu übergeben.

ich in Ihrem Pseudo-Code gefüllt haben etwas so diesen Lauf:

def add(first, second): 
    return first + second 

def sub(first, second): 
    return first - second 

operations = { 
    "Add": add, 
    "Sub": sub, 
} 

Anruf mit args hinzufügen:

op = 'Add' 
op_args = [1, 2] 
op_kwargs = {} 
ret_val = operations[operation](*op_args, **op_kwargs) 
print(ret_val) 

3

Anruf mit kwargs hinzufügen:

op = 'Add' 
op_args = [] 
op_kwargs = {'first': 3, 'second': 4} 
ret_val = operations[operation](*op_args, **op_kwargs) 
print(ret_val) 

7

Wenn Sie versuchen, beide args und kwargs in einem widersprüchlichen Weg zu passieren, wird es scheitern:

# WON'T WORK 
op = 'Add' 
op_args = [1, 2] 
op_kwargs = {'first': 3, 'second': 4} 
ret_val = operations[operation](*op_args, **op_kwargs) 
print(ret_val) 

TypeError: add() got multiple values for argument 'first'

Aber Sie können sowohl in komplementärer Weise verwenden:

op = 'Add' 
op_args = [1] 
op_kwargs = {'second': 4} 
ret_val = operations[operation](*op_args, **op_kwargs) 
print(ret_val) 

5

Eine technische Anmerkung ist, dass die Benennung args und kwargs in Python rein konventionell ist. Du könntest sie nennen, was immer du willst. Eine Antwort, die die beiden mehr diskutiert, ist hier verfügbar: https://stackoverflow.com/a/36908/149428.

Beachten Sie, dass ich keine Eingabeüberprüfung usw. für den Zweck einer einfachen, fokussierten Antwort durchgeführt habe. Wenn Sie Eingaben von einem Benutzer erhalten, ist dies ein wichtiger Schritt, an den Sie sich erinnern sollten.

Verwandte Themen