inspect — Live-Objekte untersuchen

Quellcode: Lib/inspect.py


Das Modul inspect stellt mehrere nützliche Funktionen zur Verfügung, um Informationen über Live-Objekte wie Module, Klassen, Methoden, Funktionen, Tracebacks, Frame-Objekte und Code-Objekte zu erhalten. Zum Beispiel kann es Ihnen helfen, den Inhalt einer Klasse zu untersuchen, den Quellcode einer Methode abzurufen, die Argumentenliste für eine Funktion zu extrahieren und zu formatieren oder alle notwendigen Informationen für die Anzeige eines detaillierten Tracebacks zu erhalten.

Es gibt vier Hauptarten von Diensten, die dieses Modul anbietet: Typüberprüfung, Quellcodeabruf, Untersuchung von Klassen und Funktionen sowie die Analyse des Interpreter-Stacks.

Typen und Member

Die Funktion inspect.getmembers() ruft die Member eines Objekts wie einer Klasse oder eines Moduls ab. Die Funktionen, deren Namen mit "is" beginnen, sind hauptsächlich als praktische Auswahl für das zweite Argument von inspect.getmembers() vorgesehen. Sie helfen Ihnen auch zu bestimmen, wann Sie die folgenden speziellen Attribute finden können (siehe Importbezogene Attribute von Modulobjekten für Modulattribute)

Typ

Attribut

Beschreibung

Klasse

__doc__

documentation string

__name__

Name, unter dem diese Klasse definiert wurde

__qualname__

qualifizierter Name

__module__

Name des Moduls, in dem diese Klasse definiert wurde

__type_params__

Ein Tupel, das die Typ-Parameter einer generischen Klasse enthält

Methode

__doc__

documentation string

__name__

Name, unter dem diese Methode definiert wurde

__qualname__

qualifizierter Name

__func__

Funktionsobjekt, das die Implementierung der Methode enthält

__self__

Instanz, an die diese Methode gebunden ist, oder None

__module__

Name des Moduls, in dem diese Methode definiert wurde

Funktion

__doc__

documentation string

__name__

Name, unter dem diese Funktion definiert wurde

__qualname__

qualifizierter Name

__code__

Code-Objekt, das den kompilierten Funktions-Bytecode enthält

__defaults__

Tupel aller Standardwerte für positionelle oder Schlüsselwortparameter

__kwdefaults__

Mapping aller Standardwerte für nur-Schlüsselwortparameter

__globals__

Globaler Namensraum, in dem diese Funktion definiert wurde

__builtins__

Builtins-Namensraum

__annotations__

Mapping von Parameternamen zu Annotationen; der Schlüssel "return" ist für Rückgabeannotationen reserviert.

__type_params__

Ein Tupel, das die Typ-Parameter einer generischen Funktion enthält

__module__

Name des Moduls, in dem diese Funktion definiert wurde

traceback

tb_frame

Frame-Objekt auf dieser Ebene

tb_lasti

Index der zuletzt versuchten Anweisung im Bytecode

tb_lineno

Aktuelle Zeilennummer im Python-Quellcode

tb_next

Nächstes inneres Traceback-Objekt (aufgerufen von dieser Ebene)

frame

f_back

Nächstes äußeres Frame-Objekt (Aufrufer dieses Frames)

f_builtins

Builtins-Namensraum, der von diesem Frame gesehen wird

f_code

Code-Objekt, das in diesem Frame ausgeführt wird

f_globals

Globaler Namensraum, der von diesem Frame gesehen wird

f_lasti

Index der zuletzt versuchten Anweisung im Bytecode

f_lineno

Aktuelle Zeilennummer im Python-Quellcode

f_locals

Lokaler Namensraum, der von diesem Frame gesehen wird

f_generator

Gibt das Generator- oder Coroutine-Objekt zurück, dem dieser Frame gehört, oder None, wenn der Frame einer regulären Funktion angehört

f_trace

Trace-Funktion für diesen Frame oder None

f_trace_lines

Gibt an, ob ein Trace-Ereignis für jede Quellcodezeile ausgelöst wird

f_trace_opcodes

Gibt an, ob pro Opcode Ereignisse angefordert werden

clear()

Wird verwendet, um alle Referenzen auf lokale Variablen zu löschen

code

co_argcount

Anzahl der Argumente (ohne nur-Schlüsselwortargumente, \* oder \*\* args)

co_code

String mit rohem kompiliertem Bytecode

co_cellvars

Tupel der Namen von Zellvariablen (referenziert von enthaltenden Scopes)

co_consts

Tupel der Konstanten, die im Bytecode verwendet werden

co_filename

Name der Datei, in der dieses Code-Objekt erstellt wurde

co_firstlineno

Nummer der ersten Zeile im Python-Quellcode

co_flags

Bitmap von CO_* Flags, weitere Informationen hier: hier

co_lnotab

Kodierte Zuordnung von Zeilennummern zu Bytecode-Indizes

co_freevars

Tupel der Namen von freien Variablen (referenziert über die Closure einer Funktion)

co_posonlyargcount

Anzahl der nur positionellen Argumente

co_kwonlyargcount

Anzahl der nur Schlüsselwortargumente (ohne \*\* arg)

co_name

Name, unter dem dieses Code-Objekt definiert wurde

co_qualname

Vollqualifizierter Name, unter dem dieses Code-Objekt definiert wurde

co_names

Tupel von Namen außer Argumenten und lokalen Funktionsvariablen

co_nlocals

Anzahl der lokalen Variablen

co_stacksize

Erforderlicher Stack-Speicher für die virtuelle Maschine

co_varnames

Tupel der Namen von Argumenten und lokalen Variablen

co_lines()

Gibt einen Iterator zurück, der aufeinanderfolgende Bytecode-Bereiche liefert

co_positions()

Gibt einen Iterator von Quellcode-Positionen für jede Bytecode-Anweisung zurück

replace()

Gibt eine Kopie des Code-Objekts mit neuen Werten zurück

generator

__name__

Name

__qualname__

qualifizierter Name

gi_frame

frame

gi_running

Läuft der Generator?

gi_suspended

Ist der Generator ausgesetzt?

gi_code

code

gi_yieldfrom

Objekt, das gerade von yield from iteriert wird, oder None

Asynchroner Generator

__name__

Name

__qualname__

qualifizierter Name

ag_await

Auf welches Objekt wird gewartet, oder None

ag_frame

frame

ag_running

Läuft der Generator?

ag_code

code

Coroutine

__name__

Name

__qualname__

qualifizierter Name

cr_await

Auf welches Objekt wird gewartet, oder None

cr_frame

frame

cr_running

Läuft die Coroutine?

cr_code

code

cr_origin

Wo die Coroutine erstellt wurde, oder None. Siehe sys.set_coroutine_origin_tracking_depth()

Builtin

__doc__

documentation string

__name__

Ursprünglicher Name dieser Funktion oder Methode

__qualname__

qualifizierter Name

__self__

Instanz, an die eine Methode gebunden ist, oder None

Geändert in Version 3.5: Hinzufügen der Attribute __qualname__ und gi_yieldfrom zu Generatoren.

Das Attribut __name__ von Generatoren wird nun aus dem Funktionsnamen anstelle des Codenamens gesetzt und kann nun geändert werden.

Geändert in Version 3.7: Hinzufügen des Attributs cr_origin zu Coroutinen.

Geändert in Version 3.10: Hinzufügen des Attributs __builtins__ zu Funktionen.

Geändert in Version 3.14: Hinzufügen des Attributs f_generator zu Frames.

inspect.getmembers(object[, predicate])

