Spec-Zone.ru › Python 3.14

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API