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.

lookup(name)

Найдите имя в таблице и верните экземпляр Symbol.

get_symbols()

Возвращает список экземпляров Symbol для имен в таблице.

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.