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 SymbolTable fü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ür compile().

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 annotations aktiv ist.

TYPE_ALIAS = "type alias"

Wird für die Symboltabelle von type-Konstruktionen verwendet.

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ür TypeVar-Bindungs-Scopes ist es der Name des TypeVar.

get_lineno()

Gibt die Zeilennummer der ersten Zeile im Block zurück, den diese Tabelle darstellt.

is_optimized()

Gibt True zurück, wenn die Lokale in dieser Tabelle optimiert werden können.

is_nested()

Gibt True zurück, wenn der Block eine verschachtelte Klasse oder Funktion ist.

has_children()

Gibt True zurück, wenn der Block verschachtelte Namensräume enthält. Diese können mit get_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.

lookup(name)

Sucht name in der Tabelle und gibt eine Symbol-Instanz zurück.

get_symbols()

Gibt eine Liste von Symbol-Instanzen für Namen in der Tabelle zurück.

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 def oder async def definiert 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 einen TypeError auslöst, wird A.f immer 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 True zurück, wenn das Symbol in seinem Block verwendet wird.

is_imported()

Gibt True zurück, wenn das Symbol aus einer Importanweisung erstellt wurde.

is_parameter()

Gibt True zurück, wenn das Symbol ein Parameter ist.

is_type_parameter()

Gibt True zurück, wenn das Symbol ein Typenparameter ist.

Hinzugefügt in Version 3.14.

is_global()

Gibt True zurück, wenn das Symbol global ist.

is_nonlocal()

Gibt True zurück, wenn das Symbol nonlocal ist.

is_declared_global()

Gibt True zurück, wenn das Symbol mit einer globalen Anweisung als global deklariert wurde.

is_local()

Gibt True zurück, wenn das Symbol lokal zu seinem Block ist.

is_annotated()

Gibt True zurück, wenn das Symbol annotiert ist.

Hinzugefügt in Version 3.6.

is_free()

Gibt True zurü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 x aus der Perspektive von C.method als frei betrachtet, wodurch letztere zur Laufzeit 1 und nicht 2 zurückgeben kann.

Hinzugefügt in Version 3.14.

is_assigned()

Gibt True zurück, wenn das Symbol in seinem Block zugewiesen wird.

is_comp_iter()

Gibt True zurück, wenn das Symbol eine Comprehension-Iterationsvariable ist.

Hinzugefügt in Version 3.14.

is_comp_cell()

Gibt True zurück, wenn das Symbol eine Zelle in einer integrierten Comprehension ist.

Hinzugefügt in Version 3.14.

is_namespace()

Gibt True zurü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 True ist, 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 ValueError ausgelö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.