Gibt alle Member eines Objekts als Liste von Tupeln (name, value) zurück, sortiert nach Namen. Wenn das optionale Argument predicate - das mit dem value -Objekt jedes Members aufgerufen wird - angegeben ist, werden nur Member eingeschlossen, für die das Prädikat einen wahren Wert zurückgibt.

Hinweis

getmembers() gibt nur Klassenattribute zurück, die in der Metaklasse definiert sind, wenn das Argument eine Klasse ist und diese Attribute in der benutzerdefinierten __dir__() der Metaklasse aufgeführt wurden.

inspect.getmembers_static(object[, predicate])

Gibt alle Member eines Objekts als Liste von Tupeln (name, value) zurück, sortiert nach Namen, ohne die dynamische Suche über das Deskriptor-Protokoll, \_\_getattr\_\_ oder \_\_getattribute\_\_ auszulösen. Optional werden nur Member zurückgegeben, die ein gegebenes Prädikat erfüllen.

Hinweis

getmembers_static() kann möglicherweise nicht alle Member abrufen, die getmembers abrufen kann (z. B. dynamisch erstellte Attribute) und kann Member finden, die getmembers nicht finden kann (z. B. Deskriptoren, die AttributeError auslösen). In einigen Fällen kann es auch Deskriptorobjekte anstelle von Instanzmembern zurückgeben.

Hinzugefügt in Version 3.11.

inspect.getmodulename(path)

Gibt den Namen des durch die Datei path benannten Moduls zurück, ohne die Namen der übergeordneten Pakete einzuschließen. Die Dateierweiterung wird mit allen Einträgen in importlib.machinery.all_suffixes() verglichen. Wenn sie übereinstimmt, wird die letzte Komponente des Pfades mit entfernten Erweiterung zurückgegeben. Andernfalls wird None zurückgegeben.

Beachten Sie, dass diese Funktion nur einen aussagekräftigen Namen für tatsächliche Python-Module zurückgibt – Pfade, die potenziell auf Python-Pakete verweisen, geben weiterhin None zurück.

Geändert in Version 3.3: Die Funktion basiert direkt auf importlib.

inspect.ismodule(object)

Gibt True zurück, wenn das Objekt ein Modul ist.

inspect.isclass(object)

Gibt True zurück, wenn das Objekt eine Klasse ist, sei es eine eingebaute oder eine in Python-Code erstellte.

inspect.ismethod(object)

Gibt True zurück, wenn das Objekt eine gebundene Methode ist, die in Python geschrieben wurde.

inspect.ispackage(object)

Gibt True zurück, wenn das Objekt ein Paket ist.

Hinzugefügt in Version 3.14.

inspect.isfunction(object)

Gibt True zurück, wenn das Objekt eine Python-Funktion ist, was auch Funktionen einschließt, die durch einen Lambda-Ausdruck erstellt wurden.

inspect.isgeneratorfunction(object)

Gibt True zurück, wenn das Objekt eine Python-Generatorfunktion ist.

Geändert in Version 3.8: Funktionen, die in functools.partial() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Python-Generatorfunktion ist.

Geändert in Version 3.13: Funktionen, die in functools.partialmethod() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Python-Generatorfunktion ist.

inspect.isgenerator(object)

Gibt True zurück, wenn das Objekt ein Generator ist.

inspect.iscoroutinefunction(object)

Gibt True zurück, wenn das Objekt eine Coroutine-Funktion ist (eine Funktion, die mit der async def-Syntax definiert wurde), eine functools.partial(), die eine Coroutine-Funktion umschließt, oder eine synchrone Funktion, die mit inspect.markcoroutinefunction() markiert ist.

Hinzugefügt in Version 3.5.

Geändert in Version 3.8: Funktionen, die in functools.partial() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Coroutine-Funktion ist.

Geändert in Version 3.12: Synchrone Funktionen, die mit inspect.markcoroutinefunction() markiert sind, geben nun True zurück.

Geändert in Version 3.13: Funktionen, die in functools.partialmethod() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Coroutine-Funktion ist.

inspect.markcoroutinefunction(func)

Dekorator, um ein aufrufbares Objekt als Coroutine-Funktion zu markieren, falls es sonst nicht von inspect.iscoroutinefunction() erkannt würde.

Dies kann für synchrone Funktionen nützlich sein, die eine Coroutine zurückgeben, wenn die Funktion an eine API übergeben wird, die inspect.iscoroutinefunction() erwartet.

Wenn möglich, ist die Verwendung einer async def-Funktion vorzuziehen. Ebenso akzeptabel ist das Aufrufen der Funktion und das Testen des Rückgabewerts mit inspect.iscoroutine().

Hinzugefügt in Version 3.12.

inspect.iscoroutine(object)

Gibt True zurück, wenn das Objekt eine Coroutine ist, die von einer async def-Funktion erstellt wurde.

Hinzugefügt in Version 3.5.

inspect.isawaitable(object)

Gibt True zurück, wenn das Objekt in einem await-Ausdruck verwendet werden kann.

Kann auch verwendet werden, um Generator-basierte Coroutinen von regulären Generatoren zu unterscheiden

import types

def gen():
    yield
@types.coroutine
def gen_coro():
    yield

assert not isawaitable(gen())
assert isawaitable(gen_coro())

Hinzugefügt in Version 3.5.

inspect.isasyncgenfunction(object)

Gibt True zurück, wenn das Objekt eine Funktion für asynchrone Generatoren ist, zum Beispiel

>>> async def agen():
...     yield 1
...
>>> inspect.isasyncgenfunction(agen)
True

Hinzugefügt in Version 3.6.

Geändert in Version 3.8: Funktionen, die in functools.partial() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Funktion für asynchrone Generatoren ist.

Geändert in Version 3.13: Funktionen, die in functools.partialmethod() verpackt sind, geben nun True zurück, wenn die verpackte Funktion eine Coroutine-Funktion ist.

inspect.isasyncgen(object)

Gibt True zurück, wenn das Objekt ein Iterator für asynchrone Generatoren ist, der von einer Funktion für asynchrone Generatoren erstellt wurde.

Hinzugefügt in Version 3.6.

inspect.istraceback(object)

Gibt True zurück, wenn das Objekt ein Traceback ist.

inspect.isframe(object)

Gibt True zurück, wenn das Objekt ein Frame ist.

inspect.iscode(object)

Gibt True zurück, wenn das Objekt ein Code ist.

inspect.isbuiltin(object)

Gibt True zurück, wenn das Objekt eine eingebaute Funktion oder eine gebundene eingebaute Methode ist.

inspect.ismethodwrapper(object)

Gibt True zurück, wenn der Typ des Objekts ein MethodWrapperType ist.

Dies sind Instanzen von MethodWrapperType, wie z. B. __str__(), __eq__() und __repr__().

Hinzugefügt in Version 3.11.

inspect.isroutine(object)

Gibt True zurück, wenn das Objekt eine benutzerdefinierte oder eingebaute Funktion oder Methode ist.

inspect.isabstract(object)

Gibt True zurück, wenn das Objekt eine abstrakte Basisklasse ist.

inspect.ismethoddescriptor(object)

Gibt True zurück, wenn das Objekt ein Methoden-Deskriptor ist, aber nicht, wenn ismethod(), isclass(), isfunction() oder isbuiltin() wahr sind.

Dies trifft zum Beispiel auf int.__add__ zu. Ein Objekt, das diesen Test besteht, hat eine __get__()-Methode, aber keine __set__()-Methode oder eine __delete__()-Methode. Darüber hinaus variiert die Menge der Attribute. Ein __name__-Attribut ist normalerweise sinnvoll, und __doc__ ist es oft.

