Ich versuche, eine Funktion in einer anderen Funktion in Python aufzurufen, finde aber nicht die richtige Syntax. Was ich tun möchte, ist ungefähr so:
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])
In diesem Fall funktioniert der erste Anruf und der zweite nicht. Was ich ändern möchte, ist die Wrapper-Funktion und nicht die aufgerufenen Funktionen.
def wrapper(func, *args)
ist das, wasmethod(params object[] args)
in C # steht.*args
dies das letzte Argument in der Funktionsdefinition sein muss.The * next to args means "take the rest of the parameters given and put them in a list called args".
Es bringt sie in ein Tupel, nicht in eine Liste.Der einfachste Weg, eine Funktion zu verpacken
... besteht darin, manuell einen Wrapper zu schreiben, der func () in sich selbst aufruft :
In Python ist die Funktion ein Objekt, sodass Sie den Namen als Argument einer anderen Funktion übergeben und zurückgeben können. Sie können auch einen Wrapper-Generator für jede Funktion anyFunc () schreiben :
Beachten Sie auch, dass Sie in Python, wenn Sie nicht alle Argumente einer Funktion kennen oder nicht benennen möchten, auf ein Tupel von Argumenten verweisen können, das durch seinen Namen gekennzeichnet ist, gefolgt von einem Sternchen in den Klammern danach der Funktionsname:
Sie können beispielsweise eine Funktion definieren, die eine beliebige Anzahl von Argumenten akzeptiert:
Python bietet noch weitere Manipulationen an Funktionsargumenten. Sie können einer Funktion erlauben, Schlüsselwortargumente anzunehmen. Innerhalb des Funktionskörpers werden die Schlüsselwortargumente in einem Wörterbuch gespeichert. In den Klammern nach dem Funktionsnamen wird dieses Wörterbuch durch zwei Sternchen gefolgt vom Namen des Wörterbuchs gekennzeichnet:
Ein ähnliches Beispiel, das das Schlüsselwortargument-Wörterbuch druckt:
quelle
Sie können die Syntax * args und ** kwargs für Argumente variabler Länge verwenden.
Was bedeuten * args und ** kwargs?
Und aus dem offiziellen Python-Tutorial
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
quelle
Die wörtliche Antwort auf Ihre Frage (um genau das zu tun, was Sie gefragt haben, ändern Sie nur den Wrapper, nicht die Funktionen oder die Funktionsaufrufe) besteht einfach darin, die Zeile zu ändern
lesen
Dies weist Python an, die angegebene Liste (in diesem Fall
args
) zu übernehmen und ihren Inhalt als Positionsargumente an die Funktion zu übergeben.Dieser Trick funktioniert auf beiden "Seiten" des Funktionsaufrufs, sodass eine Funktion wie folgt definiert ist:
wäre in der Lage, so viele Positionsargumente zu akzeptieren, wie Sie darauf werfen, und sie alle in eine Liste mit dem Namen zu setzen
args
.Ich hoffe, das hilft, die Dinge ein wenig zu klären. Beachten Sie, dass dies alles auch mit dicts / keyword-Argumenten möglich ist, indem Sie
**
anstelle von verwenden*
.quelle
Sie müssen Argumente zum Entpacken verwenden.
quelle
Eine kleine Ergänzung zu früheren Antworten, da ich keine Lösung für ein Problem finden konnte, die es nicht wert ist, eine neue Frage zu stellen, sondern mich hierher geführt hat.
Hier ist ein kleiner Code - Schnipsel, die kombiniert
lists
,zip()
und*args
eine Umhüllung zu schaffen , die mit einer unbekannten Menge von Funktionen mit einer unbekannten Menge von Argumenten umgehen kann.Beachten Sie, dass
zip()
dies keine Sicherheitsüberprüfung für Listen mit ungleicher Länge bietet. Siehe Zip-Iteratoren, die für die gleiche Länge in Python angeben .quelle