symtable
— Доступ к таблицам символов компилятора¶
Источник: Lib/symtable.py
Таблицы символов генерируются компилятором из AST непосредственно перед созданием байткода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. symtable
предоставляет интерфейс для изучения этих таблиц.
Генерация таблиц символов¶
- symtable.symtable(code, filename, compile_type)¶
Возвращает уровень
SymbolTable
для исходного кода языка Python. filename - имя файла, содержащего код. compile_type подобен аргументу mode вcompile()
.
Изучение таблиц символов¶
- class symtable.SymbolTable¶
Таблица пространства имен для блока. Конструктор не является публичным.
- get_type()¶
Возвращает тип таблицы символов. Возможные значения:
'class'
,'module'
,'function'
,'annotation'
,'TypeVar bound'
,'type alias'
и'type parameter'
. Последние четыре относятся к различным вариантам annotation scopes.Изменено в версии 3.12: Добавлены
'annotation'
,'TypeVar bound'
,'type alias'
и'type parameter'
в качестве возможных возвращаемых значений.
- get_id()¶
Возвращает идентификатор таблицы.
- get_name()¶
Возвращает имя таблицы. Это имя класса, если таблица предназначена для класса, имя функции, если таблица предназначена для функции, или
'top'
, если таблица является глобальной (get_type()
возвращает'module'
). Для диапазонов параметров типа (которые используются для общих классов, функций и псевдонимов типов) это имя базового класса, функции или псевдонима типа. Для диапазонов псевдонимов типов это имя псевдонима типа. Для диапазонов, связанных сTypeVar
, это имяTypeVar
.
- get_lineno()¶
Возвращает номер первой строки в блоке, который представляет эта таблица.
- is_optimized()¶
Возвращает
True
, если локали в этой таблице могут быть оптимизированы.
- is_nested()¶
Возвращает
True
, если блок является вложенным классом или функцией.
- has_children()¶
Возвращает
True
, если в блоке есть вложенные пространства имен. Их можно получить с помощьюget_children()
.
- get_identifiers()¶
Возвращает объект представления, содержащий имена символов в таблице. Смотрите documentation of view objects.
- get_children()¶
Возвращает список вложенных таблиц символов.
- class symtable.Function¶
Пространство имен для функции или метода. Этот класс наследуется от
SymbolTable
.- get_parameters()¶
Возвращает кортеж, содержащий имена параметров этой функции.
- get_locals()¶
Возвращает кортеж, содержащий имена локалей в этой функции.
- get_globals()¶
Возвращает кортеж, содержащий имена глобалов в этой функции.
- get_nonlocals()¶
Возвращает кортеж, содержащий имена нелокальных элементов в этой функции.
- get_frees()¶
Возвращает кортеж, содержащий имена свободных переменных в этой функции.
- class symtable.Class¶
Пространство имен класса. Этот класс наследуется от
SymbolTable
.- get_methods()¶
Возвращает кортеж, содержащий имена методов, объявленных в классе.
- class symtable.Symbol¶
Запись в
SymbolTable
, соответствующая идентификатору в источнике. Конструктор не является публичным.- get_name()¶
Возвращает имя символа.
- is_referenced()¶
Возвращает
True
, если символ используется в своем блоке.
- is_imported()¶
Возвращает
True
, если символ создан из оператора импорта.
- is_parameter()¶
Возвращает
True
, если символ является параметром.
- is_global()¶
Возвращает
True
, если символ является глобальным.
- is_nonlocal()¶
Возвращает
True
, если символ нелокальный.
- is_declared_global()¶
Возвращает
True
, если символ объявлен глобальным с помощью оператора global.
- is_local()¶
Возвращает
True
, если символ является локальным для своего блока.
- is_annotated()¶
Возвращает
True
, если символ аннотирован.Added in version 3.6.
- is_free()¶
Возвращает
True
, если на символ есть ссылка в его блоке, но он не присвоен.
- is_assigned()¶
Возвращает
True
, если символ назначен в своем блоке.
- is_namespace()¶
Возвращает
True
, если привязка имени вводит новое пространство имен.Если имя используется в качестве цели оператора функции или класса, это будет верно.
Например:
>>> table = symtable.symtable("def some_func(): pass", "string", "exec") >>> table.lookup("some_func").is_namespace() True
Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результатом является
True
, то имя может быть привязано и к другим объектам, например, к int или списку, что не вводит нового пространства имен.
- get_namespaces()¶
Возвращает список пространств имен, связанных с этим именем.
- get_namespace()¶
Возвращает пространство имен, связанное с этим именем. Если к этому имени привязано более одного пространства имен или ни одно из них не привязано, выдается сообщение
ValueError
.
Использование командной строки¶
Added in version 3.13.
Модуль symtable
может быть выполнен как сценарий из командной строки.
python -m symtable [infile...]
Таблицы символов генерируются для указанных исходных файлов Python и выводятся в stdout. Если входной файл не указан, содержимое считывается из stdin.