Methoden, die über Deskriptoren implementiert sind und auch einen der anderen Tests bestehen, geben False vom ismethoddescriptor()-Test zurück, einfach weil die anderen Tests mehr versprechen – Sie können zum Beispiel auf das Attribut __func__ (usw.) zählen, wenn ein Objekt ismethod() besteht.

Geändert in Version 3.13: Diese Funktion meldet nicht mehr fälschlicherweise Objekte mit __get__() und __delete__(), aber nicht __set__(), als Methoden-Deskriptoren (solche Objekte sind Daten-Deskriptoren, keine Methoden-Deskriptoren).

inspect.isdatadescriptor(object)

Gibt True zurück, wenn das Objekt ein Daten-Deskriptor ist.

Daten-Deskriptoren haben eine __set__- oder eine __delete__-Methode. Beispiele sind Properties (in Python definiert), Getsets und Member. Letztere beiden sind in C definiert und es gibt spezifischere Tests für diese Typen, die über Python-Implementierungen hinweg robust sind. Typischerweise haben Daten-Deskriptoren auch __name__- und __doc__-Attribute (Properties, Getsets und Member haben beide Attribute), dies ist jedoch nicht garantiert.

inspect.isgetsetdescriptor(object)

Gibt True zurück, wenn das Objekt ein Getset-Deskriptor ist.

CPython Implementierungsdetail: getsets sind Attribute, die in Erweiterungsmodulen über PyGetSetDef-Strukturen definiert sind. Für Python-Implementierungen ohne solche Typen gibt diese Methode immer False zurück.

inspect.ismemberdescriptor(object)

Gibt True zurück, wenn das Objekt ein Member-Deskriptor ist.

CPython Implementierungsdetail: Member-Deskriptoren sind Attribute, die in Erweiterungsmodulen über PyMemberDef-Strukturen definiert sind. Für Python-Implementierungen ohne solche Typen gibt diese Methode immer False zurück.

Abrufen des Quellcodes

inspect.getdoc(object)

Ruft den Dokumentationsstring eines Objekts ab, bereinigt mit cleandoc(). Wenn der Dokumentationsstring für ein Objekt nicht angegeben ist und das Objekt eine Klasse, eine Methode, eine Eigenschaft oder ein Deskriptor ist, wird der Dokumentationsstring aus der Vererbungshierarchie abgerufen. Gibt None zurück, wenn der Dokumentationsstring ungültig oder fehlend ist.

Geändert in Version 3.5: Dokumentationsstrings werden jetzt vererbt, wenn sie nicht überschrieben werden.

inspect.getcomments(object)

Gibt alle Kommentarzeilen, die sich unmittelbar vor dem Quellcode des Objekts befinden (für eine Klasse, Funktion oder Methode) oder am Anfang der Python-Quelldatei (wenn das Objekt ein Modul ist) in einer einzigen Zeichenkette zurück. Wenn der Quellcode des Objekts nicht verfügbar ist, wird None zurückgegeben. Dies kann passieren, wenn das Objekt in C oder in der interaktiven Shell definiert wurde.

inspect.getfile(object)

Gibt den Namen der (Text- oder Binär-)Datei zurück, in der ein Objekt definiert wurde. Dies führt zu einem TypeError, wenn das Objekt ein eingebautes Modul, eine Klasse oder eine Funktion ist.

inspect.getmodule(object)

Versucht zu erraten, in welchem Modul ein Objekt definiert wurde. Gibt None zurück, wenn das Modul nicht bestimmt werden kann.

inspect.getsourcefile(object)

Gibt den Namen der Python-Quelldatei zurück, in der ein Objekt definiert wurde, oder None, wenn kein Weg gefunden werden kann, die Quelle zu erhalten. Dies führt zu einem TypeError, wenn das Objekt ein eingebautes Modul, eine Klasse oder eine Funktion ist.

inspect.getsourcelines(object)

Gibt eine Liste von Quellzeilen und die startende Zeilennummer für ein Objekt zurück. Das Argument kann ein Modul, eine Klasse, eine Methode, eine Funktion, ein Traceback, ein Frame oder ein Codeobjekt sein. Der Quellcode wird als Liste der Zeilen zurückgegeben, die dem Objekt entsprechen, und die Zeilennummer gibt an, wo in der ursprünglichen Quelldatei die erste Codezeile gefunden wurde. Ein OSError wird ausgelöst, wenn der Quellcode nicht abgerufen werden kann. Ein TypeError wird ausgelöst, wenn das Objekt ein eingebautes Modul, eine Klasse oder eine Funktion ist.

Geändert in Version 3.3: OSError wird anstelle von IOError ausgelöst, welches jetzt ein Alias für ersteres ist.

inspect.getsource(object)

Gibt den Quelltext eines Objekts zurück. Das Argument kann ein Modul, eine Klasse, eine Methode, eine Funktion, ein Traceback, ein Frame oder ein Codeobjekt sein. Der Quellcode wird als einzelne Zeichenkette zurückgegeben. Ein OSError wird ausgelöst, wenn der Quellcode nicht abgerufen werden kann. Ein TypeError wird ausgelöst, wenn das Objekt ein eingebautes Modul, eine Klasse oder eine Funktion ist.

Geändert in Version 3.3: OSError wird anstelle von IOError ausgelöst, welches jetzt ein Alias für ersteres ist.

inspect.cleandoc(doc)

Bereinigt die Einrückung von Docstrings, die eingerückt sind, um mit Codeblöcken bündig abzuschließen.

Alle führenden Leerzeichen werden von der ersten Zeile entfernt. Alle führenden Leerzeichen, die gleichmäßig von der zweiten Zeile an entfernt werden können, werden entfernt. Leere Zeilen am Anfang und Ende werden anschließend entfernt. Außerdem werden alle Tabs in Leerzeichen umgewandelt.

Introspektive aufrufbare Objekte mit dem Signatur-Objekt

Hinzugefügt in Version 3.3.

Das Signature-Objekt repräsentiert die Aufrufsignatur eines aufrufbaren Objekts und dessen Rückgabeannotation. Um ein Signature-Objekt abzurufen, verwenden Sie die Funktion signature().

inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)

Gibt ein Signature-Objekt für das gegebene callable zurück

>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
'(a, *, b: int, **kwargs)'

>>> str(sig.parameters['b'])
'b: int'

>>> sig.parameters['b'].annotation
<class 'int'>

Akzeptiert eine breite Palette von Python-aufrufbaren Objekten, von einfachen Funktionen und Klassen bis hin zu functools.partial()-Objekten.

Wenn einige der Annotationen Zeichenketten sind (z. B. weil from __future__ import annotations verwendet wurde), versucht signature(), die Annotationen mithilfe von annotationlib.get_annotations() automatisch zu de-stringifizieren. Die Parameter globals, locals und eval_str werden beim Auflösen der Annotationen an annotationlib.get_annotations() übergeben; siehe die Dokumentation für annotationlib.get_annotations() für Anweisungen zur Verwendung dieser Parameter. Ein Mitglied der annotationlib.Format-Enumeration kann an den Parameter annotation_format übergeben werden, um das Format der zurückgegebenen Annotationen zu steuern. Verwenden Sie beispielsweise annotation_format=annotationlib.Format.STRING, um Annotationen im Zeichenkettenformat zurückzugeben.

Löst ValueError aus, wenn keine Signatur bereitgestellt werden kann, und TypeError, wenn dieser Objekttyp nicht unterstützt wird. Außerdem können die eval()-Aufrufe zum De-stringifizieren der Annotationen in annotationlib.get_annotations(), wenn die Annotationen als Zeichenketten vorliegen und eval_str nicht falsch ist, potenziell jede Art von Ausnahme auslösen.

