Документация Python неофициальный перевод

symtable.md

313 строк · 15.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.15/library/symtable.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `symtable` – доступ к таблицам символов компилятора89**Исходный код:** [Lib/symtable.py](https://python-all.ru/src/3.15/Lib/symtable.py)1011---1213Таблицы символов создаются компилятором из AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. `symtable` предоставляет интерфейс для просмотра этих таблиц.1415## Генерация таблиц символов1617#### `symtable.symtable(code, filename, compile_type, *, module=None)`1819Возвращает верхнеуровневый [`SymbolTable`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable) для исходного кода Python *code*. *filename* – это имя файла, содержащего код. *compile\_type* – это как аргумент *mode* для [`compile()`](https://python-all.ru/3.15/library/functions.html#compile). Необязательный аргумент *module* задаёт имя модуля. Он нужен, чтобы однозначно [фильтровать](https://python-all.ru/3.15/library/warnings.html#warning-filter) предупреждения синтаксиса по имени модуля.2021Добавлено в версии 3.15: Добавлен параметр *module*.2223## Изучение таблиц символов2425#### `class symtable.SymbolTableType`2627Перечисление, указывающее тип объекта [`SymbolTable`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable).2829#### `MODULE = "module"`3031Используется для таблицы символов модуля.3233#### `FUNCTION = "function"`3435Используется для таблицы символов функции.3637#### `CLASS = "class"`3839Используется для таблицы символов класса.4041Следующие элементы относятся к разным видам [областей видимости аннотаций](https://python-all.ru/3.15/reference/executionmodel.html#annotation-scopes).4243#### `ANNOTATION = "annotation"`4445Используется для аннотаций, если активно `from __future__ import annotations`.4647#### `TYPE_ALIAS = "type alias"`4849Используется для таблицы символов конструкций [`type`](https://python-all.ru/3.15/reference/simple_stmts.html#type).5051#### `TYPE_PARAMETERS = "type parameters"`5253Используется для таблицы символов [обобщённых функций](https://python-all.ru/3.15/reference/compound_stmts.html#generic-functions) или [обобщённых классов](https://python-all.ru/3.15/reference/compound_stmts.html#generic-classes).5455#### `TYPE_VARIABLE = "type variable"`5657Используется для таблицы символов границы, кортежа ограничений или значения по умолчанию отдельной переменной типа в формальном смысле, т.е. объекта TypeVar, TypeVarTuple или ParamSpec (последние два не поддерживают границу или кортеж ограничений).5859Добавлено в версии 3.13.6061#### `class symtable.SymbolTable`6263Таблица пространства имён для блока. Конструктор не является открытым.6465#### `get_type()`6667Возвращает тип таблицы символов. Возможные значения – элементы перечисления [`SymbolTableType`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTableType).6869Изменено в версии 3.12: Добавлены `'annotation'`, `'TypeVar bound'`, `'type alias'` и `'type parameter'` в качестве возможных возвращаемых значений.7071Изменено в версии 3.13: Возвращаемые значения – элементы перечисления [`SymbolTableType`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTableType).7273Точные значения возвращаемой строки могут измениться в будущем, поэтому рекомендуется использовать элементы [`SymbolTableType`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTableType) вместо жёстко заданных строк.7475#### `get_id()`7677Возвращает идентификатор таблицы.7879#### `get_name()`8081Возвращает имя таблицы. Это имя класса, если таблица предназначена для класса, имя функции, если таблица для функции, или `'top'`, если таблица глобальная ([`get_type()`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable.get_type) возвращает `'module'`). Для областей видимости параметров типа (используются для обобщённых классов, функций и псевдонимов типов) это имя базового класса, функции или псевдонима типа. Для областей видимости псевдонимов типов это имя псевдонима типа. Для областей видимости, привязанных к [`TypeVar`](https://python-all.ru/3.15/library/typing.html#typing.TypeVar), это имя `TypeVar`.8283#### `get_lineno()`8485Возвращает номер первой строки в блоке, который представляет эта таблица.8687#### `is_optimized()`8889Возвращает `True`, если локальные переменные в этой таблице можно оптимизировать.9091#### `is_nested()`9293Возвращает `True`, если блок является вложенным классом или функцией.9495#### `has_children()`9697Возвращает `True`, если блок содержит вложенные пространства имён. Их можно получить с помощью [`get_children()`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable.get_children).9899#### `get_identifiers()`100101Возвращает объект представления, содержащий имена символов в таблице. См. [документацию по объектам представления](https://python-all.ru/3.15/library/stdtypes.html#dict-views).102103#### `lookup(name)`104105Выполняет поиск *name* в таблице и возвращает экземпляр [`Symbol`](https://python-all.ru/3.15/library/symtable.html#symtable.Symbol).106107#### `get_symbols()`108109Возвращает список экземпляров [`Symbol`](https://python-all.ru/3.15/library/symtable.html#symtable.Symbol) для имён в таблице.110111#### `get_children()`112113Возвращает список вложенных таблиц символов.114115#### `class symtable.Function`116117Пространство имён для функции или метода. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable).118119#### `get_parameters()`120121Возвращает кортеж, содержащий имена параметров этой функции.122123#### `get_locals()`124125Возвращает кортеж с именами локальных переменных этой функции.126127#### `get_globals()`128129Возвращает кортеж с именами глобальных переменных этой функции.130131#### `get_nonlocals()`132133Возвращает кортеж с именами явно объявленных нелокальных переменных этой функции.134135#### `get_frees()`136137Возвращает кортеж с именами [свободных (замыкающих) переменных](https://python-all.ru/3.15/glossary.html#term-closure-variable) в этой функции.138139#### `get_cells()`140141Возвращает кортеж, содержащий имена [переменных-ячеек](https://python-all.ru/3.15/glossary.html#term-closure-variable) в этой таблице.142143Добавлено в версии 3.15.144145#### `class symtable.Class`146147Пространство имён класса. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable).148149#### `get_methods()`150151Возвращает кортеж, содержащий имена функций, похожих на методы, объявленных в классе.152153Здесь термин «метод» обозначает *любую* функцию, определённую в теле класса с помощью [`def`](https://python-all.ru/3.15/reference/compound_stmts.html#def) или [`async def`](https://python-all.ru/3.15/reference/compound_stmts.html#async-def).154155Функции, определённые в более глубокой области видимости (например, во внутреннем классе), не обнаруживаются с помощью `get_methods()`.156157Например:158159```pycon160>>> import symtable161>>> st = symtable.symtable('''162... def outer(): pass163...164... class A:165...    def f():166...        def w(): pass167...168...    def g(self): pass169...170...    @classmethod171...    async def h(cls): pass172...173...    global outer174...    def outer(self): pass175... ''', 'test', 'exec')176>>> class_A = st.get_children()[2]177>>> class_A.get_methods()178('f', 'g', 'h')179```180181Хотя `A().f()` вызывает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) во время выполнения, `A.f` по-прежнему считается методоподобной функцией.182183Устарело с версии 3.14, будет удалено в версии 3.16.184185#### `class symtable.Symbol`186187Запись в [`SymbolTable`](https://python-all.ru/3.15/library/symtable.html#symtable.SymbolTable), соответствующая идентификатору в исходном коде. Конструктор не является публичным.188189#### `get_name()`190191Возвращает имя символа.192193#### `is_referenced()`194195Возвращает `True`, если символ используется в своём блоке.196197#### `is_imported()`198199Возвращает `True`, если символ создан оператором import.200201#### `is_parameter()`202203Возвращает `True`, если символ является параметром.204205#### `is_type_parameter()`206207Возвращает `True`, если символ является параметром типа.208209Добавлено в версии 3.14.210211#### `is_global()`212213Возвращает `True`, если символ является глобальным.214215#### `is_nonlocal()`216217Возвращает `True`, если символ является нелокальным.218219#### `is_declared_global()`220221Возвращает `True`, если символ объявлен глобальным с помощью инструкции global.222223#### `is_local()`224225Возвращает `True`, если символ является локальным для своего блока.226227#### `is_annotated()`228229Возвращает `True`, если символ аннотирован.230231Добавлено в версии 3.6.232233#### `is_free()`234235Возвращает `True`, если символ используется (на него ссылаются) в своём блоке, но не присваивается ему.236237#### `is_cell()`238239Возвращает `True`, если на символ есть ссылка, но не присваивается во вложенном блоке.240241Добавлено в версии 3.15.242243#### `is_free_class()`244245Возвращает *True*, если символ в области видимости класса является свободным с точки зрения метода.246247Рассмотрим следующий пример:248249```python250def f():251    x = 1  # область видимости функции252    class C:253        x = 2  # область видимости класса254        def method(self):255            return x256```257258В этом примере символ в области видимости класса `x` считается свободным с точки зрения `C.method`, что позволяет последнему возвращать *1* во время выполнения, а не *2*.259260Добавлено в версии 3.14.261262#### `is_assigned()`263264Возвращает `True`, если символу присваивается значение в его блоке.265266#### `is_comp_iter()`267268Возвращает `True`, если символ является переменной итерации в генераторном выражении.269270Добавлено в версии 3.14.271272#### `is_comp_cell()`273274Возвращает `True`, если символ является ячейкой во встроенном генераторном выражении.275276Добавлено в версии 3.14.277278#### `is_namespace()`279280Возвращает `True`, если связывание имени вводит новое пространство имён.281282Если имя используется как цель в инструкции функции или класса, это будет истинно.283284Например:285286```python287>>> table = symtable.symtable("def some_func(): pass", "string", "exec")288>>> table.lookup("some_func").is_namespace()289True290```291292Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результат равен `True`, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имён.293294#### `get_namespaces()`295296Возвращает список пространств имён, связанных с этим именем.297298#### `get_namespace()`299300Возвращает пространство имён, связанное с этим именем. Если с этим именем связано более одного пространства имён или ни одного, вызывается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).301302## Использование командной строки303304Добавлено в версии 3.13.305306Модуль `symtable` можно запускать как скрипт из командной строки.307308```sh309python -m symtable [infile...]310```311312Таблицы символов создаются для указанных исходных файлов Python и выводятся в stdout. Если входной файл не указан, содержимое читается из stdin.313