> **Источник:** https://python-all.ru/3.9/library/symtable.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# [`symtable`](https://python-all.ru/3.9/library/symtable.html#module-symtable) – доступ к таблицам символов компилятора

**Исходный код:** [Lib/symtable.py](https://python-all.ru/src/3.9/Lib/symtable.py)

---

Таблицы символов создаются компилятором из AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. [`symtable`](https://python-all.ru/3.9/library/symtable.html#module-symtable) предоставляет интерфейс для просмотра этих таблиц.

## Генерация таблиц символов

#### `symtable.symtable(code, filename, compile_type)`

Возвращает корневую [`SymbolTable`](https://python-all.ru/3.9/library/symtable.html#symtable.SymbolTable) для исходного кода Python *code*. *filename* – имя файла, содержащего код. *compile\_type* аналогичен аргументу *mode* функции [`compile()`](https://python-all.ru/3.9/library/functions.html#compile).

## Изучение таблиц символов

#### `class symtable.SymbolTable`

Таблица пространства имён для блока. Конструктор не является открытым.

#### `get_type()`

Возвращает тип таблицы символов. Возможные значения: `'class'`, `'module'` и `'function'`.

#### `get_id()`

Возвращает идентификатор таблицы.

#### `get_name()`

Возвращает имя таблицы. Это имя класса, если таблица для класса, имя функции, если таблица для функции, или `'top'`, если таблица глобальная ([`get_type()`](https://python-all.ru/3.9/library/symtable.html#symtable.SymbolTable.get_type) возвращает `'module'`).

#### `get_lineno()`

Возвращает номер первой строки в блоке, который представляет эта таблица.

#### `is_optimized()`

Возвращает `True`, если локальные переменные в этой таблице можно оптимизировать.

#### `is_nested()`

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

#### `has_children()`

Возвращает `True`, если блок содержит вложенные пространства имён. Их можно получить с помощью [`get_children()`](https://python-all.ru/3.9/library/symtable.html#symtable.SymbolTable.get_children).

#### `get_identifiers()`

Возвращает список имён символов в этой таблице.

#### `lookup(name)`

Выполняет поиск *name* в таблице и возвращает экземпляр [`Symbol`](https://python-all.ru/3.9/library/symtable.html#symtable.Symbol).

#### `get_symbols()`

Возвращает список экземпляров [`Symbol`](https://python-all.ru/3.9/library/symtable.html#symtable.Symbol) для имён в таблице.

#### `get_children()`

Возвращает список вложенных таблиц символов.

#### `class symtable.Function`

Пространство имён для функции или метода. Этот класс наследует [`SymbolTable`](https://python-all.ru/3.9/library/symtable.html#symtable.SymbolTable).

#### `get_parameters()`

Возвращает кортеж, содержащий имена параметров этой функции.

#### `get_locals()`

Возвращает кортеж с именами локальных переменных этой функции.

#### `get_globals()`

Возвращает кортеж с именами глобальных переменных этой функции.

#### `get_nonlocals()`

Возвращает кортеж с именами нелокальных переменных в этой функции.

#### `get_frees()`

Возвращает кортеж с именами свободных переменных в этой функции.

#### `class symtable.Class`

Пространство имён класса. Этот класс наследует [`SymbolTable`](https://python-all.ru/3.9/library/symtable.html#symtable.SymbolTable).

#### `get_methods()`

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

#### `class symtable.Symbol`

Запись в [`SymbolTable`](https://python-all.ru/3.9/library/symtable.html#symtable.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`, если связывание имени вводит новое пространство имён.

Если имя используется как цель в инструкции функции или класса, это будет истинно.

Например:

```python
>>> table = symtable.symtable("def some_func(): pass", "string", "exec")
>>> table.lookup("some_func").is_namespace()
True
```

Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результат равен `True`, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имён.

#### `get_namespaces()`

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

#### `get_namespace()`

Возвращает пространство имён, привязанное к этому имени. Если привязано более одного пространства имён, вызывается [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).