Ein Schrägstrich (/) in der Signatur einer Funktion zeigt an, dass die Parameter davor Positionsargumente sein müssen. Weitere Informationen finden Sie im FAQ-Eintrag zu Positionsargumenten.

Geändert in Version 3.5: Der Parameter follow_wrapped wurde hinzugefügt. Übergeben Sie False, um speziell die Signatur von callable zu erhalten (callable.__wrapped__ wird nicht verwendet, um dekorierte aufrufbare Objekte zu entpacken).

Geändert in Version 3.10: Die Parameter globals, locals und eval_str wurden hinzugefügt.

Geändert in Version 3.14: Der Parameter annotation_format wurde hinzugefügt.

Hinweis

Einige aufrufbare Objekte sind in bestimmten Implementierungen von Python möglicherweise nicht introspektiv. Zum Beispiel bieten einige in C definierte eingebaute Funktionen in CPython keine Metadaten über ihre Argumente.

CPython Implementierungsdetail: Wenn das übergebene Objekt ein Attribut __signature__ hat, können wir es zur Erstellung der Signatur verwenden. Die genaue Semantik ist ein Implementierungsdetail und unterliegt unangekündigten Änderungen. Konsultieren Sie den Quellcode für die aktuelle Semantik.

class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)

Ein Signature-Objekt repräsentiert die Aufrufsignatur einer Funktion und deren Rückgabeannotation. Für jeden von der Funktion akzeptierten Parameter speichert es ein Parameter-Objekt in seiner parameters-Sammlung.

Das optionale Argument parameters ist eine Sequenz von Parameter-Objekten, die daraufhin geprüft wird, ob keine Parameter mit doppelten Namen vorhanden sind und ob die Parameter in der richtigen Reihenfolge stehen, d. h. zuerst Positionsargumente, dann Positions- oder Schlüsselwortargumente, und dass Parameter mit Standardwerten auf Parameter ohne Standardwerte folgen.

Das optionale Argument return_annotation kann ein beliebiges Python-Objekt sein. Es repräsentiert die „Rückgabe“-Annotation des aufrufbaren Objekts.

Signature-Objekte sind unveränderlich. Verwenden Sie Signature.replace() oder copy.replace(), um eine modifizierte Kopie zu erstellen.

Geändert in Version 3.5: Signature-Objekte sind jetzt pickelbar und hashable.

empty

Ein spezieller Marker auf Klassenebene zur Angabe des Fehlens einer Rückgabeannotation.

parameters

Eine geordnete Abbildung von Parameternamen zu den entsprechenden Parameter-Objekten. Parameter erscheinen in strikter Definitionsreihenfolge, einschließlich Keyword-only-Parametern.

Geändert in Version 3.7: Python garantierte explizit, dass es die Deklarationsreihenfolge von Keyword-only-Parametern ab Version 3.7 beibehielt, obwohl diese Reihenfolge in Python 3 in der Praxis immer beibehalten worden war.

return_annotation

Die „Rückgabe“-Annotation für das aufrufbare Objekt. Wenn das aufrufbare Objekt keine „Rückgabe“-Annotation hat, ist dieses Attribut auf Signature.empty gesetzt.

bind(*args, **kwargs)

Erstellt eine Abbildung von Positions- und Schlüsselwortargumenten zu Parametern. Gibt BoundArguments zurück, wenn *args und **kwargs mit der Signatur übereinstimmen, oder löst einen TypeError aus.

bind_partial(*args, **kwargs)

Funktioniert genauso wie Signature.bind(), erlaubt aber das Weglassen einiger erforderlicher Argumente (ahmt das Verhalten von functools.partial() nach). Gibt BoundArguments zurück oder löst einen TypeError aus, wenn die übergebenen Argumente nicht mit der Signatur übereinstimmen.

replace(*[, parameters][, return_annotation])

Erstellt eine neue Signature-Instanz basierend auf der Instanz, auf der replace() aufgerufen wurde. Es ist möglich, unterschiedliche parameters und/oder return_annotation zu übergeben, um die entsprechenden Eigenschaften der Basis-Signatur zu überschreiben. Um return_annotation aus der kopierten Signature zu entfernen, übergeben Sie Signature.empty.

>>> def test(a, b):
...     pass
...
>>> sig = signature(test)
>>> new_sig = sig.replace(return_annotation="new return anno")
>>> str(new_sig)
"(a, b) -> 'new return anno'"

Signature-Objekte werden auch von der generischen Funktion copy.replace() unterstützt.

format(*, max_width=None, quote_annotation_strings=True)

Erstellt eine Zeichenkettendarstellung des Signature-Objekts.

Wenn max_width übergeben wird, versucht die Methode, die Signatur in Zeilen von höchstens max_width Zeichen anzupassen. Wenn die Signatur länger als max_width ist, werden alle Parameter auf separaten Zeilen stehen.

Wenn quote_annotation_strings False ist, werden Annotationen in der Signatur ohne öffnende und schließende Anführungszeichen angezeigt, wenn es sich um Zeichenketten handelt. Dies ist nützlich, wenn die Signatur mit dem Format STRING erstellt wurde oder wenn from __future__ import annotations verwendet wurde.

Hinzugefügt in Version 3.13.

Geändert in Version 3.14: Der Parameter unquote_annotations wurde hinzugefügt.

classmethod from_callable(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)

Gibt ein Signature (oder seine Unterklasse) Objekt für ein gegebenes aufrufbare Objekt obj zurück.

Diese Methode vereinfacht das Erstellen von Unterklassen von Signature

class MySignature(Signature):
    pass
sig = MySignature.from_callable(sum)
assert isinstance(sig, MySignature)

Ihr Verhalten ist ansonsten identisch mit dem von signature().

Hinzugefügt in Version 3.5.

Geändert in Version 3.10: Die Parameter globals, locals und eval_str wurden hinzugefügt.

class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)

Parameter-Objekte sind unveränderlich. Anstatt ein Parameter-Objekt zu ändern, können Sie Parameter.replace() oder copy.replace() verwenden, um eine modifizierte Kopie zu erstellen.

Geändert in Version 3.5: Parameter-Objekte sind jetzt pickelbar und hashable.

empty

Ein spezieller Marker auf Klassenebene zur Angabe des Fehlens von Standardwerten und Annotationen.

name

Der Name des Parameters als Zeichenkette. Der Name muss ein gültiger Python-Bezeichner sein.

CPython Implementierungsdetail: CPython generiert implizite Parameternamen der Form .0 für die Codeobjekte, die zur Implementierung von Comprehensions und Generatorausdrücken verwendet werden.

Geändert in Version 3.6: Diese Parameternamen werden jetzt von diesem Modul als Namen wie implicit0 exponiert.

default

Der Standardwert für den Parameter. Wenn der Parameter keinen Standardwert hat, ist dieses Attribut auf Parameter.empty gesetzt.

annotation

Die Annotation für den Parameter. Wenn der Parameter keine Annotation hat, ist dieses Attribut auf Parameter.empty gesetzt.

kind

Beschreibt, wie Argumentwerte an den Parameter gebunden werden. Die möglichen Werte sind über Parameter zugänglich (wie z. B. Parameter.KEYWORD_ONLY) und unterstützen Vergleiche und Sortierung in folgender Reihenfolge:

Name

Bedeutung

POSITIONAL_ONLY

Der Wert muss als Positionsargument übergeben werden. Positionsargumente sind solche, die in einer Python-Funktionsdefinition vor einem /-Eintrag (falls vorhanden) stehen.

