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

symtable.md

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

1> **Источник:** https://python-all.ru/3.13/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.13/Lib/symtable.py)1011---1213Таблицы символов создаются компилятором из AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. `symtable` предоставляет интерфейс для просмотра этих таблиц.1415## Генерация таблиц символов1617#### `symtable.symtable(code, filename, compile_type)`1819Возвращает корневую [`SymbolTable`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable) для исходного кода Python *code*. *filename* – имя файла, содержащего код. *compile\_type* аналогичен аргументу *mode* функции [`compile()`](https://python-all.ru/3.13/library/functions.html#compile).2021## Изучение таблиц символов2223#### `class symtable.SymbolTableType`2425Перечисление, указывающее тип объекта [`SymbolTable`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable).2627#### `MODULE = "module"`2829Используется для таблицы символов модуля.3031#### `FUNCTION = "function"`3233Используется для таблицы символов функции.3435#### `CLASS = "class"`3637Используется для таблицы символов класса.3839Следующие элементы относятся к разным видам [областей видимости аннотаций](https://python-all.ru/3.13/reference/executionmodel.html#annotation-scopes).4041#### `ANNOTATION = "annotation"`4243Используется для аннотаций, если активно `from __future__ import annotations`.4445#### `TYPE_ALIAS = "type alias"`4647Используется для таблицы символов конструкций [`type`](https://python-all.ru/3.13/reference/simple_stmts.html#type).4849#### `TYPE_PARAMETERS = "type parameters"`5051Используется для таблицы символов [обобщённых функций](https://python-all.ru/3.13/reference/compound_stmts.html#generic-functions) или [обобщённых классов](https://python-all.ru/3.13/reference/compound_stmts.html#generic-classes).5253#### `TYPE_VARIABLE = "type variable"`5455Используется для таблицы символов границы, кортежа ограничений или значения по умолчанию отдельной переменной типа в формальном смысле, т.е. объекта TypeVar, TypeVarTuple или ParamSpec (последние два не поддерживают границу или кортеж ограничений).5657Добавлено в версии 3.13.5859#### `class symtable.SymbolTable`6061Таблица пространства имён для блока. Конструктор не является открытым.6263#### `get_type()`6465Возвращает тип таблицы символов. Возможные значения – элементы перечисления [`SymbolTableType`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTableType).6667Изменено в версии 3.12: Добавлены `'annotation'`, `'TypeVar bound'`, `'type alias'` и `'type parameter'` в качестве возможных возвращаемых значений.6869Изменено в версии 3.13: Возвращаемые значения – элементы перечисления [`SymbolTableType`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTableType).7071Точные значения возвращаемой строки могут измениться в будущем, поэтому рекомендуется использовать элементы [`SymbolTableType`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTableType) вместо жёстко заданных строк.7273#### `get_id()`7475Возвращает идентификатор таблицы.7677#### `get_name()`7879Возвращает имя таблицы. Это имя класса, если таблица предназначена для класса, имя функции, если таблица для функции, или `'top'`, если таблица глобальная ([`get_type()`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable.get_type) возвращает `'module'`). Для областей видимости параметров типа (используются для обобщённых классов, функций и псевдонимов типов) это имя базового класса, функции или псевдонима типа. Для областей видимости псевдонимов типов это имя псевдонима типа. Для областей видимости, привязанных к [`TypeVar`](https://python-all.ru/3.13/library/typing.html#typing.TypeVar), это имя `TypeVar`.8081#### `get_lineno()`8283Возвращает номер первой строки в блоке, который представляет эта таблица.8485#### `is_optimized()`8687Возвращает `True`, если локальные переменные в этой таблице можно оптимизировать.8889#### `is_nested()`9091Возвращает `True`, если блок является вложенным классом или функцией.9293#### `has_children()`9495Возвращает `True`, если блок содержит вложенные пространства имён. Их можно получить с помощью [`get_children()`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable.get_children).9697#### `get_identifiers()`9899Возвращает объект представления, содержащий имена символов в таблице. См. [документацию по объектам представления](https://python-all.ru/3.13/library/stdtypes.html#dict-views).100101#### `lookup(name)`102103Выполняет поиск *name* в таблице и возвращает экземпляр [`Symbol`](https://python-all.ru/3.13/library/symtable.html#symtable.Symbol).104105#### `get_symbols()`106107Возвращает список экземпляров [`Symbol`](https://python-all.ru/3.13/library/symtable.html#symtable.Symbol) для имён в таблице.108109#### `get_children()`110111Возвращает список вложенных таблиц символов.112113#### `class symtable.Function`114115Пространство имён для функции или метода. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable).116117#### `get_parameters()`118119Возвращает кортеж, содержащий имена параметров этой функции.120121#### `get_locals()`122123Возвращает кортеж с именами локальных переменных этой функции.124125#### `get_globals()`126127Возвращает кортеж с именами глобальных переменных этой функции.128129#### `get_nonlocals()`130131Возвращает кортеж с именами явно объявленных нелокальных переменных этой функции.132133#### `get_frees()`134135Возвращает кортеж с именами [свободных (замыкающих) переменных](https://python-all.ru/3.13/glossary.html#term-closure-variable) в этой функции.136137#### `class symtable.Class`138139Пространство имён класса. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable).140141#### `get_methods()`142143Возвращает кортеж, содержащий имена функций, похожих на методы, объявленных в классе.144145Здесь термин «метод» обозначает *любую* функцию, определённую в теле класса с помощью [`def`](https://python-all.ru/3.13/reference/compound_stmts.html#def) или [`async def`](https://python-all.ru/3.13/reference/compound_stmts.html#async-def).146147Функции, определённые в более глубокой области видимости (например, во внутреннем классе), не обнаруживаются с помощью `get_methods()`.148149Например:150151```python152>>> import symtable153>>> st = symtable.symtable('''154... def outer(): pass155...156... class A:157...    def f():158...        def w(): pass159...160...    def g(self): pass161...162...    @classmethod163...    async def h(cls): pass164...165...    global outer166...    def outer(self): pass167... ''', 'test', 'exec')168>>> class_A = st.get_children()[1]169>>> class_A.get_methods()170('f', 'g', 'h')171```172173Хотя `A().f()` вызывает [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError) во время выполнения, `A.f` по-прежнему считается методоподобной функцией.174175#### `class symtable.Symbol`176177Запись в [`SymbolTable`](https://python-all.ru/3.13/library/symtable.html#symtable.SymbolTable), соответствующая идентификатору в исходном коде. Конструктор не является публичным.178179#### `get_name()`180181Возвращает имя символа.182183#### `is_referenced()`184185Возвращает `True`, если символ используется в своём блоке.186187#### `is_imported()`188189Возвращает `True`, если символ создан оператором import.190191#### `is_parameter()`192193Возвращает `True`, если символ является параметром.194195#### `is_global()`196197Возвращает `True`, если символ является глобальным.198199#### `is_nonlocal()`200201Возвращает `True`, если символ является нелокальным.202203#### `is_declared_global()`204205Возвращает `True`, если символ объявлен глобальным с помощью инструкции global.206207#### `is_local()`208209Возвращает `True`, если символ является локальным для своего блока.210211#### `is_annotated()`212213Возвращает `True`, если символ аннотирован.214215Добавлено в версии 3.6.216217#### `is_free()`218219Возвращает `True`, если символ используется (на него ссылаются) в своём блоке, но не присваивается ему.220221#### `is_assigned()`222223Возвращает `True`, если символу присваивается значение в его блоке.224225#### `is_namespace()`226227Возвращает `True`, если связывание имени вводит новое пространство имён.228229Если имя используется как цель в инструкции функции или класса, это будет истинно.230231Например:232233```python234>>> table = symtable.symtable("def some_func(): pass", "string", "exec")235>>> table.lookup("some_func").is_namespace()236True237```238239Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результат равен `True`, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имён.240241#### `get_namespaces()`242243Возвращает список пространств имён, связанных с этим именем.244245#### `get_namespace()`246247Возвращает пространство имён, связанное с этим именем. Если с этим именем связано более одного пространства имён или ни одного, вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).248249## Использование командной строки250251Добавлено в версии 3.13.252253Модуль `symtable` можно запускать как скрипт из командной строки.254255```sh256python -m symtable [infile...]257```258259Таблицы символов создаются для указанных исходных файлов Python и выводятся в stdout. Если входной файл не указан, содержимое читается из stdin.260