symtable — Zugriff auf die Symboltabellen des Compilers¶
Quellcode: Lib/symtable.py
Symboltabellen werden vom Compiler kurz vor der Bytecode-Generierung aus dem AST erstellt. Die Symboltabelle ist für die Berechnung des Geltungsbereichs jedes Bezeichners im Code verantwortlich. symtable bietet eine Schnittstelle zur Untersuchung dieser Tabellen.
Generieren von Symboltabellen¶
- symtable.symtable(code, filename, compile_type)¶
Gibt die oberste
SymbolTablefür den Python-Quelltext code zurück. filename ist der Name der Datei, die den Code enthält. compile_type ist wie das Argument mode fürcompile().
Untersuchen von Symboltabellen¶
- class symtable.SymbolTableType¶
Eine Aufzählung, die den Typ eines
SymbolTable-Objekts angibt.- MODULE = "module"¶
Wird für die Symboltabelle eines Moduls verwendet.
- FUNCTION = "function"¶
Wird für die Symboltabelle einer Funktion verwendet.
- CLASS = "class"¶
Wird für die Symboltabelle einer Klasse verwendet.
Die folgenden Member beziehen sich auf verschiedene Varianten von Annotation-Scopes.
- ANNOTATION = "annotation"¶
Wird für Annotationen verwendet, wenn
from __future__ import annotationsaktiv ist.
- TYPE_PARAMETERS = "type parameters"¶
Wird für die Symboltabelle von generischen Funktionen oder generischen Klassen verwendet.
- TYPE_VARIABLE = "type variable"¶
Wird für die Symboltabelle der Bindung, des Einschränkungstupels oder des Standardwerts einer einzelnen Typvariable im formalen Sinne verwendet, d. h. eines TypeVar, eines TypeVarTuple oder eines ParamSpec-Objekts (die beiden letzteren unterstützen keine Bindung oder Einschränkungstupel).
Hinzugefügt in Version 3.13.
- class symtable.SymbolTable¶
Eine Namensraumtabelle für einen Block. Der Konstruktor ist nicht öffentlich.
- get_type()¶
Gibt den Typ der Symboltabelle zurück. Mögliche Werte sind Mitglieder der
SymbolTableType-Aufzählung.Geändert in Version 3.12:
'annotation','TypeVar bound','type alias'und'type parameter'als mögliche Rückgabewerte hinzugefügt.Geändert in Version 3.13: Rückgabewerte sind Mitglieder der
SymbolTableType-Aufzählung.Die genauen Werte der zurückgegebenen Zeichenfolge können sich in Zukunft ändern. Daher wird empfohlen,
SymbolTableType-Mitglieder anstelle hartkodierter Zeichenfolgen zu verwenden.
- get_id()¶
Gibt die Kennung der Tabelle zurück.
- get_name()¶
Gibt den Namen der Tabelle zurück. Dies ist der Name der Klasse, wenn die Tabelle für eine Klasse bestimmt ist, der Name der Funktion, wenn die Tabelle für eine Funktion bestimmt ist, oder
'top', wenn die Tabelle global ist (get_type()gibt'module'zurück). Für Typenparameter-Scopes (die für generische Klassen, Funktionen und Typalias verwendet werden) ist dies der Name der zugrunde liegenden Klasse, Funktion oder des Typalias. Für Typalias-Scopes ist es der Name des Typalias. FürTypeVar-Bindungs-Scopes ist es der Name desTypeVar.
- get_lineno()¶
Gibt die Zeilennummer der ersten Zeile im Block zurück, den diese Tabelle darstellt.
- is_optimized()¶
Gibt
Truezurück, wenn die Lokale in dieser Tabelle optimiert werden können.
- is_nested()¶
Gibt
Truezurück, wenn der Block eine verschachtelte Klasse oder Funktion ist.
- has_children()¶
Gibt
Truezurück, wenn der Block verschachtelte Namensräume enthält. Diese können mitget_children()abgerufen werden.
- get_identifiers()¶
Gibt ein View-Objekt zurück, das die Namen der Symbole in der Tabelle enthält. Siehe die Dokumentation von View-Objekten.
- get_children()¶
Gibt eine Liste der verschachtelten Symboltabellen zurück.
- class symtable.Function¶
Ein Namensraum für eine Funktion oder Methode. Diese Klasse erbt von
SymbolTable.- get_parameters()¶
Gibt ein Tupel zurück, das die Namen der Parameter dieser Funktion enthält.
- get_locals()¶
Gibt ein Tupel zurück, das die Namen der Lokalen in dieser Funktion enthält.
- get_globals()¶
Gibt ein Tupel zurück, das die Namen der Globale in dieser Funktion enthält.
- get_nonlocals()¶
Gibt ein Tupel zurück, das die Namen explizit deklarierter Nicht-Lokaler in dieser Funktion enthält.
- get_frees()¶
Gibt ein Tupel zurück, das die Namen von freien (Closure-)Variablen in dieser Funktion enthält.
- class symtable.Class¶
Ein Namensraum einer Klasse. Diese Klasse erbt von
SymbolTable.- get_methods()¶
Gibt ein Tupel zurück, das die Namen von Method-ähnlichen Funktionen enthält, die in der Klasse deklariert sind.
Hier bezeichnet der Begriff „Methode“ *jede* Funktion, die im Klassenkörper mittels
defoderasync defdefiniert ist.In tieferen Gültigkeitsbereichen definierte Funktionen (z. B. in einer inneren Klasse) werden von
get_methods()nicht erfasst.Zum Beispiel
>>> import symtable >>> st = symtable.symtable(''' ... def outer(): pass ... ... class A: ... def f(): ... def w(): pass ... ... def g(self): pass ... ... @classmethod ... async def h(cls): pass ... ... global outer ... def outer(self): pass ... ''', 'test', 'exec') >>> class_A = st.get_children()[2] >>> class_A.get_methods() ('f', 'g', 'h')
Obwohl
A().f()zur Laufzeit einenTypeErrorauslöst, wirdA.fimmer noch als methodenähnliche Funktion betrachtet.Veraltet seit Version 3.14, wird in Version 3.16 entfernt.
- class symtable.Symbol¶
Ein Eintrag in einer
SymbolTable, der einem Bezeichner im Quellcode entspricht. Der Konstruktor ist nicht öffentlich.- get_name()¶
Gibt den Namen des Symbols zurück.
- is_referenced()¶
Gibt
Truezurück, wenn das Symbol in seinem Block verwendet wird.
- is_imported()¶
Gibt
Truezurück, wenn das Symbol aus einer Importanweisung erstellt wurde.
- is_parameter()¶
Gibt
Truezurück, wenn das Symbol ein Parameter ist.
- is_type_parameter()¶
Gibt
Truezurück, wenn das Symbol ein Typenparameter ist.Hinzugefügt in Version 3.14.
- is_global()¶
Gibt
Truezurück, wenn das Symbol global ist.
- is_nonlocal()¶
Gibt
Truezurück, wenn das Symbol nonlocal ist.
- is_declared_global()¶
Gibt
Truezurück, wenn das Symbol mit einer globalen Anweisung als global deklariert wurde.
- is_local()¶
Gibt
Truezurück, wenn das Symbol lokal zu seinem Block ist.
- is_annotated()¶
Gibt
Truezurück, wenn das Symbol annotiert ist.Hinzugefügt in Version 3.6.
- is_free()¶
Gibt
Truezurück, wenn das Symbol in seinem Block referenziert wird, aber nicht zugewiesen wird.
- is_free_class()¶
Gibt True zurück, wenn ein Symbol im Klassengeltungsbereich aus der Perspektive einer Methode frei ist.
Betrachten Sie das folgende Beispiel
def f(): x = 1 # function-scoped class C: x = 2 # class-scoped def method(self): return x
In diesem Beispiel wird das Symbol im Klassengeltungsbereich
xaus der Perspektive vonC.methodals frei betrachtet, wodurch letztere zur Laufzeit 1 und nicht 2 zurückgeben kann.Hinzugefügt in Version 3.14.
- is_assigned()¶
Gibt
Truezurück, wenn das Symbol in seinem Block zugewiesen wird.
- is_comp_iter()¶
Gibt
Truezurück, wenn das Symbol eine Comprehension-Iterationsvariable ist.Hinzugefügt in Version 3.14.
- is_comp_cell()¶
Gibt
Truezurück, wenn das Symbol eine Zelle in einer integrierten Comprehension ist.Hinzugefügt in Version 3.14.
- is_namespace()¶
Gibt
Truezurück, wenn die Namensbindung einen neuen Namensraum einführt.Wenn der Name als Ziel einer Funktions- oder Klassenanweisung verwendet wird, ist dies wahr.
Zum Beispiel
>>> table = symtable.symtable("def some_func(): pass", "string", "exec") >>> table.lookup("some_func").is_namespace() True
Beachten Sie, dass ein einzelner Name an mehrere Objekte gebunden sein kann. Wenn das Ergebnis
Trueist, kann der Name auch an andere Objekte gebunden sein, z. B. an einen Integer oder eine Liste, die keinen neuen Namensraum einführen.
- get_namespaces()¶
Gibt eine Liste der an diesen Namen gebundenen Namensräume zurück.
- get_namespace()¶
Gibt den an diesen Namen gebundenen Namensraum zurück. Wenn mehr als ein Namensraum oder kein Namensraum an diesen Namen gebunden ist, wird ein
ValueErrorausgelöst.
Befehlszeilenverwendung¶
Hinzugefügt in Version 3.13.
Das Modul symtable kann als Skript von der Kommandozeile ausgeführt werden.
python -m symtable [infile...]
Symboltabellen werden für die angegebenen Python-Quelldateien generiert und an stdout ausgegeben. Wenn keine Eingabedatei angegeben ist, wird der Inhalt von stdin gelesen.