symtable — доступ к таблицам символов компилятора
Исходный код: Lib/symtable.py
Таблицы символов создаются компилятором на основе AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. symtable предоставляет интерфейс для изучения этих таблиц.
Создание таблиц символов
-
symtable.symtable(code, filename, compile_type) -
Возвращает
SymbolTableверхнего уровня для исходного кода Python code. filename — имя файла, содержащего код. compile_type аналогичен аргументу mode функцииcompile().
Изучение таблиц символов
-
class symtable.SymbolTableType -
Перечисление, указывающее тип объекта
SymbolTable.-
MODULE = "module" -
Используется для таблицы символов модуля.
-
FUNCTION = "function" -
Используется для таблицы символов функции.
-
CLASS = "class" -
Используется для таблицы символов класса.
Следующие элементы относятся к различным разновидностям областей видимости аннотаций.
-
ANNOTATION = "annotation" -
Используется для аннотаций, если активен режим
from __future__ import annotations.
-
TYPE_ALIAS = "type alias" -
Используется для таблицы символов конструкций
type.
-
TYPE_PARAMETERS = "type parameters" -
Используется для таблицы символов обобщённых функций или обобщённых классов.
-
TYPE_VARIABLE = "type variable" -
Используется для таблицы символов привязки, кортежа ограничений или значения по умолчанию одной переменной типа в формальном смысле, то есть объекта TypeVar, TypeVarTuple или ParamSpec (два последних не поддерживают привязку или кортеж ограничений).
Добавлено в версии 3.13.
-
-
class symtable.SymbolTable -
Таблица пространства имён для блока. Конструктор не является публичным.
-
get_type() -
Возвращает тип таблицы символов. Возможные значения — элементы перечисления
SymbolTableType.Изменено в версии 3.12: Добавлены
'annotation','TypeVar bound','type alias'и'type parameter'в качестве возможных возвращаемых значений.Изменено в версии 3.13: Возвращаемые значения являются элементами перечисления
SymbolTableType.Точные значения возвращаемой строки могут измениться в будущем, поэтому рекомендуется использовать элементы
SymbolTableTypeвместо строк, заданных непосредственно в коде.
-
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() -
Возвращает объект-представление, содержащий имена символов в таблице. См. документацию по объектам-представлениям.
-
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() -
Возвращает кортеж, содержащий имена функций, похожих на методы, объявленных в классе.
Здесь термин «метод» обозначает любую функцию, определённую в теле класса с помощью
defилиasync def.Функции, определённые во вложенной области видимости (например, во вложенном классе), не обнаруживаются с помощью
get_methods().Например:
>>> 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')Хотя
A().f()вызываетTypeErrorво время выполнения,A.fвсё равно считается функцией, похожей на метод.Устарело с версии 3.14; будет удалено в версии 3.16.
-
-
class symtable.Symbol -
Запись в
SymbolTable, соответствующая идентификатору в исходном коде. Конструктор не является публичным.-
get_name() -
Возвращает имя символа.
-
is_referenced() -
Возвращает
True, если символ используется в своём блоке.
-
is_imported() -
Возвращает
True, если символ создан оператором импорта.
-
is_parameter() -
Возвращает
True, если символ является параметром.
-
is_type_parameter() -
Возвращает
True, если символ является параметром типа.Добавлено в версии 3.14.
-
is_global() -
Возвращает
True, если символ является глобальным.
-
is_nonlocal() -
Возвращает
True, если символ является нелокальным.
-
is_declared_global() -
Возвращает
True, если символ объявлен глобальным с помощью оператора global.
-
is_local() -
Возвращает
True, если символ является локальным для своего блока.
-
is_annotated() -
Возвращает
True, если символ аннотирован.Добавлено в версии 3.6.
-
is_free() -
Возвращает
True, если символ используется в своём блоке, но ему не присваивается значение.
-
is_free_class() -
Возвращает True, если символ в области видимости класса является свободным с точки зрения метода.
Рассмотрим следующий пример:
def f(): x = 1 # function-scoped class C: x = 2 # class-scoped def method(self): return xВ этом примере символ
xиз области видимости класса считается свободным с точки зренияC.method, что позволяет последнему вернуть во время выполнения 1, а не 2.Добавлено в версии 3.14.
-
is_assigned() -
Возвращает
True, если символу присваивается значение в его блоке.
-
is_comp_iter() -
Возвращает
True, если символ является переменной итерации в генераторном выражении.Добавлено в версии 3.14.
-
is_comp_cell() -
Возвращает
True, если символ является ячейкой во встроенном генераторном выражении.Добавлено в версии 3.14.
-
is_namespace() -
Возвращает
True, если привязка имени создаёт новое пространство имён.Это будет так, если имя используется в качестве цели оператора объявления функции или класса.
Например:
>>> table = symtable.symtable("def some_func(): pass", "string", "exec") >>> table.lookup("some_func").is_namespace() TrueОбратите внимание, что одному имени могут соответствовать несколько объектов. Если результат —
True, имя также может быть связано с другими объектами, например с целым числом или списком, которые не создают нового пространства имён.
-
get_namespaces() -
Возвращает список пространств имён, связанных с этим именем.
-
get_namespace() -
Возвращает пространство имён, связанное с этим именем. Если с этим именем связано несколько пространств имён или ни одного, возбуждается исключение
ValueError.
-
Использование командной строки
Добавлено в версии 3.13.
Модуль symtable можно запустить из командной строки как скрипт.
python -m symtable [infile...]
Для указанных исходных файлов Python создаются таблицы символов, которые выводятся в stdout. Если входной файл не указан, содержимое считывается из stdin.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/symtable.html