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

symtable.md

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

1> **Источник:** https://python-all.ru/3.12/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.12/Lib/symtable.py)1011---1213Таблицы символов создаются компилятором из AST непосредственно перед генерацией байт-кода. Таблица символов отвечает за вычисление области видимости каждого идентификатора в коде. [`symtable`](https://python-all.ru/3.12/library/symtable.html#module-symtable) предоставляет интерфейс для просмотра этих таблиц.1415## Генерация таблиц символов1617#### `symtable.symtable(code, filename, compile_type)`1819Возвращает корневую [`SymbolTable`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable) для исходного кода Python *code*. *filename* – имя файла, содержащего код. *compile\_type* аналогичен аргументу *mode* функции [`compile()`](https://python-all.ru/3.12/library/functions.html#compile).2021## Изучение таблиц символов2223#### `class symtable.SymbolTable`2425Таблица пространства имён для блока. Конструктор не является открытым.2627#### `get_type()`2829Возвращает тип таблицы символов. Возможные значения: `'class'`, `'module'`, `'function'`, `'annotation'`, `'TypeVar bound'`, `'type alias'` и `'type parameter'`. Последние четыре относятся к разным разновидностям [областей аннотаций](https://python-all.ru/3.12/reference/executionmodel.html#annotation-scopes).3031Изменено в версии 3.12: Добавлены `'annotation'`, `'TypeVar bound'`, `'type alias'` и `'type parameter'` в качестве возможных возвращаемых значений.3233#### `get_id()`3435Возвращает идентификатор таблицы.3637#### `get_name()`3839Возвращает имя таблицы. Это имя класса, если таблица предназначена для класса, имя функции, если таблица для функции, или `'top'`, если таблица глобальная ([`get_type()`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable.get_type) возвращает `'module'`). Для областей видимости параметров типа (используются для обобщённых классов, функций и псевдонимов типов) это имя базового класса, функции или псевдонима типа. Для областей видимости псевдонимов типов это имя псевдонима типа. Для областей видимости, привязанных к [`TypeVar`](https://python-all.ru/3.12/library/typing.html#typing.TypeVar), это имя `TypeVar`.4041#### `get_lineno()`4243Возвращает номер первой строки в блоке, который представляет эта таблица.4445#### `is_optimized()`4647Возвращает `True`, если локальные переменные в этой таблице можно оптимизировать.4849#### `is_nested()`5051Возвращает `True`, если блок является вложенным классом или функцией.5253#### `has_children()`5455Возвращает `True`, если блок содержит вложенные пространства имён. Их можно получить с помощью [`get_children()`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable.get_children).5657#### `get_identifiers()`5859Возвращает объект представления, содержащий имена символов в таблице. См. [документацию по объектам представления](https://python-all.ru/3.12/library/stdtypes.html#dict-views).6061#### `lookup(name)`6263Выполняет поиск *name* в таблице и возвращает экземпляр [`Symbol`](https://python-all.ru/3.12/library/symtable.html#symtable.Symbol).6465#### `get_symbols()`6667Возвращает список экземпляров [`Symbol`](https://python-all.ru/3.12/library/symtable.html#symtable.Symbol) для имён в таблице.6869#### `get_children()`7071Возвращает список вложенных таблиц символов.7273#### `class symtable.Function`7475Пространство имён для функции или метода. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable).7677#### `get_parameters()`7879Возвращает кортеж, содержащий имена параметров этой функции.8081#### `get_locals()`8283Возвращает кортеж с именами локальных переменных этой функции.8485#### `get_globals()`8687Возвращает кортеж с именами глобальных переменных этой функции.8889#### `get_nonlocals()`9091Возвращает кортеж с именами нелокальных переменных в этой функции.9293#### `get_frees()`9495Возвращает кортеж с именами свободных переменных в этой функции.9697#### `class symtable.Class`9899Пространство имён класса. Этот класс наследует от [`SymbolTable`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable).100101#### `get_methods()`102103Возвращает кортеж, содержащий имена функций, похожих на методы, объявленных в классе.104105Здесь термин «метод» обозначает *любую* функцию, определённую в теле класса с помощью [`def`](https://python-all.ru/3.12/reference/compound_stmts.html#def) или [`async def`](https://python-all.ru/3.12/reference/compound_stmts.html#async-def).106107Функции, определённые в более глубокой области видимости (например, во внутреннем классе), не обнаруживаются с помощью [`get_methods()`](https://python-all.ru/3.12/library/symtable.html#symtable.Class.get_methods).108109Например:110111```python112>>> import symtable113>>> st = symtable.symtable('''114... def outer(): pass115...116... class A:117...    def f():118...        def w(): pass119...120...    def g(self): pass121...122...    @classmethod123...    async def h(cls): pass124...125...    global outer126...    def outer(self): pass127... ''', 'test', 'exec')128>>> class_A = st.get_children()[1]129>>> class_A.get_methods()130('f', 'g', 'h')131```132133Хотя `A().f()` вызывает [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError) во время выполнения, `A.f` по-прежнему считается методоподобной функцией.134135#### `class symtable.Symbol`136137Запись в [`SymbolTable`](https://python-all.ru/3.12/library/symtable.html#symtable.SymbolTable), соответствующая идентификатору в исходном коде. Конструктор не является публичным.138139#### `get_name()`140141Возвращает имя символа.142143#### `is_referenced()`144145Возвращает `True`, если символ используется в своём блоке.146147#### `is_imported()`148149Возвращает `True`, если символ создан оператором import.150151#### `is_parameter()`152153Возвращает `True`, если символ является параметром.154155#### `is_global()`156157Возвращает `True`, если символ является глобальным.158159#### `is_nonlocal()`160161Возвращает `True`, если символ является нелокальным.162163#### `is_declared_global()`164165Возвращает `True`, если символ объявлен глобальным с помощью инструкции global.166167#### `is_local()`168169Возвращает `True`, если символ является локальным для своего блока.170171#### `is_annotated()`172173Возвращает `True`, если символ аннотирован.174175Добавлено в версии 3.6.176177#### `is_free()`178179Возвращает `True`, если символ используется (на него ссылаются) в своём блоке, но не присваивается ему.180181#### `is_assigned()`182183Возвращает `True`, если символу присваивается значение в его блоке.184185#### `is_namespace()`186187Возвращает `True`, если связывание имени вводит новое пространство имён.188189Если имя используется как цель в инструкции функции или класса, это будет истинно.190191Например:192193```python194>>> table = symtable.symtable("def some_func(): pass", "string", "exec")195>>> table.lookup("some_func").is_namespace()196True197```198199Обратите внимание, что одно имя может быть связано с несколькими объектами. Если результат равен `True`, имя также может быть связано с другими объектами, такими как int или list, которые не вводят новое пространство имён.200201#### `get_namespaces()`202203Возвращает список пространств имён, связанных с этим именем.204205#### `get_namespace()`206207Возвращает пространство имён, связанное с этим именем. Если с этим именем связано более одного пространства имён или ни одного, вызывается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).208