Содержание страницы
symtable – доступ к таблицам символов компилятора¶symtable – Access to the compiler’s symbol tables
Исходный код: Lib/symtable.py
Таблицы символов создаются компилятором из AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. symtable предоставляет интерфейс для просмотра этих таблиц.
Генерация таблиц символов¶Generating Symbol Tables
- symtable.symtable(code, filename, compile_type)¶
Возвращает корневую
SymbolTableдля исходного кода Python code. filename – имя файла, содержащего код. compile_type аналогичен аргументу mode функцииcompile().
Изучение таблиц символов¶Examining Symbol Tables
- class symtable.SymbolTableType¶
Перечисление, указывающее тип объекта
SymbolTable.- MODULE = "module"¶
Используется для таблицы символов модуля.
- FUNCTION = "function"¶
Используется для таблицы символов функции.
- CLASS = "class"¶
Используется для таблицы символов класса.
Следующие элементы относятся к разным видам областей видимости аннотаций.
- ANNOTATION = "annotation"¶
Используется для аннотаций, если активно
from __future__ import annotations.
- 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()¶
Возвращает объект представления, содержащий имена символов в таблице. См. документацию по объектам представления.
- 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()[1] >>> class_A.get_methods() ('f', 'g', 'h')
Хотя
A().f()вызываетTypeErrorво время выполнения,A.fпо-прежнему считается методоподобной функцией.
- 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, если связывание имени вводит новое пространство имён.Если имя используется как цель в инструкции функции или класса, это будет истинно.
Например:
>>> table = symtable.symtable("def some_func(): pass", "string", "exec") >>> table.lookup("some_func").is_namespace() True
Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результат равен
True, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имён.
- get_namespaces()¶
Возвращает список пространств имён, связанных с этим именем.
- get_namespace()¶
Возвращает пространство имён, связанное с этим именем. Если с этим именем связано более одного пространства имён или ни одного, вызывается
ValueError.
Использование командной строки¶Command-Line Usage
Добавлено в версии 3.13.
Модуль symtable можно запускать как скрипт из командной строки.
python -m symtable [infile...]
Таблицы символов создаются для указанных исходных файлов Python и выводятся в stdout. Если входной файл не указан, содержимое читается из stdin.