Funktionssignatur erhalten

Muhammad Husnain 21 Juni 2023
  1. Verwenden Sie signature(), um Funktionsaufrufdetails in Python abzurufen
  2. Verwenden Sie Decorators, um Funktionsaufrufdetails in Python abzurufen
Funktionssignatur erhalten

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.

  1. co_varnames gibt ein Tupel der Namen der an die Funktion übergebenen Argumente und der innerhalb der Funktion verwendeten lokalen Variablen zurück.

  2. 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
Muhammad Husnain avatar Muhammad Husnain avatar

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

Verwandter Artikel - Python Function