POSITIONAL_OR_KEYWORD

Der Wert kann als Schlüsselwort- oder Positionsargument übergeben werden (dies ist das Standardverhalten für in Python implementierte Funktionen).

VAR_POSITIONAL

Ein Tupel von Positionsargumenten, die keinem anderen Parameter zugeordnet sind. Dies entspricht einem *args-Parameter in einer Python-Funktionsdefinition.

KEYWORD_ONLY

Der Wert muss als Schlüsselwortargument übergeben werden. Keyword-only-Parameter sind solche, die nach einem *- oder *args-Eintrag in einer Python-Funktionsdefinition stehen.

VAR_KEYWORD

Ein Wörterbuch von Schlüsselwortargumenten, die keinem anderen Parameter zugeordnet sind. Dies entspricht einem **kwargs-Parameter in einer Python-Funktionsdefinition.

Beispiel: Alle Keyword-only-Argumente ohne Standardwerte ausgeben

>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c
kind.description

Beschreibt einen Enum-Wert von Parameter.kind.

Hinzugefügt in Version 3.8.

Beispiel: Alle Beschreibungen von Argumenten ausgeben

>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     print(param.kind.description)
positional or keyword
positional or keyword
keyword-only
keyword-only
replace(*[, name][, kind][, default][, annotation])

Erstellt eine neue Parameter-Instanz basierend auf der Instanz, auf der replace aufgerufen wurde. Um ein Parameter-Attribut zu überschreiben, übergeben Sie das entsprechende Argument. Um einen Standardwert und/oder eine Annotation aus einem Parameter zu entfernen, übergeben Sie Parameter.empty.

>>> from inspect import Parameter
>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
>>> str(param)
'foo=42'

>>> str(param.replace()) # Will create a shallow copy of 'param'
'foo=42'

>>> str(param.replace(default=Parameter.empty, annotation='spam'))
"foo: 'spam'"

Parameter-Objekte werden auch von der generischen Funktion copy.replace() unterstützt.

Geändert in Version 3.4: In Python 3.3 war es Parameter-Objekten erlaubt, name auf None zu setzen, wenn ihr kind auf POSITIONAL_ONLY gesetzt war. Dies ist nun nicht mehr erlaubt.

class inspect.BoundArguments

Ergebnis eines Aufrufs von Signature.bind() oder Signature.bind_partial(). Enthält die Zuordnung von Argumenten zu den Parametern der Funktion.

arguments

Eine veränderbare Zuordnung von Parameternamen zu Argumentwerten. Enthält nur explizit gebundene Argumente. Änderungen in arguments spiegeln sich in args und kwargs wider.

Sollte zusammen mit Signature.parameters für alle Argumentverarbeitungszwecke verwendet werden.

Hinweis

Argumente, für die Signature.bind() oder Signature.bind_partial() auf einen Standardwert zurückgegriffen haben, werden übersprungen. Falls erforderlich, können Sie BoundArguments.apply_defaults() verwenden, um sie hinzuzufügen.

Geändert in Version 3.9: arguments ist jetzt vom Typ dict. Zuvor war es vom Typ collections.OrderedDict.

args

Ein Tupel von Positionsargumentwerten. Dynamisch berechnet aus dem arguments-Attribut.

kwargs

Ein Dictionary von Schlüsselwortargumentwerten. Dynamisch berechnet aus dem arguments-Attribut. Argumente, die positionell übergeben werden können, sind stattdessen in args enthalten.

signature

Eine Referenz auf das übergeordnete Signature-Objekt.

apply_defaults()

Setzt Standardwerte für fehlende Argumente.

Für variable Positionsargumente (*args) ist der Standardwert ein leeres Tupel.

Für variable Schlüsselwortargumente (**kwargs) ist der Standardwert ein leeres Dictionary.

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
{'a': 'spam', 'b': 'ham', 'args': ()}

Hinzugefügt in Version 3.5.

Die Eigenschaften args und kwargs können verwendet werden, um Funktionen aufzurufen

def test(a, *, b):
    ...

sig = signature(test)
ba = sig.bind(10, b=20)
test(*ba.args, **ba.kwargs)

Siehe auch

PEP 362 - Objekt für Funktionssignaturen.

Die detaillierte Spezifikation, Implementierungsdetails und Beispiele.

Klassen und Funktionen

inspect.getclasstree(classes, unique=False)

Ordnet die gegebene Liste von Klassen in eine Hierarchie von verschachtelten Listen an. Wo eine verschachtelte Liste erscheint, enthält sie Klassen, die von der Klasse abgeleitet sind, deren Eintrag der Liste unmittelbar vorangeht. Jeder Eintrag ist ein 2-Tupel, das eine Klasse und ein Tupel ihrer Basisklassen enthält. Wenn das Argument unique wahr ist, erscheint genau ein Eintrag in der zurückgegebenen Struktur für jede Klasse in der gegebenen Liste. Andernfalls erscheinen Klassen, die Mehrfachvererbung verwenden, und ihre Nachkommen mehrmals.

inspect.getfullargspec(func)

Ruft die Namen und Standardwerte der Parameter einer Python-Funktion ab. Ein named tuple wird zurückgegeben

FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)

args ist eine Liste der Namen von Positionsargumenten. varargs ist der Name des *-Parameters oder None, wenn keine beliebigen Positionsargumente akzeptiert werden. varkw ist der Name des **-Parameters oder None, wenn keine beliebigen Schlüsselwortargumente akzeptiert werden. defaults ist ein n-Tupel von Standardargumentwerten, die den letzten n Positionsargumenten entsprechen, oder None, wenn keine solchen Standardwerte definiert sind. kwonlyargs ist eine Liste von Namen von nur-Schlüsselwortargumenten in der Reihenfolge der Deklaration. kwonlydefaults ist ein Dictionary, das Parameternamen aus kwonlyargs auf die Standardwerte abbildet, die verwendet werden, wenn kein Argument angegeben wird. annotations ist ein Dictionary, das Parameternamen auf Annotationen abbildet. Der spezielle Schlüssel "return" wird verwendet, um die Anmerkung des Rückgabewerts der Funktion (falls vorhanden) zu melden.

Beachten Sie, dass signature() und Objekt für Signaturen die empfohlene API für die Introspektion von aufrufbaren Objekten bereitstellen und zusätzliche Verhaltensweisen unterstützen (wie positionsbasierte Argumente), die manchmal in APIs von Erweiterungsmodulen vorkommen. Diese Funktion wird hauptsächlich für Code beibehalten, der die Kompatibilität mit der Python 2 inspect-Modul-API gewährleisten muss.

Geändert in Version 3.4: Diese Funktion basiert nun auf signature(), ignoriert aber immer noch __wrapped__-Attribute und schließt den bereits gebundenen ersten Parameter in die Signaturenausgabe für gebundene Methoden ein.

Geändert in Version 3.6: Diese Methode wurde zuvor zugunsten von signature() in Python 3.5 als veraltet dokumentiert, aber diese Entscheidung wurde rückgängig gemacht, um eine klar unterstützte Standardoberfläche für Code, der von der Legacy-API getargspec() weg migriert und Python 2/3-kompatibel ist, wiederherzustellen.

Geändert in Version 3.7: Python garantierte explizit, dass es die Deklarationsreihenfolge von Keyword-only-Parametern ab Version 3.7 beibehielt, obwohl diese Reihenfolge in Python 3 in der Praxis immer beibehalten worden war.

inspect.getargvalues(frame)

