Wie finde ich die Anzahl der Argumente einer Python-Funktion? Ich muss wissen, wie viele normale Argumente es hat und wie viele benannte Argumente.
Beispiel:
def someMethod(self, arg1, kwarg1=None):
pass
Diese Methode hat 2 Argumente und 1 benanntes Argument.
inspect
Standardbibliotheksmodul.inspect
Modul hat viele andere Funktionen, daher ist es unfair zu sagen, dass das gesamte Modul ungerechtfertigt wäre, wenn eine bestimmte Funktion darin wäre. Darüber hinaus ist leicht zu erkennen, wie diese Funktion schlecht genutzt werden kann. (Siehe stackoverflow.com/questions/741950 ). Das heißt, es ist eine nützliche Funktion, insbesondere zum Schreiben von Dekorateuren und anderen Funktionen, die mit Funktionen arbeiten.Antworten:
Die zuvor akzeptierte Antwort ist ab dem
Python 3.0
. Anstatt zu verwendeninspect.getargspec
, sollten Sie sich jetzt für das entscheidenSignature
Klasse entscheiden, die sie ersetzt hat.Das Erstellen einer Signatur für die Funktion ist über die
signature
Funktion einfach :Jetzt können Sie entweder die Parameter schnell anzeigen, indem Sie
str
Folgendes eingeben:oder Sie können auch eine Zuordnung von Attributnamen zu Parameterobjekten über erhalten
sig.parameters
.Darüber hinaus können Sie rufen
len
an ,sig.parameters
um auch die Anzahl der Argumente zu sehen diese Funktion erfordert:Jeder Eintrag in der
params
Zuordnung ist tatsächlich einParameter
Objekt mit weiteren Attributen, die Ihnen das Leben erleichtern. Das Abrufen eines Parameters und das Anzeigen seines Standardwerts können jetzt problemlos durchgeführt werden mit:ähnlich für den Rest der Objekte in
parameters
.Python-
2.x
Benutzer sind zwarinspect.getargspec
nicht veraltet, aber die Sprache wird bald lauten :-). DieSignature
Klasse ist nicht in der2.x
Serie verfügbar und wird es auch nicht sein. Sie müssen also noch mit arbeiteninspect.getargspec
.Wenn Sie für den Übergang zwischen Python 2 und 3 Code haben, der auf der Schnittstelle von
getargspec
in Python 2 basiert, und der Wechsel zusignature
in3
zu schwierig ist, haben Sie die wertvolle Option, ihn zu verwendeninspect.getfullargspec
. Es bietet eine ähnliche Schnittstelle wiegetargspec
(ein einzelnes aufrufbares Argument), um die Argumente einer Funktion zu erfassen und gleichzeitig einige zusätzliche Fälle zu behandeln, diegetargspec
dies nicht tun:Wie bei
getargspec
,getfullargspec
kehrt ein ,NamedTuple
welche die Argumente enthält.quelle
co_argcount
Attribut)getfullargspec
ist nicht in Python 2.x implementiert, müssen Sie verwendengetargspec
getargspec
funktioniert nicht mit eingebauten Funktionen:getargspec(open)
gibtTypeError: <built-in function open> is not a Python function
Siehe diese Antwort für einige Ideen ...print(args)
bekommendefaults=(None,)
Sie nicht , wenn Sie es tundefaults=None
.Siehe das Inspektionsmodul
quelle
inspect.signature
- docs.python.org/3/library/inspect.html#inspect.signatureoder wenn der aktuelle Funktionsname unbestimmt ist:
quelle
dir(someMethod)
->'func_code'
; Gehen Sie weiter:dir(someMethod.func_code)
->'co_argcount'
; Mit der integrierten Funktion können Siedir()
die verfügbaren Methoden eines Objekts ermitteln.six.get_function_code(someMethod).co_argcount
some_method.__code__.co_argcount
co_argcount
wird intern während der Auswertung des Codeobjekts verwendet. Ich versuche zu sagen, dass es wirklich keine Garantie dafür gibt, dass sich diese Attribute nicht von einer Version zur anderen ändern.inspect.getargspec ()
Siehe can-you-Liste-the-Schlüsselwort-Argumente-a-Python-Funktion-empfängt .
quelle
Außerdem habe ich gesehen, dass die Funktion help () meistens wirklich hilft
Zum Beispiel gibt es alle Details zu den Argumenten, die es braucht.
gibt das unten
quelle
help
Funktion zeigt nur, was die Dokumentzeichenfolge sagt. Haben Sie sogar getestet, ob es mit der Funktionsdefinition in der Frage funktioniert?help()
spuckt mehr als nur die Dokumentzeichenfolge aus - selbst bei undokumentiertem Code wird die Argspec immer noch ausgedruckt und es wird angezeigt, wo der Code definiert wurde. Der Person, die die ursprüngliche Frage gestellt hat, war nicht klar, ob sie eine maschinen- oder menschenfreundliche Antwort benötigte. Wenn es nur menschenfreundlich sein muss,help()
ist es vollkommen ausreichend.help()
zurückgibt, und versuchen, das findenargs
undkwargs
.Gute Nachrichten für Leute, die dies auf tragbare Weise zwischen Python 2 und Python 3.6+ tun möchten: Verwenden Sie die
inspect.getfullargspec()
Methode. Es funktioniert sowohl in Python 2.x als auch in 3.6+Wie Jim Fasarakis Hilliard und andere betont haben, war es früher so:
1. In Python 2.x: Verwenden Sie
inspect.getargspec()
2. In Python 3.x: Verwenden Sie die Signatur, da
getargspec()
undgetfullargspec()
waren veraltet.Mit Python 3.6 (auf vielfachen Wunsch?) Haben sich die Dinge jedoch in Richtung besser geändert:
Auf der Python 3- Dokumentationsseite :
quelle
inspect.getargspec (), um Ihre Anforderungen zu erfüllen
quelle
Wie andere Antworten vermuten lassen,
getargspec
funktioniert es gut, solange das abgefragte Objekt tatsächlich eine Funktion ist. Es ist nicht für Arbeit Einbau- Funktionen wieopen
,len
usw., und eine Ausnahme in solchen Fällen werfen:Die folgende Funktion (inspiriert von dieser Antwort ) zeigt eine Problemumgehung. Es gibt die Anzahl der Argumente zurück, die erwartet werden von
f
:Die Idee ist, die Funktionsspezifikation aus der
__doc__
Zeichenfolge heraus zu analysieren . Offensichtlich hängt dies vom Format der Zeichenfolge ab und ist daher kaum robust!quelle
func.__code__.co_argcount
gibt Ihnen Anzahl von irgendwelchen Argumenten VOR*args
func.__kwdefaults__
gibt Ihnen ein Diktat der Schlüsselwortargumente NACH*args
func.__code__.co_kwonlyargcount
entsprichtlen(func.__kwdefaults__)
func.__defaults__
gibt Ihnen die Werte der optionalen Argumente an , die zuvor angezeigt wurden*args
Hier ist die einfache Illustration:
quelle
Im:
Aus:
Hinweis: Wenn xyz nicht in Klasse X wäre und kein "Selbst" und nur "a, b, c" hätte, hätte es 3 gedruckt.
Für Python unter 3.5 möchten Sie möglicherweise im obigen Code
inspect.getfullargspec
durch ersetzeninspect.getargspec
.quelle