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

ast.md

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

1> **Источник:** https://python-all.ru/3.12/library/ast.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `ast` – абстрактные синтаксические деревья89**Исходный код:** [Lib/ast.py](https://python-all.ru/src/3.12/Lib/ast.py)1011---1213Модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) помогает приложениям Python обрабатывать деревья абстрактного синтаксиса языка Python. Абстрактный синтаксис может меняться от версии к версии; с помощью этого модуля можно программно узнать, как выглядит текущая грамматика.1415Абстрактное синтаксическое дерево можно создать, передав [`ast.PyCF_ONLY_AST`](https://python-all.ru/3.12/library/ast.html#ast.PyCF_ONLY_AST) в качестве флага встроенной функции [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) или используя вспомогательную функцию [`parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) из этого модуля. Результатом будет дерево объектов, классы которых наследуют от [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST). Абстрактное синтаксическое дерево можно скомпилировать в объект кода Python с помощью встроенной функции [`compile()`](https://python-all.ru/3.12/library/functions.html#compile).1617## Абстрактная грамматика1819Абстрактная грамматика в настоящее время определяется следующим образом:2021```asdl22-- Встроенные типы ASDL:23-- идентификатор, целое, строка, константа2425module Python26{27    mod = Module(stmt* body, type_ignore* type_ignores)28        | Interactive(stmt* body)29        | Expression(expr body)30        | FunctionType(expr* argtypes, expr returns)3132    stmt = FunctionDef(identifier name, arguments args,33                       stmt* body, expr* decorator_list, expr? returns,34                       string? type_comment, type_param* type_params)35          | AsyncFunctionDef(identifier name, arguments args,36                             stmt* body, expr* decorator_list, expr? returns,37                             string? type_comment, type_param* type_params)3839          | ClassDef(identifier name,40             expr* bases,41             keyword* keywords,42             stmt* body,43             expr* decorator_list,44             type_param* type_params)45          | Return(expr? value)4647          | Delete(expr* targets)48          | Assign(expr* targets, expr value, string? type_comment)49          | TypeAlias(expr name, type_param* type_params, expr value)50          | AugAssign(expr target, operator op, expr value)51          -- 'simple' указывает, что аннотируется простое имя без скобок52          | AnnAssign(expr target, expr annotation, expr? value, int simple)5354          -- используется 'orelse', так как else – ключевое слово в целевых языках55          | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)56          | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)57          | While(expr test, stmt* body, stmt* orelse)58          | If(expr test, stmt* body, stmt* orelse)59          | With(withitem* items, stmt* body, string? type_comment)60          | AsyncWith(withitem* items, stmt* body, string? type_comment)6162          | Match(expr subject, match_case* cases)6364          | Raise(expr? exc, expr? cause)65          | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)66          | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)67          | Assert(expr test, expr? msg)6869          | Import(alias* names)70          | ImportFrom(identifier? module, alias* names, int? level)7172          | Global(identifier* names)73          | Nonlocal(identifier* names)74          | Expr(expr value)75          | Pass | Break | Continue7677          -- col_offset – это смещение в байтах в строке UTF-8, используемой парсером78          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)7980          -- BoolOp() может использовать left и right?81    expr = BoolOp(boolop op, expr* values)82         | NamedExpr(expr target, expr value)83         | BinOp(expr left, operator op, expr right)84         | UnaryOp(unaryop op, expr operand)85         | Lambda(arguments args, expr body)86         | IfExp(expr test, expr body, expr orelse)87         | Dict(expr* keys, expr* values)88         | Set(expr* elts)89         | ListComp(expr elt, comprehension* generators)90         | SetComp(expr elt, comprehension* generators)91         | DictComp(expr key, expr value, comprehension* generators)92         | GeneratorExp(expr elt, comprehension* generators)93         -- грамматика ограничивает, где могут встречаться выражения yield94         | Await(expr value)95         | Yield(expr? value)96         | YieldFrom(expr value)97         -- нужны последовательности для сравнения, чтобы различать98         -- x < 4 < 3 and (x < 4) < 399         | Compare(expr left, cmpop* ops, expr* comparators)100         | Call(expr func, expr* args, keyword* keywords)101         | FormattedValue(expr value, int conversion, expr? format_spec)102         | JoinedStr(expr* values)103         | Constant(constant value, string? kind)104105         -- следующее выражение может появляться в контексте присваивания106         | Attribute(expr value, identifier attr, expr_context ctx)107         | Subscript(expr value, expr slice, expr_context ctx)108         | Starred(expr value, expr_context ctx)109         | Name(identifier id, expr_context ctx)110         | List(expr* elts, expr_context ctx)111         | Tuple(expr* elts, expr_context ctx)112113         -- может встречаться только в Subscript114         | Slice(expr? lower, expr? upper, expr? step)115116          -- col_offset – это смещение в байтах в строке UTF-8, используемой парсером117          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)118119    expr_context = Load | Store | Del120121    boolop = And | Or122123    operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift124                 | RShift | BitOr | BitXor | BitAnd | FloorDiv125126    unaryop = Invert | Not | UAdd | USub127128    cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn129130    comprehension = (expr target, expr iter, expr* ifs, int is_async)131132    excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)133                    attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)134135    arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,136                 expr* kw_defaults, arg? kwarg, expr* defaults)137138    arg = (identifier arg, expr? annotation, string? type_comment)139           attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)140141    -- ключевые аргументы, переданные вызову (идентификатор NULL для **kwargs)142    keyword = (identifier? arg, expr value)143               attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)144145    -- имя импорта с необязательным псевдонимом 'as'146    alias = (identifier name, identifier? asname)147             attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)148149    withitem = (expr context_expr, expr? optional_vars)150151    match_case = (pattern pattern, expr? guard, stmt* body)152153    pattern = MatchValue(expr value)154            | MatchSingleton(constant value)155            | MatchSequence(pattern* patterns)156            | MatchMapping(expr* keys, pattern* patterns, identifier? rest)157            | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)158159            | MatchStar(identifier? name)160            -- необязательный параметр "rest" MatchMapping обрабатывает захват дополнительных ключей отображения161162            | MatchAs(pattern? pattern, identifier? name)163            | MatchOr(pattern* patterns)164165             attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)166167    type_ignore = TypeIgnore(int lineno, string tag)168169    type_param = TypeVar(identifier name, expr? bound)170               | ParamSpec(identifier name)171               | TypeVarTuple(identifier name)172               attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)173}174```175176## Классы узлов177178#### `class ast.AST`179180Это базовый класс для всех узлов AST. Реальные классы узлов унаследованы из файла `Parser/Python.asdl`, который воспроизведён [выше](https://python-all.ru/3.12/library/ast.html#abstract-grammar). Они определены в C-модуле `_ast` и повторно экспортируются в [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast).181182Для каждого символа левой части абстрактной грамматики определён один класс (например, `ast.stmt` или `ast.expr`). Кроме того, для каждого конструктора правой части определён один класс; эти классы наследуют от классов для деревьев левой части. Например, [`ast.BinOp`](https://python-all.ru/3.12/library/ast.html#ast.BinOp) наследует от `ast.expr`. Для продукционных правил с альтернативами (так называемых «сумм») класс левой части является абстрактным: создаются только экземпляры конкретных узлов-конструкторов.183184#### `_fields`185186Каждый конкретный класс имеет атрибут [`_fields`](https://python-all.ru/3.12/library/ast.html#ast.AST._fields), который содержит имена всех дочерних узлов.187188Каждый экземпляр конкретного класса имеет по одному атрибуту для каждого дочернего узла, тип которого определён в грамматике. Например, экземпляры [`ast.BinOp`](https://python-all.ru/3.12/library/ast.html#ast.BinOp) имеют атрибут `left` типа `ast.expr`.189190Если эти атрибуты помечены как необязательные в грамматике (с помощью вопросительного знака), значением может быть `None`. Если атрибуты могут иметь ноль или более значений (помечены звёздочкой), значения представляются в виде списков Python. Все возможные атрибуты должны присутствовать и иметь корректные значения при компиляции AST с помощью [`compile()`](https://python-all.ru/3.12/library/functions.html#compile).191192#### `lineno`193194#### `col_offset`195196#### `end_lineno`197198#### `end_col_offset`199200Экземпляры подклассов `ast.expr` и `ast.stmt` имеют атрибуты [`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_col_offset). Атрибуты [`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno) и [`end_lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_lineno) – это номер первой и последней строки исходного текста (нумерация с 1, то есть первая строка – строка 1), а [`col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.col_offset) и [`end_col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_col_offset) – соответствующие смещения в байтах UTF-8 от первого и последнего токенов, породивших узел. Смещение UTF-8 записывается, потому что парсер использует UTF-8 внутри.201202Обратите внимание, что конечные позиции не требуются компилятором и поэтому являются необязательными. Смещение конца находится *после* последнего символа, например, можно получить фрагмент исходного кода узла выражения из одной строки с помощью `source_line[node.col_offset : node.end_col_offset]`.203204Конструктор класса `ast.T` разбирает свои аргументы следующим образом:205206- Если есть позиционные аргументы, их должно быть столько же, сколько элементов в `T._fields`; они будут присвоены как атрибуты с этими именами.207- Если есть ключевые аргументы, они установят атрибуты с теми же именами в указанные значения.208209Например, чтобы создать и заполнить узел [`ast.UnaryOp`](https://python-all.ru/3.12/library/ast.html#ast.UnaryOp), можно использовать210211```python212node = ast.UnaryOp()213node.op = ast.USub()214node.operand = ast.Constant()215node.operand.value = 5216node.operand.lineno = 0217node.operand.col_offset = 0218node.lineno = 0219node.col_offset = 0220```221222или более компактный223224```python225node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),226                   lineno=0, col_offset=0)227```228229Изменено в версии 3.8: Класс [`ast.Constant`](https://python-all.ru/3.12/library/ast.html#ast.Constant) теперь используется для всех констант.230231Изменено в версии 3.9: Простые индексы представляются своим значением, расширенные срезы представляются кортежами.232233Устарело с версии 3.8: Старые классы `ast.Num`, `ast.Str`, `ast.Bytes`, `ast.NameConstant` и `ast.Ellipsis` всё ещё доступны, но будут удалены в будущих версиях Python. А пока их создание будет возвращать экземпляр другого класса.234235Устарело с версии 3.9: Старые классы `ast.Index` и `ast.ExtSlice` всё ещё доступны, но будут удалены в будущих выпусках Python. При этом при их создании будет возвращён экземпляр другого класса.236237> **Примечание**238>239> Описания конкретных классов узлов, приведённые здесь, изначально были адаптированы из замечательного проекта [Green Tree Snakes](https://python-all.ru/3.12/library/ast.html) и всех его участников.240241### Корневые узлы242243#### `class ast.Module(body, type_ignores)`244245A Python module, as with [file input](https://python-all.ru/3.12/reference/toplevel_components.html#file-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) in the default `"exec"` *mode*.246247`body` is a [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) of the module’s [Statements](https://python-all.ru/3.12/library/ast.html#ast-statements).248249`type_ignores` – это список [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) комментариев об игнорировании типов в модуле; подробнее см. в [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse).250251```pycon252>>> print(ast.dump(ast.parse('x = 1'), indent=4))253Module(254    body=[255        Assign(256            targets=[257                Name(id='x', ctx=Store())],258            value=Constant(value=1))],259    type_ignores=[])260```261262#### `class ast.Expression(body)`263264A single Python [expression input](https://python-all.ru/3.12/reference/toplevel_components.html#expression-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) when *mode* is `"eval"`.265266`body` is a single node, one of the [expression types](https://python-all.ru/3.12/library/ast.html#ast-expressions).267268```pycon269>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))270Expression(271    body=Constant(value=123))272```273274#### `class ast.Interactive(body)`275276A single [interactive input](https://python-all.ru/3.12/reference/toplevel_components.html#interactive), like in [Interactive Mode](https://python-all.ru/3.12/tutorial/appendix.html#tut-interac). Node type generated by [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) when *mode* is `"single"`.277278`body` is a [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) of [statement nodes](https://python-all.ru/3.12/library/ast.html#ast-statements).279280```pycon281>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))282Interactive(283    body=[284        Assign(285            targets=[286                Name(id='x', ctx=Store())],287            value=Constant(value=1)),288        Assign(289            targets=[290                Name(id='y', ctx=Store())],291            value=Constant(value=2))])292```293294#### `class ast.FunctionType(argtypes, returns)`295296A representation of an old-style type comments for functions, as Python versions prior to 3.5 didn’t support [**PEP 484**](https://python-all.ru/3.12/library/ast.html) annotations. Node type generated by [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) when *mode* is `"func_type"`.297298Такие комментарии о типах выглядели следующим образом:299300```python301def sum_two_number(a, b):302    # type: (int, int) -> int303    return a + b304```305306`argtypes` is a [`list`](https://python-all.ru/3.12/library/stdtypes.html#list) of [expression nodes](https://python-all.ru/3.12/library/ast.html#ast-expressions).307308`returns` is a single [expression node](https://python-all.ru/3.12/library/ast.html#ast-expressions).309310```pycon311>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))312FunctionType(313    argtypes=[314        Name(id='int', ctx=Load()),315        Name(id='str', ctx=Load())],316    returns=Subscript(317        value=Name(id='List', ctx=Load()),318        slice=Name(id='int', ctx=Load()),319        ctx=Load()))320```321322Добавлено в версии 3.8.323324### Литералы325326#### `class ast.Constant(value)`327328Постоянное значение. Атрибут `value` литерала `Constant` содержит объект Python, который он представляет. Представленные значения могут быть простыми типами, такими как число, строка или `None`, а также неизменяемыми контейнерными типами (кортежами и замороженными множествами), если все их элементы постоянны.329330```pycon331>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))332Expression(333    body=Constant(value=123))334```335336#### `class ast.FormattedValue(value, conversion, format_spec)`337338Узел, представляющий одно поле форматирования в f-строке. Если строка содержит только одно поле форматирования и больше ничего, узел может быть изолированным; в противном случае он встречается внутри [`JoinedStr`](https://python-all.ru/3.12/library/ast.html#ast.JoinedStr).339340- `value` – это любой узел выражения (например, литерал, переменная или вызов функции).341- `conversion` – целое число:342343  - -1: без форматирования344  - 115: `!s` форматирование строк345  - 114: `!r` форматирование repr346  - 97: `!a` форматирование ascii347- `format_spec` – узел [`JoinedStr`](https://python-all.ru/3.12/library/ast.html#ast.JoinedStr), представляющий форматирование значения, или `None`, если формат не указан. `conversion` и `format_spec` могут быть установлены одновременно.348349#### `class ast.JoinedStr(values)`350351F-строка, содержащая последовательность [`FormattedValue`](https://python-all.ru/3.12/library/ast.html#ast.FormattedValue) и [`Constant`](https://python-all.ru/3.12/library/ast.html#ast.Constant) узлов.352353```pycon354>>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4))355Expression(356    body=JoinedStr(357        values=[358            Constant(value='sin('),359            FormattedValue(360                value=Name(id='a', ctx=Load()),361                conversion=-1),362            Constant(value=') is '),363            FormattedValue(364                value=Call(365                    func=Name(id='sin', ctx=Load()),366                    args=[367                        Name(id='a', ctx=Load())],368                    keywords=[]),369                conversion=-1,370                format_spec=JoinedStr(371                    values=[372                        Constant(value='.3')]))]))373```374375#### `class ast.List(elts, ctx)`376377#### `class ast.Tuple(elts, ctx)`378379Список или кортеж. `elts` содержит список узлов, представляющих элементы. `ctx` равен [`Store`](https://python-all.ru/3.12/library/ast.html#ast.Store), если контейнер является целью присваивания (т.е. `(x,y)=something`), и [`Load`](https://python-all.ru/3.12/library/ast.html#ast.Load) в противном случае.380381```pycon382>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))383Expression(384    body=List(385        elts=[386            Constant(value=1),387            Constant(value=2),388            Constant(value=3)],389        ctx=Load()))390>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))391Expression(392    body=Tuple(393        elts=[394            Constant(value=1),395            Constant(value=2),396            Constant(value=3)],397        ctx=Load()))398```399400#### `class ast.Set(elts)`401402Множество. `elts` содержит список узлов, представляющих элементы множества.403404```pycon405>>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))406Expression(407    body=Set(408        elts=[409            Constant(value=1),410            Constant(value=2),411            Constant(value=3)]))412```413414#### `class ast.Dict(keys, values)`415416Словарь. `keys` и `values` содержат списки узлов, представляющих ключи и значения соответственно, в соответствующем порядке (то, что было бы возвращено при вызове `dictionary.keys()` и `dictionary.values()`).417418При распаковке словаря с помощью литералов словаря выражение, которое нужно раскрыть, помещается в список `values`, а `None` – на соответствующую позицию в `keys`.419420```pycon421>>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4))422Expression(423    body=Dict(424        keys=[425            Constant(value='a'),426            None],427        values=[428            Constant(value=1),429            Name(id='d', ctx=Load())]))430```431432### Переменные433434#### `class ast.Name(id, ctx)`435436Имя переменной. `id` содержит имя в виде строки, а `ctx` – один из следующих типов.437438#### `class ast.Load`439440#### `class ast.Store`441442#### `class ast.Del`443444Ссылки на переменные можно использовать для загрузки значения переменной, для присваивания ей нового значения или для её удаления. Ссылки на переменные получают контекст, чтобы различать эти случаи.445446```pycon447>>> print(ast.dump(ast.parse('a'), indent=4))448Module(449    body=[450        Expr(451            value=Name(id='a', ctx=Load()))],452    type_ignores=[])453454>>> print(ast.dump(ast.parse('a = 1'), indent=4))455Module(456    body=[457        Assign(458            targets=[459                Name(id='a', ctx=Store())],460            value=Constant(value=1))],461    type_ignores=[])462463>>> print(ast.dump(ast.parse('del a'), indent=4))464Module(465    body=[466        Delete(467            targets=[468                Name(id='a', ctx=Del())])],469    type_ignores=[])470```471472#### `class ast.Starred(value, ctx)`473474Ссылка на переменную `*var`. В `value` хранится переменная, обычно узел [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name). Этот тип необходимо использовать при построении узла [`Call`](https://python-all.ru/3.12/library/ast.html#ast.Call) с помощью `*args`.475476```pycon477>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))478Module(479    body=[480        Assign(481            targets=[482                Tuple(483                    elts=[484                        Name(id='a', ctx=Store()),485                        Starred(486                            value=Name(id='b', ctx=Store()),487                            ctx=Store())],488                    ctx=Store())],489            value=Name(id='it', ctx=Load()))],490    type_ignores=[])491```492493### Выражения494495#### `class ast.Expr(value)`496497Когда выражение, например вызов функции, выступает в роли самостоятельного оператора и его возвращаемое значение не используется и не сохраняется, оно помещается в этот контейнер. `value` содержит один из остальных узлов этого раздела: узел [`Constant`](https://python-all.ru/3.12/library/ast.html#ast.Constant), узел [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), [`Lambda`](https://python-all.ru/3.12/library/ast.html#ast.Lambda), [`Yield`](https://python-all.ru/3.12/library/ast.html#ast.Yield) или [`YieldFrom`](https://python-all.ru/3.12/library/ast.html#ast.YieldFrom).498499```pycon500>>> print(ast.dump(ast.parse('-a'), indent=4))501Module(502    body=[503        Expr(504            value=UnaryOp(505                op=USub(),506                operand=Name(id='a', ctx=Load())))],507    type_ignores=[])508```509510#### `class ast.UnaryOp(op, operand)`511512Унарная операция. `op` – оператор, а `operand` – любой узел выражения.513514#### `class ast.UAdd`515516#### `class ast.USub`517518#### `class ast.Not`519520#### `class ast.Invert`521522Токены унарных операторов. [`Not`](https://python-all.ru/3.12/library/ast.html#ast.Not) – ключевое слово `not`, [`Invert`](https://python-all.ru/3.12/library/ast.html#ast.Invert) – оператор `~`.523524```pycon525>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))526Expression(527    body=UnaryOp(528        op=Not(),529        operand=Name(id='x', ctx=Load())))530```531532#### `class ast.BinOp(left, op, right)`533534Бинарная операция (например, сложение или деление). `op` – оператор, а `left` и `right` – любые узлы выражений.535536```pycon537>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))538Expression(539    body=BinOp(540        left=Name(id='x', ctx=Load()),541        op=Add(),542        right=Name(id='y', ctx=Load())))543```544545#### `class ast.Add`546547#### `class ast.Sub`548549#### `class ast.Mult`550551#### `class ast.Div`552553#### `class ast.FloorDiv`554555#### `class ast.Mod`556557#### `class ast.Pow`558559#### `class ast.LShift`560561#### `class ast.RShift`562563#### `class ast.BitOr`564565#### `class ast.BitXor`566567#### `class ast.BitAnd`568569#### `class ast.MatMult`570571Токены бинарных операторов.572573#### `class ast.BoolOp(op, values)`574575Логическая операция – 'or' или 'and'. `op` – это [`Or`](https://python-all.ru/3.12/library/ast.html#ast.Or) или [`And`](https://python-all.ru/3.12/library/ast.html#ast.And). `values` – участвующие значения. Последовательные операции с одним и тем же оператором, например `a or b or c`, сводятся в один узел с несколькими значениями.576577Это не включает `not`, который является [`UnaryOp`](https://python-all.ru/3.12/library/ast.html#ast.UnaryOp).578579```pycon580>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))581Expression(582    body=BoolOp(583        op=Or(),584        values=[585            Name(id='x', ctx=Load()),586            Name(id='y', ctx=Load())]))587```588589#### `class ast.And`590591#### `class ast.Or`592593Токены логических операторов.594595#### `class ast.Compare(left, ops, comparators)`596597Сравнение двух или более значений. `left` – первое значение в сравнении, `ops` – список операторов, а `comparators` – список значений после первого элемента сравнения.598599```pycon600>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))601Expression(602    body=Compare(603        left=Constant(value=1),604        ops=[605            LtE(),606            Lt()],607        comparators=[608            Name(id='a', ctx=Load()),609            Constant(value=10)]))610```611612#### `class ast.Eq`613614#### `class ast.NotEq`615616#### `class ast.Lt`617618#### `class ast.LtE`619620#### `class ast.Gt`621622#### `class ast.GtE`623624#### `class ast.Is`625626#### `class ast.IsNot`627628#### `class ast.In`629630#### `class ast.NotIn`631632Токены операторов сравнения.633634#### `class ast.Call(func, args, keywords)`635636Вызов функции. `func` – это функция; обычно это объект [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name) или [`Attribute`](https://python-all.ru/3.12/library/ast.html#ast.Attribute). Об аргументах:637638- `args` содержит список аргументов, переданных по позиции.639- `keywords` содержит список объектов [`keyword`](https://python-all.ru/3.12/library/ast.html#ast.keyword), представляющих аргументы, переданные по ключевому слову.640641При создании узла `Call` обязательны `args` и `keywords`, но они могут быть пустыми списками.642643```pycon644>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))645Expression(646    body=Call(647        func=Name(id='func', ctx=Load()),648        args=[649            Name(id='a', ctx=Load()),650            Starred(651                value=Name(id='d', ctx=Load()),652                ctx=Load())],653        keywords=[654            keyword(655                arg='b',656                value=Name(id='c', ctx=Load())),657            keyword(658                value=Name(id='e', ctx=Load()))]))659```660661#### `class ast.keyword(arg, value)`662663Именованный аргумент вызова функции или определения класса. `arg` – это необработанная строка с именем параметра, `value` – узел, который нужно передать.664665#### `class ast.IfExp(test, body, orelse)`666667Выражение, например `a if b else c`. Каждое поле содержит один узел, поэтому в следующем примере все три являются узлами [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name).668669```pycon670>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))671Expression(672    body=IfExp(673        test=Name(id='b', ctx=Load()),674        body=Name(id='a', ctx=Load()),675        orelse=Name(id='c', ctx=Load())))676```677678#### `class ast.Attribute(value, attr, ctx)`679680Доступ к атрибуту, например `d.keys`. `value` – это узел, обычно [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name). `attr` – это строка с именем атрибута, а `ctx` – [`Load`](https://python-all.ru/3.12/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.12/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.12/library/ast.html#ast.Del) в зависимости от того, как используется атрибут.681682```pycon683>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))684Expression(685    body=Attribute(686        value=Name(id='snake', ctx=Load()),687        attr='colour',688        ctx=Load()))689```690691#### `class ast.NamedExpr(target, value)`692693Именованное выражение. Этот узел AST создаётся оператором присваивания (также известным как оператор «морж»). В отличие от узла [`Assign`](https://python-all.ru/3.12/library/ast.html#ast.Assign), где первый аргумент может быть несколькими узлами, в данном случае и `target`, и `value` должны быть одиночными узлами.694695```pycon696>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))697Expression(698    body=NamedExpr(699        target=Name(id='x', ctx=Store()),700        value=Constant(value=4)))701```702703Добавлено в версии 3.8.704705#### Индексирование706707#### `class ast.Subscript(value, slice, ctx)`708709Индексация, такая как `l[1]`. `value` – индексируемый объект (обычно последовательность или отображение). `slice` – это индекс, срез или ключ. Оно может быть [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple) и содержать [`Slice`](https://python-all.ru/3.12/library/ast.html#ast.Slice). `ctx` является [`Load`](https://python-all.ru/3.12/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.12/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.12/library/ast.html#ast.Del) в зависимости от выполняемого действия при индексации.710711```pycon712>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))713Expression(714    body=Subscript(715        value=Name(id='l', ctx=Load()),716        slice=Tuple(717            elts=[718                Slice(719                    lower=Constant(value=1),720                    upper=Constant(value=2)),721                Constant(value=3)],722            ctx=Load()),723        ctx=Load()))724```725726#### `class ast.Slice(lower, upper, step)`727728Обычный срез (в виде `lower:upper` или `lower:upper:step`). Может встречаться только внутри поля *slice* узла [`Subscript`](https://python-all.ru/3.12/library/ast.html#ast.Subscript), либо напрямую, либо как элемент [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple).729730```pycon731>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))732Expression(733    body=Subscript(734        value=Name(id='l', ctx=Load()),735        slice=Slice(736            lower=Constant(value=1),737            upper=Constant(value=2)),738        ctx=Load()))739```740741#### Генераторы коллекций742743#### `class ast.ListComp(elt, generators)`744745#### `class ast.SetComp(elt, generators)`746747#### `class ast.GeneratorExp(elt, generators)`748749#### `class ast.DictComp(key, value, generators)`750751Генераторы списков и множеств, генераторные выражения и генераторы словарей. `elt` (или `key` и `value`) – это один узел, представляющий часть, которая будет вычисляться для каждого элемента.752753`generators` – это список узлов [`comprehension`](https://python-all.ru/3.12/library/ast.html#ast.comprehension).754755```pycon756>>> print(ast.dump(ast.parse('[x for x in numbers]', mode='eval'), indent=4))757Expression(758    body=ListComp(759        elt=Name(id='x', ctx=Load()),760        generators=[761            comprehension(762                target=Name(id='x', ctx=Store()),763                iter=Name(id='numbers', ctx=Load()),764                ifs=[],765                is_async=0)]))766>>> print(ast.dump(ast.parse('{x: x**2 for x in numbers}', mode='eval'), indent=4))767Expression(768    body=DictComp(769        key=Name(id='x', ctx=Load()),770        value=BinOp(771            left=Name(id='x', ctx=Load()),772            op=Pow(),773            right=Constant(value=2)),774        generators=[775            comprehension(776                target=Name(id='x', ctx=Store()),777                iter=Name(id='numbers', ctx=Load()),778                ifs=[],779                is_async=0)]))780>>> print(ast.dump(ast.parse('{x for x in numbers}', mode='eval'), indent=4))781Expression(782    body=SetComp(783        elt=Name(id='x', ctx=Load()),784        generators=[785            comprehension(786                target=Name(id='x', ctx=Store()),787                iter=Name(id='numbers', ctx=Load()),788                ifs=[],789                is_async=0)]))790```791792#### `class ast.comprehension(target, iter, ifs, is_async)`793794Одно предложение `for` в генераторе коллекции. `target` – это ссылка, используемая для каждого элемента (обычно узел [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name) или [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple)). `iter` – объект, по которому выполняется итерация. `ifs` – список проверочных выражений: каждое предложение `for` может содержать несколько `ifs`.795796`is_async` указывает, что генератор коллекции является асинхронным (использует `async for` вместо `for`). Значение – целое число (0 или 1).797798```pycon799>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),800...                indent=4)) # несколько включений в одном801Expression(802    body=ListComp(803        elt=Call(804            func=Name(id='ord', ctx=Load()),805            args=[806                Name(id='c', ctx=Load())],807            keywords=[]),808        generators=[809            comprehension(810                target=Name(id='line', ctx=Store()),811                iter=Name(id='file', ctx=Load()),812                ifs=[],813                is_async=0),814            comprehension(815                target=Name(id='c', ctx=Store()),816                iter=Name(id='line', ctx=Load()),817                ifs=[],818                is_async=0)]))819820>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),821...                indent=4)) # выражение-генератор822Expression(823    body=GeneratorExp(824        elt=BinOp(825            left=Name(id='n', ctx=Load()),826            op=Pow(),827            right=Constant(value=2)),828        generators=[829            comprehension(830                target=Name(id='n', ctx=Store()),831                iter=Name(id='it', ctx=Load()),832                ifs=[833                    Compare(834                        left=Name(id='n', ctx=Load()),835                        ops=[836                            Gt()],837                        comparators=[838                            Constant(value=5)]),839                    Compare(840                        left=Name(id='n', ctx=Load()),841                        ops=[842                            Lt()],843                        comparators=[844                            Constant(value=10)])],845                is_async=0)]))846847>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),848...                indent=4)) # асинхронное включение849Expression(850    body=ListComp(851        elt=Name(id='i', ctx=Load()),852        generators=[853            comprehension(854                target=Name(id='i', ctx=Store()),855                iter=Name(id='soc', ctx=Load()),856                ifs=[],857                is_async=1)]))858```859860### Инструкции861862#### `class ast.Assign(targets, value, type_comment)`863864Присваивание. `targets` – список узлов, а `value` – один узел.865866Несколько узлов в `targets` обозначают присваивание одного и того же значения каждому. Распаковка представляется помещением узла [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.12/library/ast.html#ast.List) внутрь `targets`.867868#### `type_comment`869870`type_comment` – это необязательная строка с аннотацией типа в виде комментария.871872```pycon873>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # множественное присваивание874Module(875    body=[876        Assign(877            targets=[878                Name(id='a', ctx=Store()),879                Name(id='b', ctx=Store())],880            value=Constant(value=1))],881    type_ignores=[])882883>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # распаковка884Module(885    body=[886        Assign(887            targets=[888                Tuple(889                    elts=[890                        Name(id='a', ctx=Store()),891                        Name(id='b', ctx=Store())],892                    ctx=Store())],893            value=Name(id='c', ctx=Load()))],894    type_ignores=[])895```896897#### `class ast.AnnAssign(target, annotation, value, simple)`898899Присваивание с аннотацией типа. `target` – это один узел, который может быть [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.12/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.12/library/ast.html#ast.Subscript). `annotation` – аннотация, например узел [`Constant`](https://python-all.ru/3.12/library/ast.html#ast.Constant) или [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name). `value` – один необязательный узел.900901`simple` всегда равен либо 0 (обозначает «сложную» цель), либо 1 (обозначает «простую» цель). «Простая» цель состоит только из узла [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), который не находится в круглых скобках; все остальные цели считаются сложными. Только простые цели появляются в словаре `__annotations__` модулей и классов.902903```pycon904>>> print(ast.dump(ast.parse('c: int'), indent=4))905Module(906    body=[907        AnnAssign(908            target=Name(id='c', ctx=Store()),909            annotation=Name(id='int', ctx=Load()),910            simple=1)],911    type_ignores=[])912913>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # аннотация со скобками914Module(915    body=[916        AnnAssign(917            target=Name(id='a', ctx=Store()),918            annotation=Name(id='int', ctx=Load()),919            value=Constant(value=1),920            simple=0)],921    type_ignores=[])922923>>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # аннотация атрибута924Module(925    body=[926        AnnAssign(927            target=Attribute(928                value=Name(id='a', ctx=Load()),929                attr='b',930                ctx=Store()),931            annotation=Name(id='int', ctx=Load()),932            simple=0)],933    type_ignores=[])934935>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # аннотация подписки936Module(937    body=[938        AnnAssign(939            target=Subscript(940                value=Name(id='a', ctx=Load()),941                slice=Constant(value=1),942                ctx=Store()),943            annotation=Name(id='int', ctx=Load()),944            simple=0)],945    type_ignores=[])946```947948#### `class ast.AugAssign(target, op, value)`949950Расширенное присваивание, например `a += 1`. В следующем примере `target` – это узел [Имя](https://python-all.ru/3.12/library/ast.html#ast.Name) для `x` (с контекстом [`Store`](https://python-all.ru/3.12/library/ast.html#ast.Store)), `op` – это [Сложение](https://python-all.ru/3.12/library/ast.html#ast.Add), а `value` – это [Константа](https://python-all.ru/3.12/library/ast.html#ast.Constant) со значением 1.951952Атрибут `target` не может быть класса [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.12/library/ast.html#ast.List), в отличие от целей [`Assign`](https://python-all.ru/3.12/library/ast.html#ast.Assign).953954```pycon955>>> print(ast.dump(ast.parse('x += 2'), indent=4))956Module(957    body=[958        AugAssign(959            target=Name(id='x', ctx=Store()),960            op=Add(),961            value=Constant(value=2))],962    type_ignores=[])963```964965#### `class ast.Raise(exc, cause)`966967Инструкция `raise`. `exc` – объект исключения, который необходимо возбудить, обычно [Вызов](https://python-all.ru/3.12/library/ast.html#ast.Call) или [Имя](https://python-all.ru/3.12/library/ast.html#ast.Name), или `None` для отдельного `raise`. `cause` – необязательная часть для `y` в `Возбуждение`.968969```pycon970>>> print(ast.dump(ast.parse('raise x from y'), indent=4))971Module(972    body=[973        Raise(974            exc=Name(id='x', ctx=Load()),975            cause=Name(id='y', ctx=Load()))],976    type_ignores=[])977```978979#### `class ast.Assert(test, msg)`980981Утверждение. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.12/library/ast.html#ast.Compare). `msg` содержит сообщение об ошибке.982983```pycon984>>> print(ast.dump(ast.parse('assert x,y'), indent=4))985Module(986    body=[987        Assert(988            test=Name(id='x', ctx=Load()),989            msg=Name(id='y', ctx=Load()))],990    type_ignores=[])991```992993#### `class ast.Delete(targets)`994995Представляет инструкцию `del`. `targets` – список узлов, например узлов [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.12/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.12/library/ast.html#ast.Subscript).996997```pycon998>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))999Module(1000    body=[1001        Delete(1002            targets=[1003                Name(id='x', ctx=Del()),1004                Name(id='y', ctx=Del()),1005                Name(id='z', ctx=Del())])],1006    type_ignores=[])1007```10081009#### `class ast.Pass`10101011Инструкция `pass`.10121013```pycon1014>>> print(ast.dump(ast.parse('pass'), indent=4))1015Module(1016    body=[1017        Pass()],1018    type_ignores=[])1019```10201021#### `class ast.TypeAlias(name, type_params, value)`10221023[Псевдоним типа](https://python-all.ru/3.12/library/typing.html#type-aliases), созданный с помощью инструкции [`type`](https://python-all.ru/3.12/reference/simple_stmts.html#type) . `name` – имя псевдонима, `type_params` – список [параметров типа](https://python-all.ru/3.12/library/ast.html#ast-type-params), а `value` – значение псевдонима типа.10241025```pycon1026>>> print(ast.dump(ast.parse('type Alias = int'), indent=4))1027Module(1028    body=[1029        TypeAlias(1030            name=Name(id='Alias', ctx=Store()),1031            type_params=[],1032            value=Name(id='int', ctx=Load()))],1033    type_ignores=[])1034```10351036Добавлено в версии 3.12.10371038Другие инструкции, которые применимы только внутри функций или циклов, описаны в других разделах.10391040#### Импорты10411042#### `class ast.Import(names)`10431044Инструкция импорта. `names` – это список узлов [`alias`](https://python-all.ru/3.12/library/ast.html#ast.alias).10451046```pycon1047>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))1048Module(1049    body=[1050        Import(1051            names=[1052                alias(name='x'),1053                alias(name='y'),1054                alias(name='z')])],1055    type_ignores=[])1056```10571058#### `class ast.ImportFrom(module, names, level)`10591060Представляет `from x import y`. `module` – это необработанная строка имени from, без начальных точек, или `None` для инструкций вроде `from . import foo`. `level` – целое число, указывающее уровень относительного импорта (0 означает абсолютный импорт).10611062```pycon1063>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))1064Module(1065    body=[1066        ImportFrom(1067            module='y',1068            names=[1069                alias(name='x'),1070                alias(name='y'),1071                alias(name='z')],1072            level=0)],1073    type_ignores=[])1074```10751076#### `class ast.alias(name, asname)`10771078Оба параметра – необработанные строки имён. `asname` может быть `None`, если должно использоваться обычное имя.10791080```pycon1081>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))1082Module(1083    body=[1084        ImportFrom(1085            module='foo.bar',1086            names=[1087                alias(name='a', asname='b'),1088                alias(name='c')],1089            level=2)],1090    type_ignores=[])1091```10921093### Управление потоком10941095> **Примечание**1096>1097> Необязательные предложения, такие как `else`, сохраняются как пустой список, если они отсутствуют.10981099#### `class ast.If(test, body, orelse)`11001101Инструкция `if`. `test` содержит один узел, например узел [`Compare`](https://python-all.ru/3.12/library/ast.html#ast.Compare). `body` и `orelse` содержат по списку узлов.11021103Предложения `elif` не имеют специального представления в AST, а появляются как дополнительные узлы [`If`](https://python-all.ru/3.12/library/ast.html#ast.If) в разделе `orelse` предыдущего.11041105```pycon1106>>> print(ast.dump(ast.parse("""1107... if x:1108...    ...1109... elif y:1110...    ...1111... else:1112...    ...1113... """), indent=4))1114Module(1115    body=[1116        If(1117            test=Name(id='x', ctx=Load()),1118            body=[1119                Expr(1120                    value=Constant(value=Ellipsis))],1121            orelse=[1122                If(1123                    test=Name(id='y', ctx=Load()),1124                    body=[1125                        Expr(1126                            value=Constant(value=Ellipsis))],1127                    orelse=[1128                        Expr(1129                            value=Constant(value=Ellipsis))])])],1130    type_ignores=[])1131```11321133#### `class ast.For(target, iter, body, orelse, type_comment)`11341135Цикл `for`. `target` содержит переменную (или переменные), которой присваивает цикл, в виде одного узла [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple), [`List`](https://python-all.ru/3.12/library/ast.html#ast.List), [`Attribute`](https://python-all.ru/3.12/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.12/library/ast.html#ast.Subscript). `iter` содержит элемент, по которому выполняется итерация, также в виде одного узла. `body` и `orelse` содержат списки узлов для выполнения. Те, что в `orelse`, выполняются, если цикл завершается нормально, а не по инструкции `break`.11361137#### `type_comment`11381139`type_comment` – это необязательная строка с аннотацией типа в виде комментария.11401141```pycon1142>>> print(ast.dump(ast.parse("""1143... for x in y:1144...     ...1145... else:1146...     ...1147... """), indent=4))1148Module(1149    body=[1150        For(1151            target=Name(id='x', ctx=Store()),1152            iter=Name(id='y', ctx=Load()),1153            body=[1154                Expr(1155                    value=Constant(value=Ellipsis))],1156            orelse=[1157                Expr(1158                    value=Constant(value=Ellipsis))])],1159    type_ignores=[])1160```11611162#### `class ast.While(test, body, orelse)`11631164Цикл `while`. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.12/library/ast.html#ast.Compare).11651166```pycon1167>> print(ast.dump(ast.parse("""1168... while x:1169...    ...1170... else:1171...    ...1172... """), indent=4))1173Module(1174    body=[1175        While(1176            test=Name(id='x', ctx=Load()),1177            body=[1178                Expr(1179                    value=Constant(value=Ellipsis))],1180            orelse=[1181                Expr(1182                    value=Constant(value=Ellipsis))])],1183    type_ignores=[])1184```11851186#### `class ast.Break`11871188#### `class ast.Continue`11891190Инструкции `break` и `continue`.11911192```pycon1193>>> print(ast.dump(ast.parse("""\1194... for a in b:1195...     if a > 5:1196...         break1197...     else:1198...         continue1199...1200... """), indent=4))1201Module(1202    body=[1203        For(1204            target=Name(id='a', ctx=Store()),1205            iter=Name(id='b', ctx=Load()),1206            body=[1207                If(1208                    test=Compare(1209                        left=Name(id='a', ctx=Load()),1210                        ops=[1211                            Gt()],1212                        comparators=[1213                            Constant(value=5)]),1214                    body=[1215                        Break()],1216                    orelse=[1217                        Continue()])],1218            orelse=[])],1219    type_ignores=[])1220```12211222#### `class ast.Try(body, handlers, orelse, finalbody)`12231224Блоки `try`. Все атрибуты – списки узлов для выполнения, за исключением `handlers`, который является списком узлов [`ExceptHandler`](https://python-all.ru/3.12/library/ast.html#ast.ExceptHandler).12251226```pycon1227>>> print(ast.dump(ast.parse("""1228... try:1229...    ...1230... except Exception:1231...    ...1232... except OtherException as e:1233...    ...1234... else:1235...    ...1236... finally:1237...    ...1238... """), indent=4))1239Module(1240    body=[1241        Try(1242            body=[1243                Expr(1244                    value=Constant(value=Ellipsis))],1245            handlers=[1246                ExceptHandler(1247                    type=Name(id='Exception', ctx=Load()),1248                    body=[1249                        Expr(1250                            value=Constant(value=Ellipsis))]),1251                ExceptHandler(1252                    type=Name(id='OtherException', ctx=Load()),1253                    name='e',1254                    body=[1255                        Expr(1256                            value=Constant(value=Ellipsis))])],1257            orelse=[1258                Expr(1259                    value=Constant(value=Ellipsis))],1260            finalbody=[1261                Expr(1262                    value=Constant(value=Ellipsis))])],1263    type_ignores=[])1264```12651266#### `class ast.TryStar(body, handlers, orelse, finalbody)`12671268Блоки `try`, за которыми следуют предложения `except*`. Атрибуты такие же, как для [`Try`](https://python-all.ru/3.12/library/ast.html#ast.Try), но узлы [`ExceptHandler`](https://python-all.ru/3.12/library/ast.html#ast.ExceptHandler) в `handlers` интерпретируются как блоки `except*`, а не `except`.12691270```pycon1271>>> print(ast.dump(ast.parse("""1272... try:1273...    ...1274... except* Exception:1275...    ...1276... """), indent=4))1277Module(1278    body=[1279        TryStar(1280            body=[1281                Expr(1282                    value=Constant(value=Ellipsis))],1283            handlers=[1284                ExceptHandler(1285                    type=Name(id='Exception', ctx=Load()),1286                    body=[1287                        Expr(1288                            value=Constant(value=Ellipsis))])],1289            orelse=[],1290            finalbody=[])],1291    type_ignores=[])1292```12931294Добавлено в версии 3.12.12951296#### `class ast.ExceptHandler(type, name, body)`12971298Одно предложение `except`. `type` – тип исключения, который оно перехватывает, обычно узел [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name) (или `None` для универсального предложения `except:`). `name` – необработанная строка для имени, в котором будет сохранено исключение, или `None`, если в предложении нет `as foo`. `body` – список узлов.12991300```pycon1301>>> print(ast.dump(ast.parse("""\1302... try:1303...     a + 11304... except TypeError:1305...     pass1306... """), indent=4))1307Module(1308    body=[1309        Try(1310            body=[1311                Expr(1312                    value=BinOp(1313                        left=Name(id='a', ctx=Load()),1314                        op=Add(),1315                        right=Constant(value=1)))],1316            handlers=[1317                ExceptHandler(1318                    type=Name(id='TypeError', ctx=Load()),1319                    body=[1320                        Pass()])],1321            orelse=[],1322            finalbody=[])],1323    type_ignores=[])1324```13251326#### `class ast.With(items, body, type_comment)`13271328Блок `with`. `items` – это список узлов [`withitem`](https://python-all.ru/3.12/library/ast.html#ast.withitem), представляющих менеджеры контекста, а `body` – это блок с отступом внутри контекста.13291330#### `type_comment`13311332`type_comment` – это необязательная строка с аннотацией типа в виде комментария.13331334#### `class ast.withitem(context_expr, optional_vars)`13351336Один менеджер контекста в блоке `with`. `context_expr` – это менеджер контекста, часто узел [`Call`](https://python-all.ru/3.12/library/ast.html#ast.Call). `optional_vars` – это [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.12/library/ast.html#ast.List) для части `as foo`, или `None`, если она не используется.13371338```pycon1339>>> print(ast.dump(ast.parse("""\1340... with a as b, c as d:1341...    something(b, d)1342... """), indent=4))1343Module(1344    body=[1345        With(1346            items=[1347                withitem(1348                    context_expr=Name(id='a', ctx=Load()),1349                    optional_vars=Name(id='b', ctx=Store())),1350                withitem(1351                    context_expr=Name(id='c', ctx=Load()),1352                    optional_vars=Name(id='d', ctx=Store()))],1353            body=[1354                Expr(1355                    value=Call(1356                        func=Name(id='something', ctx=Load()),1357                        args=[1358                            Name(id='b', ctx=Load()),1359                            Name(id='d', ctx=Load())],1360                        keywords=[]))])],1361    type_ignores=[])1362```13631364### Сопоставление с образцом13651366#### `class ast.Match(subject, cases)`13671368Оператор `match`. В `subject` хранится subject сопоставления (объект, который сравнивается с вариантами), а `cases` содержит итерируемый набор узлов [`match_case`](https://python-all.ru/3.12/library/ast.html#ast.match_case) с различными вариантами.13691370Добавлено в версии 3.10.13711372#### `class ast.match_case(pattern, guard, body)`13731374Один вариант (case) в операторе `match`. `pattern` содержит шаблон сопоставления, с которым будет сравниваться subject. Обратите внимание, что узлы [`AST`](https://python-all.ru/3.12/library/ast.html#ast.AST), создаваемые для шаблонов, отличаются от узлов, создаваемых для выражений, даже при одинаковом синтаксисе.13751376Атрибут `guard` содержит выражение, которое будет вычислено, если шаблон совпадает с subject.13771378`body` содержит список узлов, которые выполняются, если шаблон совпадает и результат вычисления guard-выражения истинен.13791380```pycon1381>>> print(ast.dump(ast.parse("""1382... match x:1383...     case [x] if x>0:1384...         ...1385...     case tuple():1386...         ...1387... """), indent=4))1388Module(1389    body=[1390        Match(1391            subject=Name(id='x', ctx=Load()),1392            cases=[1393                match_case(1394                    pattern=MatchSequence(1395                        patterns=[1396                            MatchAs(name='x')]),1397                    guard=Compare(1398                        left=Name(id='x', ctx=Load()),1399                        ops=[1400                            Gt()],1401                        comparators=[1402                            Constant(value=0)]),1403                    body=[1404                        Expr(1405                            value=Constant(value=Ellipsis))]),1406                match_case(1407                    pattern=MatchClass(1408                        cls=Name(id='tuple', ctx=Load()),1409                        patterns=[],1410                        kwd_attrs=[],1411                        kwd_patterns=[]),1412                    body=[1413                        Expr(1414                            value=Constant(value=Ellipsis))])])],1415    type_ignores=[])1416```14171418Добавлено в версии 3.10.14191420#### `class ast.MatchValue(value)`14211422Сопоставление с литералом или шаблоном значения, сравниваемым по равенству. `value` – это узел выражения. Допустимые узлы значений ограничены, как описано в документации оператора match. Этот шаблон успешно срабатывает, если subject сопоставления равен вычисленному значению.14231424```pycon1425>>> print(ast.dump(ast.parse("""1426... match x:1427...     case "Relevant":1428...         ...1429... """), indent=4))1430Module(1431    body=[1432        Match(1433            subject=Name(id='x', ctx=Load()),1434            cases=[1435                match_case(1436                    pattern=MatchValue(1437                        value=Constant(value='Relevant')),1438                    body=[1439                        Expr(1440                            value=Constant(value=Ellipsis))])])],1441    type_ignores=[])1442```14431444Добавлено в версии 3.10.14451446#### `class ast.MatchSingleton(value)`14471448Сопоставление с литералом, сравниваемым по идентичности. `value` – это синглтон, с которым производится сравнение: `None`, `True` или `False`. Этот шаблон успешно срабатывает, если subject сопоставления является заданной константой.14491450```pycon1451>>> print(ast.dump(ast.parse("""1452... match x:1453...     case None:1454...         ...1455... """), indent=4))1456Module(1457    body=[1458        Match(1459            subject=Name(id='x', ctx=Load()),1460            cases=[1461                match_case(1462                    pattern=MatchSingleton(value=None),1463                    body=[1464                        Expr(1465                            value=Constant(value=Ellipsis))])])],1466    type_ignores=[])1467```14681469Добавлено в версии 3.10.14701471#### `class ast.MatchSequence(patterns)`14721473Шаблон последовательности (sequence pattern) в match. `patterns` содержит шаблоны, которые будут сопоставляться с элементами subject, если subject является последовательностью. Сопоставляется с последовательностью переменной длины, если один из подшаблонов является узлом `MatchStar`, в противном случае сопоставляется с последовательностью фиксированной длины.14741475```pycon1476>>> print(ast.dump(ast.parse("""1477... match x:1478...     case [1, 2]:1479...         ...1480... """), indent=4))1481Module(1482    body=[1483        Match(1484            subject=Name(id='x', ctx=Load()),1485            cases=[1486                match_case(1487                    pattern=MatchSequence(1488                        patterns=[1489                            MatchValue(1490                                value=Constant(value=1)),1491                            MatchValue(1492                                value=Constant(value=2))]),1493                    body=[1494                        Expr(1495                            value=Constant(value=Ellipsis))])])],1496    type_ignores=[])1497```14981499Добавлено в версии 3.10.15001501#### `class ast.MatchStar(name)`15021503Сопоставляется с остатком последовательности в шаблоне последовательности переменной длины. Если `name` не равно `None`, то при успешном сопоставлении всего шаблона последовательности этому имени привязывается список, содержащий оставшиеся элементы последовательности.15041505```pycon1506>>> print(ast.dump(ast.parse("""1507... match x:1508...     case [1, 2, *rest]:1509...         ...1510...     case [*_]:1511...         ...1512... """), indent=4))1513Module(1514    body=[1515        Match(1516            subject=Name(id='x', ctx=Load()),1517            cases=[1518                match_case(1519                    pattern=MatchSequence(1520                        patterns=[1521                            MatchValue(1522                                value=Constant(value=1)),1523                            MatchValue(1524                                value=Constant(value=2)),1525                            MatchStar(name='rest')]),1526                    body=[1527                        Expr(1528                            value=Constant(value=Ellipsis))]),1529                match_case(1530                    pattern=MatchSequence(1531                        patterns=[1532                            MatchStar()]),1533                    body=[1534                        Expr(1535                            value=Constant(value=Ellipsis))])])],1536    type_ignores=[])1537```15381539Добавлено в версии 3.10.15401541#### `class ast.MatchMapping(keys, patterns, rest)`15421543Шаблон отображения (mapping pattern) в match. `keys` – последовательность узлов выражений. `patterns` – соответствующая последовательность узлов шаблонов. `rest` – необязательное имя, которое можно указать для захвата оставшихся элементов отображения. Допустимые ключевые выражения ограничены, как описано в документации оператора match.15441545Этот шаблон успешно срабатывает, если subject является отображением, все вычисленные ключевые выражения присутствуют в отображении, а значение, соответствующее каждому ключу, совпадает с соответствующим подшаблоном. Если `rest` не равно `None`, то при успешном сопоставлении всего шаблона отображения этому имени привязывается словарь, содержащий оставшиеся элементы отображения.15461547```pycon1548>>> print(ast.dump(ast.parse("""1549... match x:1550...     case {1: _, 2: _}:1551...         ...1552...     case {**rest}:1553...         ...1554... """), indent=4))1555Module(1556    body=[1557        Match(1558            subject=Name(id='x', ctx=Load()),1559            cases=[1560                match_case(1561                    pattern=MatchMapping(1562                        keys=[1563                            Constant(value=1),1564                            Constant(value=2)],1565                        patterns=[1566                            MatchAs(),1567                            MatchAs()]),1568                    body=[1569                        Expr(1570                            value=Constant(value=Ellipsis))]),1571                match_case(1572                    pattern=MatchMapping(keys=[], patterns=[], rest='rest'),1573                    body=[1574                        Expr(1575                            value=Constant(value=Ellipsis))])])],1576    type_ignores=[])1577```15781579Добавлено в версии 3.10.15801581#### `class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)`15821583Шаблон класса (class pattern) в match. `cls` – выражение, задающее номинальный класс для сопоставления. `patterns` – последовательность узлов шаблонов, которые будут сопоставляться с определённой классом последовательностью атрибутов для сопоставления с образцом. `kwd_attrs` – последовательность дополнительных атрибутов для сопоставления (указанных как ключевые аргументы в шаблоне класса), `kwd_patterns` – соответствующие шаблоны (указанные как значения ключевых слов в шаблоне класса).15841585Этот шаблон успешно срабатывает, если subject является экземпляром указанного класса, все позиционные шаблоны совпадают с соответствующими атрибутами, определёнными классом, и все указанные ключевые атрибуты совпадают со своими шаблонами.15861587Примечание: классы могут определять свойство, возвращающее self, чтобы сопоставлять узел шаблона с сопоставляемым экземпляром. Некоторые встроенные типы также сопоставляются таким образом, как описано в документации оператора match.15881589```pycon1590>>> print(ast.dump(ast.parse("""1591... match x:1592...     case Point2D(0, 0):1593...         ...1594...     case Point3D(x=0, y=0, z=0):1595...         ...1596... """), indent=4))1597Module(1598    body=[1599        Match(1600            subject=Name(id='x', ctx=Load()),1601            cases=[1602                match_case(1603                    pattern=MatchClass(1604                        cls=Name(id='Point2D', ctx=Load()),1605                        patterns=[1606                            MatchValue(1607                                value=Constant(value=0)),1608                            MatchValue(1609                                value=Constant(value=0))],1610                        kwd_attrs=[],1611                        kwd_patterns=[]),1612                    body=[1613                        Expr(1614                            value=Constant(value=Ellipsis))]),1615                match_case(1616                    pattern=MatchClass(1617                        cls=Name(id='Point3D', ctx=Load()),1618                        patterns=[],1619                        kwd_attrs=[1620                            'x',1621                            'y',1622                            'z'],1623                        kwd_patterns=[1624                            MatchValue(1625                                value=Constant(value=0)),1626                            MatchValue(1627                                value=Constant(value=0)),1628                            MatchValue(1629                                value=Constant(value=0))]),1630                    body=[1631                        Expr(1632                            value=Constant(value=Ellipsis))])])],1633    type_ignores=[])1634```16351636Добавлено в версии 3.10.16371638#### `class ast.MatchAs(pattern, name)`16391640Сопоставление «as-pattern», шаблон захвата (capture pattern) или шаблон-заменитель (wildcard pattern). `pattern` содержит шаблон match, с которым будет сопоставлен subject. Если шаблон равен `None`, узел представляет собой шаблон захвата (т.е. просто имя) и всегда успешно срабатывает.16411642Атрибут `name` содержит имя, которое будет привязано при успешном сопоставлении шаблона. Если `name` равно `None`, то `pattern` также должно быть `None`, и узел представляет собой шаблон-заменитель (wildcard).16431644```pycon1645>>> print(ast.dump(ast.parse("""1646... match x:1647...     case [x] as y:1648...         ...1649...     case _:1650...         ...1651... """), indent=4))1652Module(1653    body=[1654        Match(1655            subject=Name(id='x', ctx=Load()),1656            cases=[1657                match_case(1658                    pattern=MatchAs(1659                        pattern=MatchSequence(1660                            patterns=[1661                                MatchAs(name='x')]),1662                        name='y'),1663                    body=[1664                        Expr(1665                            value=Constant(value=Ellipsis))]),1666                match_case(1667                    pattern=MatchAs(),1668                    body=[1669                        Expr(1670                            value=Constant(value=Ellipsis))])])],1671    type_ignores=[])1672```16731674Добавлено в версии 3.10.16751676#### `class ast.MatchOr(patterns)`16771678Сопоставление «or-pattern» (шаблон ИЛИ). Or-pattern последовательно сопоставляет каждый из своих подшаблонов с subject, пока один из них не сработает. Тогда считается, что or-pattern сработал. Если ни один из подшаблонов не сработал, or-pattern не срабатывает. Атрибут `patterns` содержит список узлов шаблонов match, которые будут сопоставляться с subject.16791680```pycon1681>>> print(ast.dump(ast.parse("""1682... match x:1683...     case [x] | (y):1684...         ...1685... """), indent=4))1686Module(1687    body=[1688        Match(1689            subject=Name(id='x', ctx=Load()),1690            cases=[1691                match_case(1692                    pattern=MatchOr(1693                        patterns=[1694                            MatchSequence(1695                                patterns=[1696                                    MatchAs(name='x')]),1697                            MatchAs(name='y')]),1698                    body=[1699                        Expr(1700                            value=Constant(value=Ellipsis))])])],1701    type_ignores=[])1702```17031704Добавлено в версии 3.10.17051706### Параметры типа17071708[Параметры типа](https://python-all.ru/3.12/reference/compound_stmts.html#type-params) могут существовать у классов, функций и псевдонимов типов.17091710#### `class ast.TypeVar(name, bound)`17111712Узел [`typing.TypeVar`](https://python-all.ru/3.12/library/typing.html#typing.TypeVar). `name` – это имя переменной типа. `bound` – это граница или ограничения, если они есть. Если `bound` является [`Tuple`](https://python-all.ru/3.12/library/ast.html#ast.Tuple), то оно представляет ограничения; в противном случае оно представляет границу.17131714```pycon1715>>> print(ast.dump(ast.parse("type Alias[T: int] = list[T]"), indent=4))1716Module(1717    body=[1718        TypeAlias(1719            name=Name(id='Alias', ctx=Store()),1720            type_params=[1721                TypeVar(1722                    name='T',1723                    bound=Name(id='int', ctx=Load()))],1724            value=Subscript(1725                value=Name(id='list', ctx=Load()),1726                slice=Name(id='T', ctx=Load()),1727                ctx=Load()))],1728    type_ignores=[])1729```17301731Добавлено в версии 3.12.17321733#### `class ast.ParamSpec(name)`17341735Узел [`typing.ParamSpec`](https://python-all.ru/3.12/library/typing.html#typing.ParamSpec). `name` – это имя спецификации параметра.17361737```pycon1738>>> print(ast.dump(ast.parse("type Alias[**P] = Callable[P, int]"), indent=4))1739Module(1740    body=[1741        TypeAlias(1742            name=Name(id='Alias', ctx=Store()),1743            type_params=[1744                ParamSpec(name='P')],1745            value=Subscript(1746                value=Name(id='Callable', ctx=Load()),1747                slice=Tuple(1748                    elts=[1749                        Name(id='P', ctx=Load()),1750                        Name(id='int', ctx=Load())],1751                    ctx=Load()),1752                ctx=Load()))],1753    type_ignores=[])1754```17551756Добавлено в версии 3.12.17571758#### `class ast.TypeVarTuple(name)`17591760Узел [`typing.TypeVarTuple`](https://python-all.ru/3.12/library/typing.html#typing.TypeVarTuple). `name` – это имя кортежа переменных типа.17611762```pycon1763>>> print(ast.dump(ast.parse("type Alias[*Ts] = tuple[*Ts]"), indent=4))1764Module(1765    body=[1766        TypeAlias(1767            name=Name(id='Alias', ctx=Store()),1768            type_params=[1769                TypeVarTuple(name='Ts')],1770            value=Subscript(1771                value=Name(id='tuple', ctx=Load()),1772                slice=Tuple(1773                    elts=[1774                        Starred(1775                            value=Name(id='Ts', ctx=Load()),1776                            ctx=Load())],1777                    ctx=Load()),1778                ctx=Load()))],1779    type_ignores=[])1780```17811782Добавлено в версии 3.12.17831784### Определения функций и классов17851786#### `class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)`17871788Определение функции.17891790- `name` – это необработанная строка имени функции.1791- `args` – это узел [`arguments`](https://python-all.ru/3.12/library/ast.html#ast.arguments).1792- `body` – это список узлов внутри функции.1793- `decorator_list` – это список декораторов, которые будут применены; декораторы перечислены от самого внешнего к внутреннему (т.е. первый в списке применяется последним).1794- `returns` – это аннотация возвращаемого значения.1795- `type_params` – это список [параметров типа](https://python-all.ru/3.12/library/ast.html#ast-type-params).17961797#### `type_comment`17981799`type_comment` – это необязательная строка с аннотацией типа в виде комментария.18001801Изменено в версии 3.12: Добавлен `type_params`.18021803#### `class ast.Lambda(args, body)`18041805`lambda` – это минимальное определение функции, которое можно использовать внутри выражения. В отличие от [`FunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.FunctionDef), `body` содержит один узел.18061807```pycon1808>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))1809Module(1810    body=[1811        Expr(1812            value=Lambda(1813                args=arguments(1814                    posonlyargs=[],1815                    args=[1816                        arg(arg='x'),1817                        arg(arg='y')],1818                    kwonlyargs=[],1819                    kw_defaults=[],1820                    defaults=[]),1821                body=Constant(value=Ellipsis)))],1822    type_ignores=[])1823```18241825#### `class ast.arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)`18261827Аргументы функции.18281829- `posonlyargs`, `args` и `kwonlyargs` – это списки узлов [`arg`](https://python-all.ru/3.12/library/ast.html#ast.arg).1830- `vararg` и `kwarg` – это одиночные узлы [`arg`](https://python-all.ru/3.12/library/ast.html#ast.arg), ссылающиеся на параметры `*args, **kwargs`.1831- `kw_defaults` – это список значений по умолчанию для keyword-only аргументов. Если один из них равен `None`, соответствующий аргумент обязателен.1832- `defaults` – это список значений по умолчанию для аргументов, которые можно передавать позиционно. Если значений по умолчанию меньше, они соответствуют последним n аргументам.18331834#### `class ast.arg(arg, annotation, type_comment)`18351836Один аргумент в списке. `arg` – это сырая строка с именем аргумента; `annotation` – это его аннотация, например, узел [`Name`](https://python-all.ru/3.12/library/ast.html#ast.Name).18371838#### `type_comment`18391840`type_comment` – это необязательная строка с аннотацией типа в виде комментария18411842```pycon1843>>> print(ast.dump(ast.parse("""\1844... @decorator11845... @decorator21846... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':1847...     pass1848... """), indent=4))1849Module(1850    body=[1851        FunctionDef(1852            name='f',1853            args=arguments(1854                posonlyargs=[],1855                args=[1856                    arg(1857                        arg='a',1858                        annotation=Constant(value='annotation')),1859                    arg(arg='b'),1860                    arg(arg='c')],1861                vararg=arg(arg='d'),1862                kwonlyargs=[1863                    arg(arg='e'),1864                    arg(arg='f')],1865                kw_defaults=[1866                    None,1867                    Constant(value=3)],1868                kwarg=arg(arg='g'),1869                defaults=[1870                    Constant(value=1),1871                    Constant(value=2)]),1872            body=[1873                Pass()],1874            decorator_list=[1875                Name(id='decorator1', ctx=Load()),1876                Name(id='decorator2', ctx=Load())],1877            returns=Constant(value='return annotation'),1878            type_params=[])],1879    type_ignores=[])1880```18811882#### `class ast.Return(value)`18831884Инструкция `return`.18851886```pycon1887>>> print(ast.dump(ast.parse('return 4'), indent=4))1888Module(1889    body=[1890        Return(1891            value=Constant(value=4))],1892    type_ignores=[])1893```18941895#### `class ast.Yield(value)`18961897#### `class ast.YieldFrom(value)`18981899Выражение `yield` или `yield from`. Поскольку это выражения, они должны быть обёрнуты в узел [`Expr`](https://python-all.ru/3.12/library/ast.html#ast.Expr), если возвращаемое значение не используется.19001901```pycon1902>>> print(ast.dump(ast.parse('yield x'), indent=4))1903Module(1904    body=[1905        Expr(1906            value=Yield(1907                value=Name(id='x', ctx=Load())))],1908    type_ignores=[])19091910>>> print(ast.dump(ast.parse('yield from x'), indent=4))1911Module(1912    body=[1913        Expr(1914            value=YieldFrom(1915                value=Name(id='x', ctx=Load())))],1916    type_ignores=[])1917```19181919#### `class ast.Global(names)`19201921#### `class ast.Nonlocal(names)`19221923Инструкции `global` и `nonlocal`. `names` – это список сырых строк.19241925```pycon1926>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))1927Module(1928    body=[1929        Global(1930            names=[1931                'x',1932                'y',1933                'z'])],1934    type_ignores=[])19351936>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))1937Module(1938    body=[1939        Nonlocal(1940            names=[1941                'x',1942                'y',1943                'z'])],1944    type_ignores=[])1945```19461947#### `class ast.ClassDef(name, bases, keywords, body, decorator_list, type_params)`19481949Определение класса.19501951- `name` – это сырая строка с именем класса.1952- `bases` – это список узлов для явно указанных базовых классов.1953- `keywords` – это список узлов [`keyword`](https://python-all.ru/3.12/library/ast.html#ast.keyword), в первую очередь для ‘metaclass’. Остальные ключевые слова будут переданы метаклассу, в соответствии с [**PEP 3115**](https://python-all.ru/3.12/library/ast.html).1954- `body` – это список узлов, представляющих код внутри определения класса.1955- `decorator_list` – это список узлов, как и в [`FunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.FunctionDef).1956- `type_params` – это список [параметров типа](https://python-all.ru/3.12/library/ast.html#ast-type-params).19571958```pycon1959>>> print(ast.dump(ast.parse("""\1960... @decorator11961... @decorator21962... class Foo(base1, base2, metaclass=meta):1963...     pass1964... """), indent=4))1965Module(1966    body=[1967        ClassDef(1968            name='Foo',1969            bases=[1970                Name(id='base1', ctx=Load()),1971                Name(id='base2', ctx=Load())],1972            keywords=[1973                keyword(1974                    arg='metaclass',1975                    value=Name(id='meta', ctx=Load()))],1976            body=[1977                Pass()],1978            decorator_list=[1979                Name(id='decorator1', ctx=Load()),1980                Name(id='decorator2', ctx=Load())],1981            type_params=[])],1982    type_ignores=[])1983```19841985Изменено в версии 3.12: Добавлен `type_params`.19861987### async и await19881989#### `class ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)`19901991Определение функции `async def`. Имеет те же поля, что и [`FunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.FunctionDef).19921993Изменено в версии 3.12: Добавлен `type_params`.19941995#### `class ast.Await(value)`19961997Выражение `await`. `value` – это то, чего оно ожидает. Допустимо только в теле [`AsyncFunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.AsyncFunctionDef).19981999```pycon2000>>> print(ast.dump(ast.parse("""\2001... async def f():2002...     await other_func()2003... """), indent=4))2004Module(2005    body=[2006        AsyncFunctionDef(2007            name='f',2008            args=arguments(2009                posonlyargs=[],2010                args=[],2011                kwonlyargs=[],2012                kw_defaults=[],2013                defaults=[]),2014            body=[2015                Expr(2016                    value=Await(2017                        value=Call(2018                            func=Name(id='other_func', ctx=Load()),2019                            args=[],2020                            keywords=[])))],2021            decorator_list=[],2022            type_params=[])],2023    type_ignores=[])2024```20252026#### `class ast.AsyncFor(target, iter, body, orelse, type_comment)`20272028#### `class ast.AsyncWith(items, body, type_comment)`20292030`async for` циклы и `async with` менеджеры контекста. Они имеют те же поля, что [`For`](https://python-all.ru/3.12/library/ast.html#ast.For) и [`With`](https://python-all.ru/3.12/library/ast.html#ast.With), соответственно. Допустимы только в теле [`AsyncFunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.AsyncFunctionDef).20312032> **Примечание**2033>2034> Когда строка разбирается парсером [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse), узлы операторов (подклассы `ast.operator`, `ast.unaryop`, `ast.cmpop`, `ast.boolop` и `ast.expr_context`) на возвращаемом дереве являются синглтонами. Изменения в одном будут отражены во всех других вхождениях того же значения (например, [`ast.Add`](https://python-all.ru/3.12/library/ast.html#ast.Add)).20352036## [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) Вспомогательные функции20372038Помимо классов узлов, модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) определяет следующие служебные функции и классы для обхода абстрактных синтаксических деревьев:20392040#### `ast.parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None)`20412042Разбирает исходный код в узел AST. Эквивалентно `compile(source, filename, mode, ast.PyCF_ONLY_AST)`.20432044Если задан `type_comments=True`, парсер изменяется, чтобы проверять и возвращать комментарии типов, как указано в [**PEP 484**](https://python-all.ru/3.12/library/ast.html) и [**PEP 526**](https://python-all.ru/3.12/library/ast.html). Это эквивалентно добавлению [`ast.PyCF_TYPE_COMMENTS`](https://python-all.ru/3.12/library/ast.html#ast.PyCF_TYPE_COMMENTS) к флагам, передаваемым в [`compile()`](https://python-all.ru/3.12/library/functions.html#compile). Это приведёт к сообщению об ошибках синтаксиса для неправильно расположенных комментариев типов. Без этого флага комментарии типов будут игнорироваться, и поле `type_comment` в выбранных узлах AST всегда будет `None`. Кроме того, расположение комментариев `# type: ignore` будет возвращаться как атрибут `type_ignores` объекта [`Module`](https://python-all.ru/3.12/library/ast.html#ast.Module) (иначе это всегда пустой список).20452046Кроме того, если `mode` равно `'func_type'`, синтаксис входных данных изменяется в соответствии с [**PEP 484**](https://python-all.ru/3.12/library/ast.html) «сигнатурными комментариями типов», например `(str, int) -> List[str]`.20472048Установка `feature_version` в кортеж `(major, minor)` приведёт к «наилучшей попытке» разбора с использованием грамматики этой версии Python. Например, установка `feature_version=(3, 9)` будет пытаться запретить разбор инструкций [`match`](https://python-all.ru/3.12/reference/compound_stmts.html#match). В настоящее время `major` должно быть равно `3`. Самая низкая поддерживаемая версия – `(3, 4)` (и это может увеличиться в будущих версиях Python); самая высокая – `sys.version_info[0:2]`. «Наилучшая попытка» означает, что нет гарантии, что разбор (или успех разбора) будет таким же, как при запуске на версии Python, соответствующей `feature_version`.20492050Если исходный код содержит нулевой символ (`\0`), возбуждается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError).20512052> **Предупреждение**2053>2054> Обратите внимание, что успешный разбор исходного кода в объект AST не гарантирует, что предоставленный исходный код является корректным кодом Python, который можно выполнить, поскольку этап компиляции может вызывать дополнительные исключения [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError). Например, исходный код `return 42` генерирует корректный узел AST для инструкции return, но его нельзя скомпилировать отдельно (он должен находиться внутри узла функции).2055>2056> В частности, [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) не выполняет никаких проверок областей видимости, которые выполняет этап компиляции.20572058> **Предупреждение**2059>2060> Можно вызвать сбой интерпретатора Python с помощью достаточно большой/сложной строки из-за ограничений глубины стека в компиляторе AST Python.20612062Изменено в версии 3.8: Добавлены `type_comments`, `mode='func_type'` и `feature_version`.20632064#### `ast.unparse(ast_obj)`20652066Выполняет обратный разбор объекта [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST) и генерирует строку с кодом, который при обратном разборе с помощью [`ast.parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse) даст эквивалентный объект [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST).20672068> **Предупреждение**2069>2070> Полученная строка кода не обязательно будет равна исходному коду, который породил объект [`ast.AST`](https://python-all.ru/3.12/library/ast.html#ast.AST) (без каких-либо оптимизаций компилятора, таких как константные кортежи/frozensets).20712072> **Предупреждение**2073>2074> Попытка выполнить обратный разбор очень сложного выражения приведёт к [`RecursionError`](https://python-all.ru/3.12/library/exceptions.html#RecursionError).20752076Добавлено в версии 3.9.20772078#### `ast.literal_eval(node_or_string)`20792080Вычисляет узел выражения или строку, содержащую только литерал Python или отображение контейнера. Предоставленная строка или узел могут состоять только из следующих структур литералов Python: строки, байты, числа, кортежи, списки, словари, множества, булевы значения, `None` и `Ellipsis`.20812082Это можно использовать для вычисления строк, содержащих значения Python, без необходимости разбирать значения самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с операторами или индексацией.20832084Раньше эта функция документировалась как «безопасная» без определения, что это значит. Это вводило в заблуждение. Она специально разработана так, чтобы не выполнять код Python, в отличие от более общей [`eval()`](https://python-all.ru/3.12/library/functions.html#eval). Нет пространства имён, поиска имён или возможности внешних вызовов. Но она не свободна от атак: относительно небольшой ввод может привести к истощению памяти или истощению стека C, что вызовет сбой процесса. Также существует возможность отказа в обслуживании из-за чрезмерного потребления ЦП на некоторых входных данных. Поэтому вызывать её на недоверенных данных не рекомендуется.20852086> **Предупреждение**2087>2088> Можно вызвать сбой интерпретатора Python из-за ограничений глубины стека в компиляторе AST Python.2089>2090> Она может возбуждать [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), [`TypeError`](https://python-all.ru/3.12/library/exceptions.html#TypeError), [`SyntaxError`](https://python-all.ru/3.12/library/exceptions.html#SyntaxError), [`MemoryError`](https://python-all.ru/3.12/library/exceptions.html#MemoryError) и [`RecursionError`](https://python-all.ru/3.12/library/exceptions.html#RecursionError) в зависимости от некорректного ввода.20912092Изменено в версии 3.2: Теперь допускает литералы байтов и множеств.20932094Изменено в версии 3.9: Теперь поддерживает создание пустых множеств с помощью `'set()'`.20952096Изменено в версии 3.10: Для строковых входных данных начальные пробелы и табуляции теперь удаляются.20972098#### `ast.get_docstring(node, clean=True)`20992100Возвращает строку документации для данного *узла* (который должен быть узлом [`FunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.FunctionDef), [`AsyncFunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.AsyncFunctionDef), [`ClassDef`](https://python-all.ru/3.12/library/ast.html#ast.ClassDef) или [`Module`](https://python-all.ru/3.12/library/ast.html#ast.Module)) или `None`, если у него нет строки документации. Если *clean* истинно, очищает отступы строки документации с помощью [`inspect.cleandoc()`](https://python-all.ru/3.12/library/inspect.html#inspect.cleandoc).21012102Изменено в версии 3.5: Теперь поддерживается [`AsyncFunctionDef`](https://python-all.ru/3.12/library/ast.html#ast.AsyncFunctionDef).21032104#### `ast.get_source_segment(source, node, *, padded=False)`21052106Возвращает фрагмент исходного кода из *source*, который породил узел *node*. Если не хватает информации о местоположении ([`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno), [`end_lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_lineno), [`col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.col_offset) или [`end_col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_col_offset)), возвращает `None`.21072108Если *padded* равно `True`, первая строка многострочного оператора будет дополнена пробелами, чтобы соответствовать исходной позиции.21092110Добавлено в версии 3.8.21112112#### `ast.fix_missing_locations(node)`21132114При компиляции дерева узлов с помощью [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) компилятор ожидает атрибуты [`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno) и [`col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.col_offset) для каждого узла, который их поддерживает. Заполнять их вручную для сгенерированных узлов довольно утомительно, поэтому эта вспомогательная функция рекурсивно добавляет эти атрибуты, если их ещё нет, устанавливая их равными значениям родительского узла. Работает рекурсивно, начиная с *node*.21152116#### `ast.increment_lineno(node, n=1)`21172118Увеличивает номер строки и номер конечной строки каждого узла в дереве, начиная с *node*, на *n*. Это полезно для «перемещения кода» в другое место в файле.21192120#### `ast.copy_location(new_node, old_node)`21212122Копирует информацию о местоположении в исходном коде ([`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.12/library/ast.html#ast.AST.end_col_offset)) из *old\_node* в *new\_node*, если это возможно, и возвращает *new\_node*.21232124#### `ast.iter_fields(node)`21252126Генерирует кортеж из `(fieldname, value)` для каждого поля в `node._fields`, которое присутствует в *node*.21272128#### `ast.iter_child_nodes(node)`21292130Генерирует все непосредственные дочерние узлы *node*, то есть все поля, являющиеся узлами, и все элементы полей, являющихся списками узлов.21312132#### `ast.walk(node)`21332134Рекурсивно генерирует все узлы-потомки в дереве, начиная с *node* (включая сам *node*), в произвольном порядке. Это полезно, если требуется только изменить узлы на месте, а контекст не важен.21352136#### `class ast.NodeVisitor`21372138Базовый класс для обхода узлов, который обходит абстрактное синтаксическое дерево и вызывает функцию-посетитель для каждого найденного узла. Эта функция может вернуть значение, которое передаётся методом [`visit()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.visit).21392140Этот класс предназначен для наследования; в подклассе добавляются методы-посетители.21412142#### `visit(node)`21432144Посещает узел. Реализация по умолчанию вызывает метод `self.visit_classname`, где *classname* – имя класса узла, или [`generic_visit()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.generic_visit), если такой метод отсутствует.21452146#### `generic_visit(node)`21472148Этот посетитель вызывает [`visit()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.visit) для всех дочерних узлов.21492150Обратите внимание, что дочерние узлы тех узлов, для которых определён собственный метод-посетитель, не будут посещены, если посетитель сам не вызовет [`generic_visit()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.generic_visit) или не обойдёт их самостоятельно.21512152#### `visit_Constant(node)`21532154Обрабатывает все константные узлы.21552156Не используйте [`NodeVisitor`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor), если требуется вносить изменения в узлы во время обхода. Для этого существует специальный посетитель ([`NodeTransformer`](https://python-all.ru/3.12/library/ast.html#ast.NodeTransformer)), который допускает модификации.21572158Устарело с версии 3.8: Методы `visit_Num()`, `visit_Str()`, `visit_Bytes()`, `visit_NameConstant()` и `visit_Ellipsis()` теперь устарели и не будут вызываться в будущих версиях Python. Добавьте метод [`visit_Constant()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.visit_Constant) для обработки всех узлов-констант.21592160#### `class ast.NodeTransformer`21612162Подкласс [`NodeVisitor`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor), который обходит абстрактное синтаксическое дерево и позволяет изменять узлы.21632164Метод [`NodeTransformer`](https://python-all.ru/3.12/library/ast.html#ast.NodeTransformer) обходит AST и использует возвращаемое значение методов-посетителей для замены или удаления старого узла. Если возвращаемое значение метода-посетителя равно `None`, узел будет удалён из своего местоположения; в противном случае он заменяется возвращённым значением. Возвращённое значение может быть исходным узлом – в этом случае замена не происходит.21652166Вот пример преобразователя, который переписывает все обращения к именам (`foo`) в `data['foo']`:21672168```python2169class RewriteName(NodeTransformer):21702171    def visit_Name(self, node):2172        return Subscript(2173            value=Name(id='data', ctx=Load()),2174            slice=Constant(value=node.id),2175            ctx=node.ctx2176        )2177```21782179Имейте в виду: если у узла, с которым вы работаете, есть дочерние узлы, необходимо либо преобразовать дочерние узлы самостоятельно, либо сначала вызвать для узла метод [`generic_visit()`](https://python-all.ru/3.12/library/ast.html#ast.NodeVisitor.generic_visit).21802181Для узлов, входящих в состав набора инструкций (это относится ко всем узлам инструкций), посетитель может также возвращать список узлов, а не один узел.21822183Если [`NodeTransformer`](https://python-all.ru/3.12/library/ast.html#ast.NodeTransformer) вводит новые узлы (не входившие в исходное дерево) без указания информации о расположении (например, [`lineno`](https://python-all.ru/3.12/library/ast.html#ast.AST.lineno)), следует вызвать [`fix_missing_locations()`](https://python-all.ru/3.12/library/ast.html#ast.fix_missing_locations) для нового поддерева, чтобы пересчитать информацию о расположении:21842185```python2186tree = ast.parse('foo', mode='eval')2187new_tree = fix_missing_locations(RewriteName().visit(tree))2188```21892190Обычно преобразователь используется следующим образом:21912192```python2193node = YourTransformer().visit(node)2194```21952196#### `ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None)`21972198Возвращает форматированный дамп дерева из *node*. Это в основном полезно для отладки. Если *annotate\_fields* равно true (по умолчанию), возвращаемая строка будет показывать имена и значения полей. Если *annotate\_fields* равно false, результирующая строка будет более компактной за счёт опускания однозначных имён полей. Атрибуты, такие как номера строк и смещения столбцов, по умолчанию не выводятся. Если это нужно, *include\_attributes* можно установить в true.21992200Если *indent* – неотрицательное целое число или строка, дерево будет выведено с отступами указанного уровня. Уровень отступа 0, отрицательное значение или `""` вставляет только переводы строк. `None` (по умолчанию) выбирает однострочное представление. Положительный целочисленный отступ добавляет соответствующее количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), эта строка используется для отступа каждого уровня.22012202Изменено в версии 3.9: Добавлена опция *indent*.22032204## Флаги компилятора22052206Следующие флаги могут быть переданы в [`compile()`](https://python-all.ru/3.12/library/functions.html#compile) для изменения эффектов компиляции программы:22072208#### `ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`22092210Включает поддержку `await`, `async for`, `async with` и асинхронных включений верхнего уровня.22112212Добавлено в версии 3.8.22132214#### `ast.PyCF_ONLY_AST`22152216Генерирует и возвращает абстрактное синтаксическое дерево вместо скомпилированного объекта кода.22172218#### `ast.PyCF_TYPE_COMMENTS`22192220Включает поддержку комментариев типов в стиле [**PEP 484**](https://python-all.ru/3.12/library/ast.html) и [**PEP 526**](https://python-all.ru/3.12/library/ast.html) (`# type: <type>`, `# type: ignore <stuff>`).22212222Добавлено в версии 3.8.22232224## Использование командной строки22252226Добавлено в версии 3.9.22272228Модуль [`ast`](https://python-all.ru/3.12/library/ast.html#module-ast) может быть выполнен как скрипт из командной строки. Это просто:22292230```sh2231python -m ast [-m <mode>] [-a] [infile]2232```22332234Принимаются следующие опции:22352236#### `-h, --help`22372238Показать справку и выйти.22392240#### `-m <mode>`22412242#### `--mode <mode>`22432244Определяет, какой вид кода должен быть скомпилирован, как аргумент *mode* в [`parse()`](https://python-all.ru/3.12/library/ast.html#ast.parse).22452246#### `--no-type-comments`22472248Не обрабатывать комментарии типов.22492250#### `-a, --include-attributes`22512252Включать атрибуты, такие как номера строк и смещения столбцов.22532254#### `-i <indent>`22552256#### `--indent <indent>`22572258Отступ узлов в AST (количество пробелов).22592260Если указан `infile`, его содержимое разбирается в AST и выводится в stdout. В противном случае содержимое читается из stdin.22612262> **См. также**2263>2264> [Green Tree Snakes](https://python-all.ru/3.12/library/ast.html) – внешний документационный ресурс, содержащий подробности работы с AST Python.2265>2266> [ASTTokens](https://python-all.ru/3.12/library/ast.html) дополняет AST Python позициями токенов и текста в исходном коде, который их породил. Это полезно для инструментов, выполняющих преобразования исходного кода.2267>2268> [leoAst.py](https://python-all.ru/3.12/library/ast.html) объединяет токен-ориентированное и синтаксическое представление программ Python, вставляя двунаправленные связи между токенами и узлами AST.2269>2270> [LibCST](https://python-all.ru/3.12/library/ast.html) разбирает код как конкретное синтаксическое дерево, похожее на AST, и сохраняет все детали форматирования. Это полезно для создания приложений автоматического рефакторинга (codemod) и линтеров.2271>2272> [Parso](https://python-all.ru/3.12/library/ast.html) – это парсер Python, поддерживающий восстановление после ошибок и сквозной разбор для разных версий Python (в нескольких версиях Python). Parso также может выводить несколько синтаксических ошибок в вашем файле Python.2273