Ruft Informationen über Argumente ab, die an einen bestimmten Frame übergeben wurden. Ein named tuple ArgInfo(args, varargs, keywords, locals) wird zurückgegeben. args ist eine Liste der Argumentnamen. varargs und keywords sind die Namen der *- und **-Argumente oder None. locals ist das Locals-Dictionary des gegebenen Frames.

Hinweis

Diese Funktion wurde in Python 3.5 versehentlich als veraltet markiert.

inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

Formatiert eine übersichtliche Argumentdefinition aus den vier Werten, die von getargvalues() zurückgegeben werden. Die Argumente format* sind die entsprechenden optionalen Formatierungsfunktionen, die aufgerufen werden, um Namen und Werte in Zeichenfolgen umzuwandeln.

Hinweis

Diese Funktion wurde in Python 3.5 versehentlich als veraltet markiert.

inspect.getmro(cls)

Gibt ein Tupel der Basisklassen von Klasse cls zurück, einschließlich cls, in der Reihenfolge der Methodenauflösung (Method Resolution Order). Keine Klasse erscheint mehr als einmal in diesem Tupel. Beachten Sie, dass die Reihenfolge der Methodenauflösung vom Typ von cls abhängt. Sofern keine sehr seltsame benutzerdefinierte Metaklasse verwendet wird, ist cls das erste Element des Tupels.

inspect.getcallargs(func, /, *args, **kwds)

Bindet die Argumente args und kwds an die Argumentnamen der Python-Funktion oder -Methode func, als ob sie mit ihnen aufgerufen worden wäre. Für gebundene Methoden werden auch das erste Argument (typischerweise self genannt) an die zugehörige Instanz gebunden. Ein Dictionary wird zurückgegeben, das die Argumentnamen (einschließlich der Namen der *- und **-Argumente, falls vorhanden) ihren Werten aus args und kwds zuordnet. Im Falle eines fehlerhaften Aufrufs von func, d. h. wann immer func(*args, **kwds) aufgrund einer inkompatiblen Signatur eine Ausnahme auslösen würde, wird eine Ausnahme vom gleichen Typ und mit der gleichen oder ähnlichen Meldung ausgelöst. Zum Beispiel

>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
True
>>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
True
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() missing 1 required positional argument: 'a'

Hinzugefügt in Version 3.2.

Veraltet seit Version 3.5: Verwenden Sie stattdessen Signature.bind() und Signature.bind_partial().

inspect.getclosurevars(func)

Ruft die Zuordnung von externen Namensreferenzen in einer Python-Funktion oder -Methode func zu ihren aktuellen Werten ab. Ein named tuple ClosureVars(nonlocals, globals, builtins, unbound) wird zurückgegeben. nonlocals ordnet referenzierte Namen den lexikalischen Closure-Variablen zu, globals den Modul-Globals der Funktion und builtins den von der Funktionsrumpf sichtbaren Built-ins. unbound ist die Menge der im Funktion referenzierten Namen, die anhand der aktuellen Modul-Globals und Built-ins nicht aufgelöst werden konnten.

TypeError wird ausgelöst, wenn func keine Python-Funktion oder -Methode ist.

Hinzugefügt in Version 3.3.

inspect.unwrap(func, *, stop=None)

Ruft das von func umschlossene Objekt ab. Es folgt der Kette von __wrapped__-Attributen und gibt das letzte Objekt in der Kette zurück.

stop ist eine optionale Callback-Funktion, die ein Objekt in der Wrapper-Kette als einziges Argument akzeptiert und es ermöglicht, das Entpacken frühzeitig zu beenden, wenn der Callback einen wahren Wert zurückgibt. Wenn der Callback niemals einen wahren Wert zurückgibt, wird wie üblich das letzte Objekt in der Kette zurückgegeben. Zum Beispiel verwendet signature() dies, um das Entpacken zu stoppen, wenn ein Objekt in der Kette ein __signature__-Attribut definiert hat.

ValueError wird ausgelöst, wenn ein Zyklus angetroffen wird.

Hinzugefügt in Version 3.4.

inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)

Berechnet das Annotations-Dictionary für ein Objekt.

Dies ist ein Alias für annotationlib.get_annotations(); siehe die Dokumentation dieser Funktion für weitere Informationen.

Vorsicht

Diese Funktion kann beliebigen Code ausführen, der in Annotationen enthalten ist. Siehe Sicherheitsaspekte der Introspektion von Annotationen für weitere Informationen.

Hinzugefügt in Version 3.10.

Geändert in Version 3.14: Diese Funktion ist jetzt ein Alias für annotationlib.get_annotations(). Der Aufruf als inspect.get_annotations funktioniert weiterhin.

Der Interpreter-Stack

Einige der folgenden Funktionen geben FrameInfo-Objekte zurück. Aus Kompatibilitätsgründen erlauben diese Objekte Tupel-ähnliche Operationen auf allen Attributen außer positions. Dieses Verhalten gilt als veraltet und könnte in Zukunft entfernt werden.

class inspect.FrameInfo
frame

Das Frame-Objekt, dem der Datensatz entspricht.

filename

Der Dateiname, der dem Code zugeordnet ist, der vom Frame ausgeführt wird, dem dieser Datensatz entspricht.

lineno

Die Zeilennummer der aktuellen Zeile, die dem Code zugeordnet ist, der vom Frame ausgeführt wird, dem dieser Datensatz entspricht.

function

Der Funktionsname, der vom Frame ausgeführt wird, dem dieser Datensatz entspricht.

code_context

Eine Liste von Zeilen Kontext aus dem Quellcode, der vom Frame ausgeführt wird, dem dieser Datensatz entspricht.

index

Der Index der aktuell ausgeführten Zeile in der Liste code_context.

positions

Ein dis.Positions-Objekt, das die Startzeilennummer, Endzeilennummer, den Spaltenoffset am Anfang und den Spaltenoffset am Ende enthält, die der Anweisung zugeordnet sind, die vom Frame ausgeführt wird, dem dieser Datensatz entspricht.

Geändert in Version 3.5: Gibt ein named tuple anstelle eines tuple zurück.

Geändert in Version 3.11: FrameInfo ist nun eine Klasseninstanz (die abwärtskompatibel mit dem vorherigen named tuple ist).

class inspect.Traceback
filename

Der Dateiname, der dem Code zugeordnet ist, der vom Frame ausgeführt wird, dem dieser Traceback entspricht.

lineno

Die Zeilennummer der aktuellen Zeile, die dem Code zugeordnet ist, der vom Frame ausgeführt wird, dem dieser Traceback entspricht.

function

Der Funktionsname, der vom Frame ausgeführt wird, dem dieser Traceback entspricht.

code_context

Eine Liste von Zeilen Kontext aus dem Quellcode, der vom Frame ausgeführt wird, dem dieser Traceback entspricht.

index

Der Index der aktuell ausgeführten Zeile in der Liste code_context.

positions

Ein dis.Positions-Objekt, das die Startzeilennummer, Endzeilennummer, den Spaltenoffset am Anfang und den Spaltenoffset am Ende enthält, die der Anweisung zugeordnet sind, die vom Frame ausgeführt wird, dem dieser Traceback entspricht.

Geändert in Version 3.11: Traceback ist nun eine Klasseninstanz (die abwärtskompatibel mit dem vorherigen named tuple ist).

Hinweis

