symtable — Tillgång till kompilatorns symboltabeller

Källkod: Lib/symtable.py


Symboltabeller genereras av kompilatorn från AST strax innan bytecode genereras. Symboltabellen är ansvarig för att beräkna omfattningen av varje identifierare i koden. symtable tillhandahåller ett gränssnitt för att undersöka dessa tabeller.

Generera symboltabeller

symtable.symtable(code, filename, compile_type)

Returnerar toplevel SymbolTable för Python-källan code. filename är namnet på filen som innehåller koden. compile_type är som mode-argumentet till compile().

Undersökning av symboltabeller

class symtable.SymbolTableType

En uppräkning som anger typen av ett SymbolTable-objekt.

MODULE = "module"

Används för symboltabellen för en modul.

FUNCTION = "function"

Används för symboltabellen för en funktion.

CLASS = "class"

Används för symboltabellen för en klass.

Följande medlemmar refererar till olika varianter av annotation scopes.

ANNOTATION = "annotation"

Används för anteckningar om from __future__ import annotations är aktiv.

TYPE_ALIAS = "type alias"

Används för symboltabellen för type-konstruktioner.

TYPE_PARAMETERS = "type parameters"

Används för symboltabellen i generiska funktioner eller generiska klasser.

TYPE_VARIABLE = "type variable"

Används för symboltabellen för bound, constraint-tupeln eller standardvärdet för en enda typvariabel i formell mening, dvs. en TypeVar, en TypeVarTuple eller ett ParamSpec-objekt (de två senare stöder inte en bound eller en constraint-tuple).

Tillagd i version 3.13.

class symtable.SymbolTable

En namnrymdstabell för ett block. Konstruktören är inte publik.

get_type()

Returnerar typen av symboltabell. Möjliga värden är medlemmar i uppräkningen SymbolTableType.

Ändrad i version 3.12: Lagt till 'annotation', 'TypeVar bound', 'type alias' och 'type parameter' som möjliga returvärden.

Ändrad i version 3.13: Returvärdena är medlemmar i uppräkningen SymbolTableType.

De exakta värdena i den returnerade strängen kan ändras i framtiden, och därför rekommenderas det att använda SymbolTableType-medlemmar i stället för hårdkodade strängar.

get_id()

Returnerar tabellens identifierare.

get_name()

Returnerar tabellens namn. Detta är klassens namn om tabellen är för en klass, funktionens namn om tabellen är för en funktion, eller 'top' om tabellen är global (get_type() returnerar 'module'). För typparameterscopes (som används för generiska klasser, funktioner och typalias) är det namnet på den underliggande klassen, funktionen eller typaliaset. För scope för typalias är det namnet på typaliaset. För TypeVar bound scopes är det namnet på TypeVar.

get_lineno()

Returnera numret på den första raden i det block som denna tabell representerar.

is_optimized()

Returnerar True om lokalavdelningarna i tabellen kan optimeras.

is_nested()

Returnerar True om blocket är en nästlad klass eller funktion.

has_children()

Returnerar True om blocket har nästlade namnrymder inom sig. Dessa kan erhållas med get_children().

get_identifiers()

Returnerar ett view-objekt som innehåller namnen på symbolerna i tabellen. Se dokumentation av view-objekt.

lookup(name)

Leta upp namn i tabellen och returnera en Symbol-instans.

get_symbols()

Returnerar en lista med Symbol-instanser för namn i tabellen.

get_children()

Returnerar en lista över de nästlade symboltabellerna.

class symtable.Function

En namnrymd för en funktion eller metod. Denna klass ärver från SymbolTable.

get_parameters()

Returnerar en tupel som innehåller namn på parametrar till denna funktion.

get_locals()

Returnerar en tupel som innehåller namn på lokala platser i denna funktion.

get_globals()

Returnerar en tupel som innehåller namn på globaler i denna funktion.

get_nonlocals()

Returnerar en tupel som innehåller namn på explicit deklarerade nonlocals i denna funktion.

get_frees()

Returnera en tupel som innehåller namn på fria (stängda) variabler i denna funktion.

class symtable.Class

Ett namnrymd för en klass. Denna klass ärver från SymbolTable.

get_methods()

Returnerar en tupel som innehåller namnen på de metodliknande funktioner som deklarerats i klassen.

Här betecknar termen ”metod” alla funktioner som definieras i klassens kropp via def eller async def.

Funktioner som definieras i ett djupare scope (t.ex. i en inre klass) fångas inte upp av get_methods().

Till exempel:

>>> 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')

Även om A().f() ger upphov till TypeError vid körning, betraktas A.f fortfarande som en metodliknande funktion.

Deprecated since version 3.14, will be removed in version 3.16.

class symtable.Symbol

En post i en SymbolTable som motsvarar en identifierare i källan. Konstruktören är inte publik.

get_name()

Returnera symbolens namn.

is_referenced()

Returnerar True om symbolen används i sitt block.

is_imported()

Returnerar True om symbolen är skapad från en importförklaring.

is_parameter()

Returnerar True om symbolen är en parameter.

is_type_parameter()

Returnerar True om symbolen är en typparameter.

Tillagd i version 3.14.

is_global()

Returnerar True om symbolen är global.

is_nonlocal()

Returnerar True om symbolen är icke-lokal.

is_declared_global()

Returnerar True om symbolen är globalförklarad med en global-sats.

is_local()

Returnerar True om symbolen är lokal för sitt block.

is_annotated()

Returnerar True om symbolen är annoterad.

Tillagd i version 3.6.

is_free()

Returnerar True om symbolen är refererad i sitt block, men inte tilldelad.

is_free_class()

Returnerar True om en klassindelad symbol är fri ur en metods perspektiv.

Tänk på följande exempel:

def f():
    x = 1  # function-scoped
    class C:
        x = 2  # class-scoped
        def method(self):
            return x

I det här exemplet anses den klassindelade symbolen x vara fri ur perspektivet för C.method, vilket gör att den senare kan returnera 1 vid körning och inte 2.

Tillagd i version 3.14.

is_assigned()

Returnerar True om symbolen är tilldelad i sitt block.

is_comp_iter()

Returnerar True om symbolen är en iterationsvariabel i förståelsen.

Tillagd i version 3.14.

is_comp_cell()

Returnerar True om symbolen är en cell i en inlined comprehension.

Tillagd i version 3.14.

is_namespace()

Returnerar True om namnbindningen introducerar en ny namnrymd.

Om namnet används som mål för en funktions- eller klassangivelse kommer detta att vara sant.

Till exempel:

>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True

Observera att ett enda namn kan vara bundet till flera objekt. Om resultatet är True kan namnet också bindas till andra objekt, t.ex. en int eller list, vilket inte innebär att ett nytt namnrymd introduceras.

get_namespaces()

Returnerar en lista över namnrymder som är bundna till detta namn.

get_namespace()

Returnerar namnrymden som är knuten till detta namn. Om mer än en eller ingen namnrymd är bunden till detta namn, kommer ett ValueError att uppstå.

Användning av kommandoraden

Tillagd i version 3.13.

Modulen symtable kan köras som ett skript från kommandoraden.

python -m symtable [infile...]

Symboltabeller genereras för de angivna Python-källfilerna och dumpas till stdout. Om ingen indatafil anges läses innehållet från stdin.