Angesichts der Python-Funktion:
def a_method(arg1, arg2):
pass
Wie kann ich die Anzahl und Namen der Argumente extrahieren? Dh, da ich einen Verweis auf habe func
, möchte ich, dass der func.[something]
zurückkehrt ("arg1", "arg2")
.
Das Verwendungsszenario hierfür ist, dass ich einen Dekorator habe und die Methodenargumente in derselben Reihenfolge verwenden möchte, in der sie für die eigentliche Funktion als Schlüssel angezeigt werden. Dh wie würde der Dekorateur so gedruckt aussehen, "a,b"
wenn ich anrufe a_method("a", "b")
?
Antworten:
Schauen Sie sich das
inspect
Modul an - dies führt die Überprüfung der verschiedenen Codeobjekteigenschaften für Sie durch.Die anderen Ergebnisse sind der Name der Variablen * args und ** kwargs sowie die angegebenen Standardeinstellungen. dh.
Beachten Sie, dass einige Callables in bestimmten Implementierungen von Python möglicherweise nicht nachvollziehbar sind. In CPython stellen beispielsweise einige in C definierte integrierte Funktionen keine Metadaten zu ihren Argumenten bereit. Als Ergebnis erhalten Sie eine,
ValueError
wenn Sieinspect.getfullargspec()
eine integrierte Funktion verwenden.Seit Python 3.3 können Sie die
inspect.signature()
Aufrufsignatur eines aufrufbaren Objekts anzeigen:quelle
(4,)
dem Schlüsselwortparameter entsprichtc
?inspect.getargspec
ist veraltet , aber der Ersatz istinspect.getfullargspec
.In CPython beträgt die Anzahl der Argumente
und ihre Namen stehen am Anfang von
Dies sind Implementierungsdetails von CPython, daher funktioniert dies wahrscheinlich nicht in anderen Implementierungen von Python, wie z. B. IronPython und Jython.
Eine tragbare Möglichkeit, "Pass-Through" -Argumente zuzulassen, besteht darin, Ihre Funktion mit der Signatur zu definieren
func(*args, **kwargs)
. Dies wird häufig in matplotlib verwendet , wo die äußere API-Schicht viele Schlüsselwortargumente an die untergeordnete API übergibt.quelle
*args
, zB:def foo(x, *args, y, **kwargs): # foo.__code__.co_argcount == 1
In einer Dekorationsmethode können Sie Argumente der ursprünglichen Methode folgendermaßen auflisten:
Wenn die
**kwargs
für Sie wichtig sind, wird es etwas kompliziert:Beispiel:
quelle
Ich denke, was Sie suchen, ist die Methode der Einheimischen -
quelle
Die Python 3-Version ist:
Die Methode gibt ein Wörterbuch zurück, das sowohl args als auch kwargs enthält.
quelle
[:fn.__code__.co_argcount]
sehr wichtig ist, wenn Sie nach Funktionsargumenten suchen. Andernfalls enthält es auch Namen, die innerhalb der Funktion erstellt wurden.Hier ist etwas, von dem ich denke, dass es mit einem Dekorateur für das funktioniert, was Sie wollen.
Führen Sie es aus, es wird die folgende Ausgabe erhalten:
quelle
Python 3.5+:
Also vorher:
Jetzt:
Zu testen:
Da wir die Funktion 'function' haben, die das Argument 'arg' annimmt, wird dies als True bewertet, andernfalls als False.
Beispiel aus der Python-Konsole:
quelle
In Python 3. + mit dem
Signature
vorliegenden Objekt können Sie mithilfe der Signaturmethode auf einfache Weise eine Zuordnung zwischen Argumentnamen und Wertenbind()
ermitteln.Hier ist zum Beispiel ein Dekorateur zum Drucken einer Karte wie folgt:
quelle
Hier ist eine andere Möglichkeit, die Funktionsparameter ohne Verwendung eines Moduls abzurufen.
Ausgabe:
quelle
Gibt eine Liste mit Argumentnamen zurück, kümmert sich um Teilfunktionen und reguläre Funktionen:
quelle
Update für Brians Antwort :
Wenn eine Funktion in Python 3 nur Schlüsselwortargumente enthält, müssen Sie Folgendes verwenden
inspect.getfullargspec
:ergibt dies:
quelle
In Python 3 ist unten zu machen
*args
und**kwargs
zu einemdict
(verwenden SieOrderedDict
für Python <3.6, umdict
Ordnungen zu pflegen ):quelle
inspect.signature
ist sehr langsam. Der schnellste Weg istquelle
Um Brians Antwort ein wenig zu aktualisieren , gibt es jetzt einen schönen Backport
inspect.signature
, den Sie in älteren Python-Versionen verwenden können :funcsigs
. Also würde meine persönliche Präferenz gehenWenn Sie zum Spaß mit
Signature
Objekten spielen und sogar Funktionen mit zufälligen Signaturen dynamisch erstellen möchten, können Sie sich meinmakefun
Projekt ansehen .quelle
Was ist mit
dir()
undvars()
jetzt?Scheint genau das zu tun, was super einfach gefragt wird ...
Muss aus dem Funktionsumfang heraus aufgerufen werden.
Aber seien Sie vorsichtig, dass es alles zurückgeben wird lokalen Variablen zurückgegeben werden. Führen Sie dies bei Bedarf am Anfang der Funktion aus.
Beachten Sie auch, dass dies, wie in den Kommentaren ausgeführt, nicht von außerhalb des Bereichs möglich ist. Also nicht genau das OP-Szenario, passt aber trotzdem zum Fragentitel. Daher meine Antwort.
quelle