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