Das Aufrechterhalten von Referenzen auf Frame-Objekte, wie sie im ersten Element der von diesen Funktionen zurückgegebenen Frame-Datensätzen gefunden werden, kann dazu führen, dass Ihr Programm Referenzzyklen erzeugt. Sobald ein Referenzzyklus erstellt wurde, kann die Lebensdauer aller Objekte, auf die von den Objekten zugegriffen werden kann, die den Zyklus bilden, viel länger sein, auch wenn Pythons optionaler Zykluserkenner aktiviert ist. Wenn solche Zyklen erstellt werden müssen, ist es wichtig sicherzustellen, dass sie explizit gebrochen werden, um die verzögerte Zerstörung von Objekten und den erhöhten Speicherverbrauch zu vermeiden.

Obwohl der Zykluserkenner diese erkennen wird, kann die Zerstörung der Frames (und lokalen Variablen) durch das Brechen des Zyklus in einer finally-Klausel deterministisch gemacht werden. Dies ist auch wichtig, wenn der Zykluserkenner beim Kompilieren von Python deaktiviert wurde oder gc.disable() verwendet wurde. Zum Beispiel

def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # do something with the frame
    finally:
        del frame

Wenn Sie den Frame behalten möchten (zum Beispiel um später einen Traceback zu drucken), können Sie Referenzzyklen auch brechen, indem Sie die Methode frame.clear() verwenden.

Das optionale Argument context, das von den meisten dieser Funktionen unterstützt wird, gibt die Anzahl der zurückzugebenden Kontextzeilen an, die um die aktuelle Zeile zentriert sind.

inspect.getframeinfo(frame, context=1)

Ruft Informationen über ein Frame- oder Traceback-Objekt ab. Ein Traceback-Objekt wird zurückgegeben.

Geändert in Version 3.11: Ein Traceback-Objekt wird anstelle eines named tuple zurückgegeben.

inspect.getouterframes(frame, context=1)

Gibt eine Liste von FrameInfo-Objekten für einen Frame und alle äußeren Frames zurück. Diese Frames repräsentieren die Aufrufe, die zur Erstellung von frame geführt haben. Der erste Eintrag in der zurückgegebenen Liste repräsentiert frame; der letzte Eintrag repräsentiert den äußersten Aufruf im Stack von frame.

Geändert in Version 3.5: Eine Liste von named tuples FrameInfo(frame, filename, lineno, function, code_context, index) wird zurückgegeben.

Geändert in Version 3.11: Eine Liste von FrameInfo-Objekten wird zurückgegeben.

inspect.getinnerframes(traceback, context=1)

Gibt eine Liste von FrameInfo-Objekten für den Frame eines Tracebacks und alle inneren Frames zurück. Diese Frames repräsentieren Aufrufe, die als Folge von frame getätigt wurden. Der erste Eintrag in der Liste repräsentiert traceback; der letzte Eintrag repräsentiert, wo die Ausnahme ausgelöst wurde.

Geändert in Version 3.5: Eine Liste von named tuples FrameInfo(frame, filename, lineno, function, code_context, index) wird zurückgegeben.

Geändert in Version 3.11: Eine Liste von FrameInfo-Objekten wird zurückgegeben.

inspect.currentframe()

Gibt das Frame-Objekt für den Stack-Frame des Aufrufers zurück.

CPython-Implementierungsdetails: Diese Funktion ist auf die Unterstützung von Python-Stack-Frames im Interpreter angewiesen, die in allen Python-Implementierungen nicht garantiert ist. Wenn sie in einer Implementierung ohne Unterstützung für Python-Stack-Frames ausgeführt wird, gibt diese Funktion None zurück.

inspect.stack(context=1)

Gibt eine Liste von FrameInfo-Objekten für den Stack des Aufrufers zurück. Der erste Eintrag in der zurückgegebenen Liste repräsentiert den Aufrufer; der letzte Eintrag repräsentiert den äußersten Aufruf im Stack.

Geändert in Version 3.5: Eine Liste von named tuples FrameInfo(frame, filename, lineno, function, code_context, index) wird zurückgegeben.

Geändert in Version 3.11: Eine Liste von FrameInfo-Objekten wird zurückgegeben.

inspect.trace(context=1)

Gibt eine Liste von FrameInfo-Objekten für den Stack zwischen dem aktuellen Frame und dem Frame zurück, in dem eine aktuell behandelte Ausnahme ausgelöst wurde. Der erste Eintrag in der Liste repräsentiert den Aufrufer; der letzte Eintrag repräsentiert, wo die Ausnahme ausgelöst wurde.

Geändert in Version 3.5: Eine Liste von named tuples FrameInfo(frame, filename, lineno, function, code_context, index) wird zurückgegeben.

Geändert in Version 3.11: Eine Liste von FrameInfo-Objekten wird zurückgegeben.

Attribute statisch abrufen

Sowohl getattr() als auch hasattr() können beim Abrufen oder Überprüfen der Existenz von Attributen Code ausführen. Deskriptoren, wie Eigenschaften, werden aufgerufen und __getattr__() und __getattribute__() können aufgerufen werden.

Für Fälle, in denen Sie passive Introspektion wünschen, wie z. B. für Dokumentationstools, kann dies unbequem sein. getattr_static() hat die gleiche Signatur wie getattr(), vermeidet aber die Ausführung von Code beim Abrufen von Attributen.

inspect.getattr_static(obj, attr, default=None)

Ruft Attribute ab, ohne eine dynamische Suche über das Deskriptor-Protokoll, __getattr__() oder __getattribute__() auszulösen.

Hinweis: Diese Funktion kann möglicherweise nicht alle Attribute abrufen, die getattr abrufen kann (wie dynamisch erstellte Attribute) und kann Attribute finden, die getattr nicht finden kann (wie Deskriptoren, die AttributeError auslösen). Sie kann auch Deskriptorobjekte anstelle von Instanzmitgliedern zurückgeben.

Wenn die Instanz __dict__ durch ein anderes Mitglied (z. B. eine Eigenschaft) überschattet wird, kann diese Funktion keine Instanzmitglieder finden.

Hinzugefügt in Version 3.2.

getattr_static() löst keine Deskriptoren auf, z. B. Slot-Deskriptoren oder Getset-Deskriptoren bei in C implementierten Objekten. Statt des zugrunde liegenden Attributs wird das Deskriptorobjekt zurückgegeben.

Sie können diese mit Code wie dem folgenden behandeln. Beachten Sie, dass die Ausführung von Code durch das Aufrufen beliebiger Getset-Deskriptoren ausgelöst werden kann

# example code for resolving the builtin descriptor types
class _foo:
    __slots__ = ['foo']

slot_descriptor = type(_foo.foo)
getset_descriptor = type(type(open(__file__)).name)
wrapper_descriptor = type(str.__dict__['__add__'])
descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)

result = getattr_static(some_object, 'foo')
if type(result) in descriptor_types:
    try:
        result = result.__get__()
    except AttributeError:
        # descriptors can raise AttributeError to
        # indicate there is no underlying value
        # in which case the descriptor itself will
        # have to do
        pass

Aktueller Status von Generatoren, Koroutinen und asynchronen Generatoren

Bei der Implementierung von Coroutine-Schedulern und für andere fortgeschrittene Verwendungen von Generatoren ist es nützlich festzustellen, ob ein Generator gerade ausgeführt wird, darauf wartet zu starten oder fortgesetzt zu werden, oder bereits beendet wurde. getgeneratorstate() ermöglicht es, den aktuellen Status eines Generators leicht zu ermitteln.

inspect.getgeneratorstate(generator)

Aktuellen Status eines Generator-Iterators abrufen.

Mögliche Zustände sind

  • GEN_CREATED: Wartet auf den Start der Ausführung.

  • GEN_RUNNING: Wird gerade vom Interpreter ausgeführt.

  • GEN_SUSPENDED: Ist derzeit bei einem `yield`-Ausdruck angehalten.

  • GEN_CLOSED: Die Ausführung wurde abgeschlossen.

