Funktionssignatur erhalten
-
Verwenden Sie
signature()
, um Funktionsaufrufdetails in Python abzurufen - Verwenden Sie Decorators, um Funktionsaufrufdetails in Python abzurufen
In diesem Tutorial werden einige Methoden zum schnellen Abrufen von Funktionsaufrufdetails mit Python erläutert. Dies ist besonders nützlich, wenn eine große Codebasis analysiert wird und es schwierig wird, auf einen Blick herauszufinden, was eine Funktion tut.
Anstatt durch den Code hin und her zu gehen, haben wir intelligentere Lösungen für genau dieses Problem, indem wir signature()
-Funktionen und Dekoratoren verwenden.
Verwenden Sie signature()
, um Funktionsaufrufdetails in Python abzurufen
Der einfachste Weg, diese Informationen zu erhalten, ist die Verwendung der Funktion inspect.signature()
. Das Dokument für Python 3.5+ empfiehlt die Verwendung dieser Funktion.
inspect.signature()
akzeptiert eine Vielzahl von Callables. Dazu gehören Funktionen, Klassen und functools.partial()
-Objekte.
Die Funktion gibt die Annotation des Callable zurück. Kann keine Signatur geliefert werden, löst die Funktion einen ValueError
aus; wenn der Objekttyp nicht unterstützt wird, löst es einen TypeError
aus.
Beispielcode:
import inspect
def foo(x, y, a="anything"):
pass
print(inspect.signature(foo))
Es sollte Folgendes auf Ihrem Terminal ausgeben.
(x, y, a="anything")
Verwenden Sie Decorators, um Funktionsaufrufdetails in Python abzurufen
Funktionen in Python haben einige Attribute, die wir verwenden können. Zu diesen Attributen gehört __code__
.
Das Attribut __code__
hat weitere Attribute, die wir verwenden können. Unten finden Sie jede von ihnen aufgelistet und erklärt, was sie tun.
Darunter fügen wir ein Code-Snippet ein, um Ihre Funktion zu schreiben, die diese Aufgabe ausführen kann. Wir verwenden das Attribut __name__
, um den Funktionsnamen zu erhalten.
-
co_varnames
gibt ein Tupel der Namen der an die Funktion übergebenen Argumente und der innerhalb der Funktion verwendeten lokalen Variablen zurück. -
co_argcount
gibt die Anzahl der Argumente zurück. Diese Zählung schließt jedoch die Nur-Schlüsselwort-Argumente (kwargs
),*args
und**args
aus.Wir haben eine Möglichkeit hinzugefügt, all diese Argumente in unser Snippet zu drucken.
def get_func_dets(func):
# the point of using argcount is to ensure we only get
argument_names = func.__code__.co_varnames[: func.__code__.co_argcount]
func_name = func.__name__
# getting variable length arguments and keyword arguments
def inner_fun(*args, **kwargs):
print(func_name, "(", end="")
print(
", ".join(
"%s = %r" % ent
for ent in zip(argument_names, args[: len(argument_names)])
),
end=", ",
)
print("args = ", list(args[len(argument_names) :]), end=",")
print("kwargs =", kwargs, end="")
print(")")
return inner_func
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn