Spec-Zone.ru › Python 3.12

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'. Последние четыре относятся к различным видам области применения аннотаций.

Изменено в версии 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()

Возвращает объект представления, содержащий имена символов в таблице. См. документацию по объектам представления.

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()

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

Здесь термин «метод» обозначает любую функцию, определённую в теле класса с помощью 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, если символ создан из инструкции импорта.

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, имя может также быть привязано к другим объектам, таким как целое число или список, которые не вводят новое пространство имен.

get_namespaces()

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

get_namespace()

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

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/symtable.html

Spec-Zone.ru

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