Hinzugefügt in Version 3.2.

inspect.getcoroutinestate(coroutine)

Aktuellen Status eines Coroutine-Objekts abrufen. Die Funktion ist für die Verwendung mit Coroutine-Objekten vorgesehen, die von async def-Funktionen erstellt wurden, akzeptiert aber jedes Coroutine-ähnliche Objekt, das die Attribute cr_running und cr_frame hat.

Mögliche Zustände sind

  • CORO_CREATED: Wartet auf den Start der Ausführung.

  • CORO_RUNNING: Wird gerade vom Interpreter ausgeführt.

  • CORO_SUSPENDED: Ist derzeit bei einem `await`-Ausdruck angehalten.

  • CORO_CLOSED: Die Ausführung wurde abgeschlossen.

Hinzugefügt in Version 3.5.

inspect.getasyncgenstate(agen)

Aktuellen Status eines asynchronen Generator-Objekts abrufen. Die Funktion ist für die Verwendung mit asynchronen Iterator-Objekten vorgesehen, die von async def-Funktionen erstellt wurden, die die `yield`-Anweisung verwenden, akzeptiert aber jedes asynchrone Generator-ähnliche Objekt, das die Attribute ag_running und ag_frame hat.

Mögliche Zustände sind

  • AGEN_CREATED: Wartet auf den Start der Ausführung.

  • AGEN_RUNNING: Wird gerade vom Interpreter ausgeführt.

  • AGEN_SUSPENDED: Ist derzeit bei einem `yield`-Ausdruck angehalten.

  • AGEN_CLOSED: Die Ausführung wurde abgeschlossen.

Hinzugefügt in Version 3.12.

Der aktuelle interne Status des Generators kann ebenfalls abgefragt werden. Dies ist hauptsächlich zu Testzwecken nützlich, um sicherzustellen, dass der interne Status wie erwartet aktualisiert wird

inspect.getgeneratorlocals(generator)

Die Zuordnung von aktiven lokalen Variablen in generator zu ihren aktuellen Werten abrufen. Ein Wörterbuch wird zurückgegeben, das Variablennamen auf Werte abbildet. Dies entspricht dem Aufruf von locals() im Körper des Generators, und alle gleichen Vorbehalte gelten.

Wenn generator ein Generator ohne aktuell zugeordneten Frame ist, wird ein leeres Wörterbuch zurückgegeben. TypeError wird ausgelöst, wenn generator kein Python-Generatorobjekt ist.

CPython Implementierungsdetail: Diese Funktion beruht darauf, dass der Generator einen Python-Stack-Frame zur Introspektion bereitstellt, was nicht in allen Python-Implementierungen garantiert ist. In solchen Fällen gibt diese Funktion immer ein leeres Wörterbuch zurück.

Hinzugefügt in Version 3.3.

inspect.getcoroutinelocals(coroutine)

Diese Funktion ist analog zu getgeneratorlocals(), funktioniert aber für Coroutine-Objekte, die von async def-Funktionen erstellt wurden.

Hinzugefügt in Version 3.5.

inspect.getasyncgenlocals(agen)

Diese Funktion ist analog zu getgeneratorlocals(), funktioniert aber für asynchrone Generator-Objekte, die von async def-Funktionen erstellt wurden, die die `yield`-Anweisung verwenden.

Hinzugefügt in Version 3.12.

Codeobjekt-Bitflags

Python-Codeobjekte haben ein Attribut co_flags, das eine Bitmap der folgenden Flags ist

inspect.CO_OPTIMIZED

Das Codeobjekt ist optimiert und verwendet schnelle Locals.

inspect.CO_NEWLOCALS

Wenn gesetzt, wird ein neues Wörterbuch für f_locals des Frames erstellt, wenn das Codeobjekt ausgeführt wird.

inspect.CO_VARARGS

Das Codeobjekt hat einen variablen positionsbezogenen Parameter (ähnlich wie *args).

inspect.CO_VARKEYWORDS

Das Codeobjekt hat einen variablen Schlüsselwortparameter (ähnlich wie **kwargs).

inspect.CO_NESTED

Das Flag wird gesetzt, wenn das Codeobjekt eine verschachtelte Funktion ist.

inspect.CO_GENERATOR

Das Flag wird gesetzt, wenn das Codeobjekt eine Generatorfunktion ist, d. h. ein Generatorobjekt wird zurückgegeben, wenn das Codeobjekt ausgeführt wird.

inspect.CO_COROUTINE

Das Flag wird gesetzt, wenn das Codeobjekt eine Coroutine-Funktion ist. Wenn das Codeobjekt ausgeführt wird, gibt es ein Coroutine-Objekt zurück. Weitere Details finden Sie in PEP 492.

Hinzugefügt in Version 3.5.

inspect.CO_ITERABLE_COROUTINE

Das Flag wird verwendet, um Generatoren in Generator-basierte Coroutinen umzuwandeln. Generatorobjekte mit diesem Flag können in `await`-Ausdrücken verwendet werden und `yield from` Coroutine-Objekten.

Hinzugefügt in Version 3.5.

inspect.CO_ASYNC_GENERATOR

Das Flag wird gesetzt, wenn das Codeobjekt eine asynchrone Generatorfunktion ist. Wenn das Codeobjekt ausgeführt wird, gibt es ein asynchrones Generatorobjekt zurück. Weitere Details finden Sie in PEP 525.

Hinzugefügt in Version 3.6.

inspect.CO_HAS_DOCSTRING

Das Flag wird gesetzt, wenn im Quellcode ein Docstring für das Codeobjekt vorhanden ist. Wenn gesetzt, ist es das erste Element in co_consts.

Hinzugefügt in Version 3.14.

inspect.CO_METHOD

Das Flag wird gesetzt, wenn das Codeobjekt eine Funktion ist, die im Klassenbereich definiert ist.

Hinzugefügt in Version 3.14.

Hinweis

Die Flags sind spezifisch für CPython und werden möglicherweise nicht in anderen Python-Implementierungen definiert. Darüber hinaus sind die Flags ein Implementierungsdetail und können in zukünftigen Python-Versionen entfernt oder als veraltet markiert werden. Es wird empfohlen, für alle Introspektionsanforderungen öffentliche APIs aus dem inspect-Modul zu verwenden.

Buffer Flags

class inspect.BufferFlags

Dies ist ein enum.IntFlag, das die Flags darstellt, die an die Methode __buffer__() von Objekten übergeben werden können, die das Buffer-Protokoll implementieren.

Die Bedeutung der Flags wird unter Buffer-Anforderungstypen erläutert.

SIMPLE
WRITABLE
FORMAT
ND
STRIDES
C_CONTIGUOUS
F_CONTIGUOUS
ANY_CONTIGUOUS
INDIRECT
CONTIG
CONTIG_RO
STRIDED
STRIDED_RO
RECORDS
RECORDS_RO
FULL
FULL_RO
READ
WRITE

Hinzugefügt in Version 3.12.

Kommandozeilenschnittstelle

Das Modul inspect bietet auch grundlegende Introspektionsfähigkeiten von der Kommandozeile.

Standardmäßig wird der Name eines Moduls akzeptiert und der Quellcode dieses Moduls ausgegeben. Eine Klasse oder Funktion innerhalb des Moduls kann stattdessen ausgegeben werden, indem ein Doppelpunkt und der qualifizierte Name des Zielobjekts angehängt werden.

--details

Gibt Informationen über das angegebene Objekt anstelle des Quellcodes aus