symtable — Доступ к таблицам символов компилятора


Таблицы символов формируются компилятором из AST непосредственно перед формированием байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. symtable обеспечивает интерфейс для изучения этих таблиц.

Создание таблиц символов

symtable.symtable(code, filename, compile_type)

Возвращает SymbolTable верхнего уровня для исходного Python code. filename - имя файла, содержащего код. compile_type похоже на mode аргумент для compile().

Проверка таблиц символов

class symtable.SymbolTable

Таблица пространства имен для блока. Конструктор не публичный.

get_type()

Возвращает тип таблицы обозначений. Возможны значения: 'class', 'module' и 'function'.

get_id()

Возвращает идентификатор таблицы.

get_name()

Возвращает имя таблицы. Это имя класса, если таблица предназначена для класса, имя функции, если таблица предназначена для функции, или 'top', если таблица является глобальной (get_type() возвращает 'module').

get_lineno()

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

is_optimized()

Возвращает True, можно ли оптимизировать локальные адреса в этой таблице.

is_nested()

Возвращает True, является ли блок вложенным классом или функцией.

has_children()

Возвращает True, имеет ли блок вложенные пространства имен. Их можно получить с помощью get_children().

has_exec()

Возвращает True, если блок использует exec.

get_identifiers()

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

lookup(name)

Поиск 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, создается ли символ из оператора import.

is_parameter()

Возвращает True, является ли символ параметром.

is_global()

Возвращает True, является ли символ глобальным.

is_nonlocal()

Возвращает True, является ли символ нелокальным.

is_declared_global()

Возвращает True, если символ объявлен глобальным с оператором global.

is_local()

Возвращает True, если символ локальная к его блоку.

is_annotated()

Возвращает True, если символ аннотирован.

Добавлено в версии 3.6.

is_free()

Возвращает True, имеется ли ссылка на символ в блоке, но не назначена.

is_assigned()

Возвращает True, назначен ли символ в блоке.

is_namespace()

Возвращает True, если имя вводит новое пространство имен.

Если используемое в качестве цели имя функции или оператора class, будет истиной.

Например:

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

Обратите внимание, что одно имя может быть привязано к нескольким объектам. Если результат True, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имен.

get_namespaces()

Возвращает список пространств имен, привязанных к этому имени.

get_namespace()

Возвращает пространство имен, привязанное к этому имени. Если привязано несколько пространств имен, возникает ValueError.