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 tillcompile()
.
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_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örTypeVar
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 medget_children()
.
- get_identifiers()¶
Returnerar ett view-objekt som innehåller namnen på symbolerna i tabellen. Se dokumentation av view-objekt.
- 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
ellerasync 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 tillTypeError
vid körning, betraktasA.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örC.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.