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

ast.md

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

1> **Источник:** https://python-all.ru/3.13/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.13/Lib/ast.py)1011---1213Модуль `ast` помогает приложениям Python обрабатывать деревья абстрактного синтаксиса языка Python. Абстрактный синтаксис может меняться от версии к версии; с помощью этого модуля можно программно узнать, как выглядит текущая грамматика.1415Абстрактное синтаксическое дерево можно создать, передав [`ast.PyCF_ONLY_AST`](https://python-all.ru/3.13/library/ast.html#ast.PyCF_ONLY_AST) в качестве флага встроенной функции [`compile()`](https://python-all.ru/3.13/library/functions.html#compile) или используя вспомогательную функцию [`parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) из этого модуля. Результатом будет дерево объектов, классы которых наследуют от [`ast.AST`](https://python-all.ru/3.13/library/ast.html#ast.AST). Абстрактное синтаксическое дерево можно скомпилировать в объект кода Python с помощью встроенной функции `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, expr? default_value)170               | ParamSpec(identifier name, expr? default_value)171               | TypeVarTuple(identifier name, expr? default_value)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.13/library/ast.html#abstract-grammar). Они определены в C-модуле `_ast` и повторно экспортируются в `ast`.181182Для каждого символа левой части абстрактной грамматики определён один класс (например, `ast.stmt` или `ast.expr`). Кроме того, для каждого конструктора правой части определён один класс; эти классы наследуют от классов для деревьев левой части. Например, [`ast.BinOp`](https://python-all.ru/3.13/library/ast.html#ast.BinOp) наследует от `ast.expr`. Для продукционных правил с альтернативами (так называемых «сумм») класс левой части является абстрактным: создаются только экземпляры конкретных узлов-конструкторов.183184#### `_fields`185186Каждый конкретный класс имеет атрибут `_fields`, который содержит имена всех дочерних узлов.187188Каждый экземпляр конкретного класса имеет по одному атрибуту для каждого дочернего узла, тип которого определён в грамматике. Например, экземпляры [`ast.BinOp`](https://python-all.ru/3.13/library/ast.html#ast.BinOp) имеют атрибут `left` типа `ast.expr`.189190Если эти атрибуты помечены как необязательные в грамматике (с помощью вопросительного знака), значением может быть `None`. Если атрибуты могут иметь ноль или более значений (помечены звёздочкой), значения представляются в виде списков Python. Все возможные атрибуты должны присутствовать и иметь корректные значения при компиляции AST с помощью [`compile()`](https://python-all.ru/3.13/library/functions.html#compile).191192#### `_field_types`193194Атрибут `_field_types` каждого конкретного класса представляет собой словарь, отображающий имена полей (как указано в [`_fields`](https://python-all.ru/3.13/library/ast.html#ast.AST._fields)) в их типы.195196```pycon197>>> ast.TypeVar._field_types198{'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None}199```200201Добавлено в версии 3.13.202203#### `lineno`204205#### `col_offset`206207#### `end_lineno`208209#### `end_col_offset`210211Экземпляры подклассов `ast.expr` и `ast.stmt` имеют атрибуты [`lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_col_offset). Атрибуты `lineno` и `end_lineno` – это номер первой и последней строки исходного текста (нумерация с 1, то есть первая строка – строка 1), а `col_offset` и `end_col_offset` – соответствующие смещения в байтах UTF-8 от первого и последнего токенов, породивших узел. Смещение UTF-8 записывается, потому что парсер использует UTF-8 внутри.212213Обратите внимание, что конечные позиции не требуются компилятором и поэтому являются необязательными. Смещение конца находится *после* последнего символа, например, можно получить фрагмент исходного кода узла выражения из одной строки с помощью `source_line[node.col_offset : node.end_col_offset]`.214215Конструктор класса `ast.T` разбирает свои аргументы следующим образом:216217- Если есть позиционные аргументы, их должно быть столько же, сколько элементов в `T._fields`; они будут присвоены как атрибуты с этими именами.218- Если есть ключевые аргументы, они установят атрибуты с теми же именами в указанные значения.219220Например, чтобы создать и заполнить узел [`ast.UnaryOp`](https://python-all.ru/3.13/library/ast.html#ast.UnaryOp), можно использовать221222```python223node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),224                   lineno=0, col_offset=0)225```226227Если поле, которое является необязательным в грамматике, опущено в конструкторе, оно по умолчанию равно `None`. Если опущено поле-список, оно по умолчанию равно пустому списку. Если опущено поле типа `ast.expr_context`, оно по умолчанию равно [`Load()`](https://python-all.ru/3.13/library/ast.html#ast.Load). Если опущено любое другое поле, возбуждается [`DeprecationWarning`](https://python-all.ru/3.13/library/exceptions.html#DeprecationWarning) и узел AST не будет иметь этого поля. В Python 3.15 это условие будет вызывать ошибку.228229Изменено в версии 3.8: Класс [`ast.Constant`](https://python-all.ru/3.13/library/ast.html#ast.Constant) теперь используется для всех констант.230231Изменено в версии 3.9: Простые индексы представляются своим значением, расширенные срезы представляются кортежами.232233Изменено в версии 3.13: Конструкторы узлов AST были изменены, чтобы предоставлять разумные значения по умолчанию для пропущенных полей: необязательные поля теперь по умолчанию равны `None`, поля-списки по умолчанию равны пустому списку, а поля типа `ast.expr_context` по умолчанию равны [`Load()`](https://python-all.ru/3.13/library/ast.html#ast.Load). Ранее пропущенные атрибуты отсутствовали у сконструированных узлов (при обращении к ним возбуждалось [`AttributeError`](https://python-all.ru/3.13/library/exceptions.html#AttributeError)).234235Устарело с версии 3.8: Старые классы `ast.Num`, `ast.Str`, `ast.Bytes`, `ast.NameConstant` и `ast.Ellipsis` всё ещё доступны, но будут удалены в будущих версиях Python. А пока их создание будет возвращать экземпляр другого класса.236237Устарело с версии 3.9: Старые классы `ast.Index` и `ast.ExtSlice` всё ещё доступны, но будут удалены в будущих выпусках Python. При этом при их создании будет возвращён экземпляр другого класса.238239Устарело с версии 3.13, будет удалено в версии 3.15: В предыдущих версиях Python допускалось создание узлов AST с отсутствующими обязательными полями. Кроме того, конструкторы узлов AST принимали произвольные ключевые аргументы, которые устанавливались как атрибуты узла AST, даже если они не соответствовали ни одному из полей узла AST. Это поведение устарело и будет удалено в Python 3.15.240241> **Примечание**242>243> Описания конкретных классов узлов, приведённые здесь, изначально были адаптированы из замечательного проекта [Green Tree Snakes](https://python-all.ru/3.13/library/ast.html) и всех его участников.244245### Корневые узлы246247#### `class ast.Module(body, type_ignores)`248249A Python module, as with [file input](https://python-all.ru/3.13/reference/toplevel_components.html#file-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) in the default `"exec"` *mode*.250251`body` is a [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) of the module’s [Statements](https://python-all.ru/3.13/library/ast.html#ast-statements).252253`type_ignores` – это список [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) комментариев об игнорировании типов в модуле; подробнее см. в [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse).254255```pycon256>>> print(ast.dump(ast.parse('x = 1'), indent=4))257Module(258    body=[259        Assign(260            targets=[261                Name(id='x', ctx=Store())],262            value=Constant(value=1))])263```264265#### `class ast.Expression(body)`266267A single Python [expression input](https://python-all.ru/3.13/reference/toplevel_components.html#expression-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) when *mode* is `"eval"`.268269`body` is a single node, one of the [expression types](https://python-all.ru/3.13/library/ast.html#ast-expressions).270271```pycon272>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))273Expression(274    body=Constant(value=123))275```276277#### `class ast.Interactive(body)`278279A single [interactive input](https://python-all.ru/3.13/reference/toplevel_components.html#interactive), like in [Interactive Mode](https://python-all.ru/3.13/tutorial/appendix.html#tut-interac). Node type generated by [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) when *mode* is `"single"`.280281`body` is a [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) of [statement nodes](https://python-all.ru/3.13/library/ast.html#ast-statements).282283```pycon284>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))285Interactive(286    body=[287        Assign(288            targets=[289                Name(id='x', ctx=Store())],290            value=Constant(value=1)),291        Assign(292            targets=[293                Name(id='y', ctx=Store())],294            value=Constant(value=2))])295```296297#### `class ast.FunctionType(argtypes, returns)`298299A 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.13/library/ast.html) annotations. Node type generated by [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) when *mode* is `"func_type"`.300301Такие комментарии о типах выглядели следующим образом:302303```python304def sum_two_number(a, b):305    # type: (int, int) -> int306    return a + b307```308309`argtypes` is a [`list`](https://python-all.ru/3.13/library/stdtypes.html#list) of [expression nodes](https://python-all.ru/3.13/library/ast.html#ast-expressions).310311`returns` is a single [expression node](https://python-all.ru/3.13/library/ast.html#ast-expressions).312313```pycon314>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))315FunctionType(316    argtypes=[317        Name(id='int', ctx=Load()),318        Name(id='str', ctx=Load())],319    returns=Subscript(320        value=Name(id='List', ctx=Load()),321        slice=Name(id='int', ctx=Load()),322        ctx=Load()))323```324325Добавлено в версии 3.8.326327### Литералы328329#### `class ast.Constant(value, kind)`330331Постоянное значение. Атрибут `value` `Constant` литерала содержит представляемый объект Python. Представленными значениями могут быть экземпляры [`str`](https://python-all.ru/3.13/library/stdtypes.html#str), [`bytes`](https://python-all.ru/3.13/library/stdtypes.html#bytes), [`int`](https://python-all.ru/3.13/library/functions.html#int), [`float`](https://python-all.ru/3.13/library/functions.html#float), [`complex`](https://python-all.ru/3.13/library/functions.html#complex) и [`bool`](https://python-all.ru/3.13/library/functions.html#bool), а также константы [`None`](https://python-all.ru/3.13/library/constants.html#None) и [`Ellipsis`](https://python-all.ru/3.13/library/constants.html#Ellipsis).332333Атрибут `kind` – необязательная строка. Для строковых литералов с префиксом `u` значение `kind` устанавливается в `'u'`. Для всех остальных констант `kind` равно `None`.334335```pycon336>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))337Expression(338    body=Constant(value=123))339>>> print(ast.dump(ast.parse("u'hello'", mode='eval'), indent=4))340Expression(341    body=Constant(value='hello', kind='u'))342```343344#### `class ast.FormattedValue(value, conversion, format_spec)`345346Узел, представляющий одно поле форматирования в f-строке. Если строка содержит только одно поле форматирования и больше ничего, узел может быть изолированным; в противном случае он встречается внутри [`JoinedStr`](https://python-all.ru/3.13/library/ast.html#ast.JoinedStr).347348- `value` – это любой узел выражения (например, литерал, переменная или вызов функции).349- `conversion` – целое число:350351  - -1: без форматирования352  - 115: `!s` форматирование строк353  - 114: `!r` форматирование repr354  - 97: `!a` форматирование ascii355- `format_spec` – узел [`JoinedStr`](https://python-all.ru/3.13/library/ast.html#ast.JoinedStr), представляющий форматирование значения, или `None`, если формат не указан. `conversion` и `format_spec` могут быть установлены одновременно.356357#### `class ast.JoinedStr(values)`358359F-строка, содержащая последовательность [`FormattedValue`](https://python-all.ru/3.13/library/ast.html#ast.FormattedValue) и [`Constant`](https://python-all.ru/3.13/library/ast.html#ast.Constant) узлов.360361```pycon362>>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4))363Expression(364    body=JoinedStr(365        values=[366            Constant(value='sin('),367            FormattedValue(368                value=Name(id='a', ctx=Load()),369                conversion=-1),370            Constant(value=') is '),371            FormattedValue(372                value=Call(373                    func=Name(id='sin', ctx=Load()),374                    args=[375                        Name(id='a', ctx=Load())]),376                conversion=-1,377                format_spec=JoinedStr(378                    values=[379                        Constant(value='.3')]))]))380```381382#### `class ast.List(elts, ctx)`383384#### `class ast.Tuple(elts, ctx)`385386Список или кортеж. `elts` содержит список узлов, представляющих элементы. `ctx` равен [`Store`](https://python-all.ru/3.13/library/ast.html#ast.Store), если контейнер является целью присваивания (т.е. `(x,y)=something`), и [`Load`](https://python-all.ru/3.13/library/ast.html#ast.Load) в противном случае.387388```pycon389>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))390Expression(391    body=List(392        elts=[393            Constant(value=1),394            Constant(value=2),395            Constant(value=3)],396        ctx=Load()))397>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))398Expression(399    body=Tuple(400        elts=[401            Constant(value=1),402            Constant(value=2),403            Constant(value=3)],404        ctx=Load()))405```406407#### `class ast.Set(elts)`408409Множество. `elts` содержит список узлов, представляющих элементы множества.410411```pycon412>>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))413Expression(414    body=Set(415        elts=[416            Constant(value=1),417            Constant(value=2),418            Constant(value=3)]))419```420421#### `class ast.Dict(keys, values)`422423Словарь. `keys` и `values` содержат списки узлов, представляющих ключи и значения соответственно, в соответствующем порядке (то, что было бы возвращено при вызове `dictionary.keys()` и `dictionary.values()`).424425При распаковке словаря с помощью литералов словаря выражение, которое нужно раскрыть, помещается в список `values`, а `None` – на соответствующую позицию в `keys`.426427```pycon428>>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4))429Expression(430    body=Dict(431        keys=[432            Constant(value='a'),433            None],434        values=[435            Constant(value=1),436            Name(id='d', ctx=Load())]))437```438439### Переменные440441#### `class ast.Name(id, ctx)`442443Имя переменной. `id` содержит имя в виде строки, а `ctx` – один из следующих типов.444445#### `class ast.Load`446447#### `class ast.Store`448449#### `class ast.Del`450451Ссылки на переменные можно использовать для загрузки значения переменной, для присваивания ей нового значения или для её удаления. Ссылки на переменные получают контекст, чтобы различать эти случаи.452453```pycon454>>> print(ast.dump(ast.parse('a'), indent=4))455Module(456    body=[457        Expr(458            value=Name(id='a', ctx=Load()))])459460>>> print(ast.dump(ast.parse('a = 1'), indent=4))461Module(462    body=[463        Assign(464            targets=[465                Name(id='a', ctx=Store())],466            value=Constant(value=1))])467468>>> print(ast.dump(ast.parse('del a'), indent=4))469Module(470    body=[471        Delete(472            targets=[473                Name(id='a', ctx=Del())])])474```475476#### `class ast.Starred(value, ctx)`477478Ссылка на переменную `*var`. В `value` хранится переменная, обычно узел [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name). Этот тип необходимо использовать при построении узла [`Call`](https://python-all.ru/3.13/library/ast.html#ast.Call) с помощью `*args`.479480```pycon481>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))482Module(483    body=[484        Assign(485            targets=[486                Tuple(487                    elts=[488                        Name(id='a', ctx=Store()),489                        Starred(490                            value=Name(id='b', ctx=Store()),491                            ctx=Store())],492                    ctx=Store())],493            value=Name(id='it', ctx=Load()))])494```495496### Выражения497498#### `class ast.Expr(value)`499500Когда выражение, например вызов функции, выступает в роли самостоятельного оператора и его возвращаемое значение не используется и не сохраняется, оно помещается в этот контейнер. `value` содержит один из остальных узлов этого раздела: узел [`Constant`](https://python-all.ru/3.13/library/ast.html#ast.Constant), узел [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), [`Lambda`](https://python-all.ru/3.13/library/ast.html#ast.Lambda), [`Yield`](https://python-all.ru/3.13/library/ast.html#ast.Yield) или [`YieldFrom`](https://python-all.ru/3.13/library/ast.html#ast.YieldFrom).501502```pycon503>>> print(ast.dump(ast.parse('-a'), indent=4))504Module(505    body=[506        Expr(507            value=UnaryOp(508                op=USub(),509                operand=Name(id='a', ctx=Load())))])510```511512#### `class ast.UnaryOp(op, operand)`513514Унарная операция. `op` – оператор, а `operand` – любой узел выражения.515516#### `class ast.UAdd`517518#### `class ast.USub`519520#### `class ast.Not`521522#### `class ast.Invert`523524Токены унарных операторов. `Not` – ключевое слово `not`, `Invert` – оператор `~`.525526```pycon527>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))528Expression(529    body=UnaryOp(530        op=Not(),531        operand=Name(id='x', ctx=Load())))532```533534#### `class ast.BinOp(left, op, right)`535536Бинарная операция (например, сложение или деление). `op` – оператор, а `left` и `right` – любые узлы выражений.537538```pycon539>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))540Expression(541    body=BinOp(542        left=Name(id='x', ctx=Load()),543        op=Add(),544        right=Name(id='y', ctx=Load())))545```546547#### `class ast.Add`548549#### `class ast.Sub`550551#### `class ast.Mult`552553#### `class ast.Div`554555#### `class ast.FloorDiv`556557#### `class ast.Mod`558559#### `class ast.Pow`560561#### `class ast.LShift`562563#### `class ast.RShift`564565#### `class ast.BitOr`566567#### `class ast.BitXor`568569#### `class ast.BitAnd`570571#### `class ast.MatMult`572573Токены бинарных операторов.574575#### `class ast.BoolOp(op, values)`576577Логическая операция – 'or' или 'and'. `op` – это [`Or`](https://python-all.ru/3.13/library/ast.html#ast.Or) или [`And`](https://python-all.ru/3.13/library/ast.html#ast.And). `values` – участвующие значения. Последовательные операции с одним и тем же оператором, например `a or b or c`, сводятся в один узел с несколькими значениями.578579Это не включает `not`, который является [`UnaryOp`](https://python-all.ru/3.13/library/ast.html#ast.UnaryOp).580581```pycon582>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))583Expression(584    body=BoolOp(585        op=Or(),586        values=[587            Name(id='x', ctx=Load()),588            Name(id='y', ctx=Load())]))589```590591#### `class ast.And`592593#### `class ast.Or`594595Токены логических операторов.596597#### `class ast.Compare(left, ops, comparators)`598599Сравнение двух или более значений. `left` – первое значение в сравнении, `ops` – список операторов, а `comparators` – список значений после первого элемента сравнения.600601```pycon602>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))603Expression(604    body=Compare(605        left=Constant(value=1),606        ops=[607            LtE(),608            Lt()],609        comparators=[610            Name(id='a', ctx=Load()),611            Constant(value=10)]))612```613614#### `class ast.Eq`615616#### `class ast.NotEq`617618#### `class ast.Lt`619620#### `class ast.LtE`621622#### `class ast.Gt`623624#### `class ast.GtE`625626#### `class ast.Is`627628#### `class ast.IsNot`629630#### `class ast.In`631632#### `class ast.NotIn`633634Токены операторов сравнения.635636#### `class ast.Call(func, args, keywords)`637638Вызов функции. `func` – это функция; обычно это объект [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name) или [`Attribute`](https://python-all.ru/3.13/library/ast.html#ast.Attribute). Об аргументах:639640- `args` содержит список аргументов, переданных по позиции.641- `keywords` содержит список объектов [`keyword`](https://python-all.ru/3.13/library/ast.html#ast.keyword), представляющих аргументы, переданные по ключевому слову.642643Аргументы `args` и `keywords` необязательны и по умолчанию равны пустым спискам.644645```pycon646>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))647Expression(648    body=Call(649        func=Name(id='func', ctx=Load()),650        args=[651            Name(id='a', ctx=Load()),652            Starred(653                value=Name(id='d', ctx=Load()),654                ctx=Load())],655        keywords=[656            keyword(657                arg='b',658                value=Name(id='c', ctx=Load())),659            keyword(660                value=Name(id='e', ctx=Load()))]))661```662663#### `class ast.keyword(arg, value)`664665Именованный аргумент вызова функции или определения класса. `arg` – это необработанная строка с именем параметра, `value` – узел, который нужно передать.666667#### `class ast.IfExp(test, body, orelse)`668669Выражение, например `a if b else c`. Каждое поле содержит один узел, поэтому в следующем примере все три являются узлами [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name).670671```pycon672>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))673Expression(674    body=IfExp(675        test=Name(id='b', ctx=Load()),676        body=Name(id='a', ctx=Load()),677        orelse=Name(id='c', ctx=Load())))678```679680#### `class ast.Attribute(value, attr, ctx)`681682Доступ к атрибуту, например `d.keys`. `value` – это узел, обычно [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name). `attr` – это строка с именем атрибута, а `ctx` – [`Load`](https://python-all.ru/3.13/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.13/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.13/library/ast.html#ast.Del) в зависимости от того, как используется атрибут.683684```pycon685>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))686Expression(687    body=Attribute(688        value=Name(id='snake', ctx=Load()),689        attr='colour',690        ctx=Load()))691```692693#### `class ast.NamedExpr(target, value)`694695Именованное выражение. Этот узел AST создаётся оператором присваивания (также известным как оператор «морж»). В отличие от узла [`Assign`](https://python-all.ru/3.13/library/ast.html#ast.Assign), где первый аргумент может быть несколькими узлами, в данном случае и `target`, и `value` должны быть одиночными узлами.696697```pycon698>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))699Expression(700    body=NamedExpr(701        target=Name(id='x', ctx=Store()),702        value=Constant(value=4)))703```704705Добавлено в версии 3.8.706707#### Индексирование708709#### `class ast.Subscript(value, slice, ctx)`710711Индексация, такая как `l[1]`. `value` – индексируемый объект (обычно последовательность или отображение). `slice` – это индекс, срез или ключ. Оно может быть [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple) и содержать [`Slice`](https://python-all.ru/3.13/library/ast.html#ast.Slice). `ctx` является [`Load`](https://python-all.ru/3.13/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.13/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.13/library/ast.html#ast.Del) в зависимости от выполняемого действия при индексации.712713```pycon714>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))715Expression(716    body=Subscript(717        value=Name(id='l', ctx=Load()),718        slice=Tuple(719            elts=[720                Slice(721                    lower=Constant(value=1),722                    upper=Constant(value=2)),723                Constant(value=3)],724            ctx=Load()),725        ctx=Load()))726```727728#### `class ast.Slice(lower, upper, step)`729730Обычный срез (в виде `lower:upper` или `lower:upper:step`). Может встречаться только внутри поля *slice* узла [`Subscript`](https://python-all.ru/3.13/library/ast.html#ast.Subscript), либо напрямую, либо как элемент [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple).731732```pycon733>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))734Expression(735    body=Subscript(736        value=Name(id='l', ctx=Load()),737        slice=Slice(738            lower=Constant(value=1),739            upper=Constant(value=2)),740        ctx=Load()))741```742743#### Генераторы коллекций744745#### `class ast.ListComp(elt, generators)`746747#### `class ast.SetComp(elt, generators)`748749#### `class ast.GeneratorExp(elt, generators)`750751#### `class ast.DictComp(key, value, generators)`752753Генераторы списков и множеств, генераторные выражения и генераторы словарей. `elt` (или `key` и `value`) – это один узел, представляющий часть, которая будет вычисляться для каждого элемента.754755`generators` – это список узлов [`comprehension`](https://python-all.ru/3.13/library/ast.html#ast.comprehension).756757```pycon758>>> print(ast.dump(759...     ast.parse('[x for x in numbers]', mode='eval'),760...     indent=4,761... ))762Expression(763    body=ListComp(764        elt=Name(id='x', ctx=Load()),765        generators=[766            comprehension(767                target=Name(id='x', ctx=Store()),768                iter=Name(id='numbers', ctx=Load()),769                is_async=0)]))770>>> print(ast.dump(771...     ast.parse('{x: x**2 for x in numbers}', mode='eval'),772...     indent=4,773... ))774Expression(775    body=DictComp(776        key=Name(id='x', ctx=Load()),777        value=BinOp(778            left=Name(id='x', ctx=Load()),779            op=Pow(),780            right=Constant(value=2)),781        generators=[782            comprehension(783                target=Name(id='x', ctx=Store()),784                iter=Name(id='numbers', ctx=Load()),785                is_async=0)]))786>>> print(ast.dump(787...     ast.parse('{x for x in numbers}', mode='eval'),788...     indent=4,789... ))790Expression(791    body=SetComp(792        elt=Name(id='x', ctx=Load()),793        generators=[794            comprehension(795                target=Name(id='x', ctx=Store()),796                iter=Name(id='numbers', ctx=Load()),797                is_async=0)]))798```799800#### `class ast.comprehension(target, iter, ifs, is_async)`801802Одно предложение `for` в генераторе коллекции. `target` – это ссылка, используемая для каждого элемента (обычно узел [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name) или [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple)). `iter` – объект, по которому выполняется итерация. `ifs` – список проверочных выражений: каждое предложение `for` может содержать несколько `ifs`.803804`is_async` указывает, что генератор коллекции является асинхронным (использует `async for` вместо `for`). Значение – целое число (0 или 1).805806```pycon807>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),808...                indent=4)) # несколько включений в одном809Expression(810    body=ListComp(811        elt=Call(812            func=Name(id='ord', ctx=Load()),813            args=[814                Name(id='c', ctx=Load())]),815        generators=[816            comprehension(817                target=Name(id='line', ctx=Store()),818                iter=Name(id='file', ctx=Load()),819                is_async=0),820            comprehension(821                target=Name(id='c', ctx=Store()),822                iter=Name(id='line', ctx=Load()),823                is_async=0)]))824825>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),826...                indent=4)) # выражение-генератор827Expression(828    body=GeneratorExp(829        elt=BinOp(830            left=Name(id='n', ctx=Load()),831            op=Pow(),832            right=Constant(value=2)),833        generators=[834            comprehension(835                target=Name(id='n', ctx=Store()),836                iter=Name(id='it', ctx=Load()),837                ifs=[838                    Compare(839                        left=Name(id='n', ctx=Load()),840                        ops=[841                            Gt()],842                        comparators=[843                            Constant(value=5)]),844                    Compare(845                        left=Name(id='n', ctx=Load()),846                        ops=[847                            Lt()],848                        comparators=[849                            Constant(value=10)])],850                is_async=0)]))851852>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),853...                indent=4)) # асинхронное включение854Expression(855    body=ListComp(856        elt=Name(id='i', ctx=Load()),857        generators=[858            comprehension(859                target=Name(id='i', ctx=Store()),860                iter=Name(id='soc', ctx=Load()),861                is_async=1)]))862```863864### Инструкции865866#### `class ast.Assign(targets, value, type_comment)`867868Присваивание. `targets` – список узлов, а `value` – один узел.869870Несколько узлов в `targets` обозначают присваивание одного и того же значения каждому. Распаковка представляется помещением узла [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.13/library/ast.html#ast.List) внутрь `targets`.871872#### `type_comment`873874`type_comment` – это необязательная строка с аннотацией типа в виде комментария.875876```pycon877>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # множественное присваивание878Module(879    body=[880        Assign(881            targets=[882                Name(id='a', ctx=Store()),883                Name(id='b', ctx=Store())],884            value=Constant(value=1))])885886>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # распаковка887Module(888    body=[889        Assign(890            targets=[891                Tuple(892                    elts=[893                        Name(id='a', ctx=Store()),894                        Name(id='b', ctx=Store())],895                    ctx=Store())],896            value=Name(id='c', ctx=Load()))])897```898899#### `class ast.AnnAssign(target, annotation, value, simple)`900901Присваивание с аннотацией типа. `target` – это один узел, который может быть [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.13/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.13/library/ast.html#ast.Subscript). `annotation` – аннотация, например узел [`Constant`](https://python-all.ru/3.13/library/ast.html#ast.Constant) или `Name`. `value` – один необязательный узел.902903`simple` всегда равен либо 0 (обозначает «сложную» цель), либо 1 (обозначает «простую» цель). «Простая» цель состоит только из узла [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), который не находится в круглых скобках; все остальные цели считаются сложными. Только простые цели появляются в словаре `__annotations__` модулей и классов.904905```pycon906>>> print(ast.dump(ast.parse('c: int'), indent=4))907Module(908    body=[909        AnnAssign(910            target=Name(id='c', ctx=Store()),911            annotation=Name(id='int', ctx=Load()),912            simple=1)])913914>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # аннотация со скобками915Module(916    body=[917        AnnAssign(918            target=Name(id='a', ctx=Store()),919            annotation=Name(id='int', ctx=Load()),920            value=Constant(value=1),921            simple=0)])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)])933934>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # аннотация подписки935Module(936    body=[937        AnnAssign(938            target=Subscript(939                value=Name(id='a', ctx=Load()),940                slice=Constant(value=1),941                ctx=Store()),942            annotation=Name(id='int', ctx=Load()),943            simple=0)])944```945946#### `class ast.AugAssign(target, op, value)`947948Расширенное присваивание, например `a += 1`. В следующем примере `target` – это узел [Имя](https://python-all.ru/3.13/library/ast.html#ast.Name) для `x` (с контекстом [`Store`](https://python-all.ru/3.13/library/ast.html#ast.Store)), `op` – это [Сложение](https://python-all.ru/3.13/library/ast.html#ast.Add), а `value` – это [Константа](https://python-all.ru/3.13/library/ast.html#ast.Constant) со значением 1.949950Атрибут `target` не может быть класса [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.13/library/ast.html#ast.List), в отличие от целей [`Assign`](https://python-all.ru/3.13/library/ast.html#ast.Assign).951952```pycon953>>> print(ast.dump(ast.parse('x += 2'), indent=4))954Module(955    body=[956        AugAssign(957            target=Name(id='x', ctx=Store()),958            op=Add(),959            value=Constant(value=2))])960```961962#### `class ast.Raise(exc, cause)`963964Инструкция `raise`. `exc` – объект исключения, который необходимо возбудить, обычно [Вызов](https://python-all.ru/3.13/library/ast.html#ast.Call) или [Имя](https://python-all.ru/3.13/library/ast.html#ast.Name), или `None` для отдельного `raise`. `cause` – необязательная часть для `y` в `Возбуждение`.965966```pycon967>>> print(ast.dump(ast.parse('raise x from y'), indent=4))968Module(969    body=[970        Raise(971            exc=Name(id='x', ctx=Load()),972            cause=Name(id='y', ctx=Load()))])973```974975#### `class ast.Assert(test, msg)`976977Утверждение. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.13/library/ast.html#ast.Compare). `msg` содержит сообщение об ошибке.978979```pycon980>>> print(ast.dump(ast.parse('assert x,y'), indent=4))981Module(982    body=[983        Assert(984            test=Name(id='x', ctx=Load()),985            msg=Name(id='y', ctx=Load()))])986```987988#### `class ast.Delete(targets)`989990Представляет инструкцию `del`. `targets` – список узлов, например узлов [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.13/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.13/library/ast.html#ast.Subscript).991992```pycon993>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))994Module(995    body=[996        Delete(997            targets=[998                Name(id='x', ctx=Del()),999                Name(id='y', ctx=Del()),1000                Name(id='z', ctx=Del())])])1001```10021003#### `class ast.Pass`10041005Инструкция `pass`.10061007```pycon1008>>> print(ast.dump(ast.parse('pass'), indent=4))1009Module(1010    body=[1011        Pass()])1012```10131014#### `class ast.TypeAlias(name, type_params, value)`10151016[Псевдоним типа](https://python-all.ru/3.13/library/typing.html#type-aliases), созданный с помощью инструкции [`type`](https://python-all.ru/3.13/reference/simple_stmts.html#type) . `name` – имя псевдонима, `type_params` – список [параметров типа](https://python-all.ru/3.13/library/ast.html#ast-type-params), а `value` – значение псевдонима типа.10171018```pycon1019>>> print(ast.dump(ast.parse('type Alias = int'), indent=4))1020Module(1021    body=[1022        TypeAlias(1023            name=Name(id='Alias', ctx=Store()),1024            value=Name(id='int', ctx=Load()))])1025```10261027Добавлено в версии 3.12.10281029Другие инструкции, которые применимы только внутри функций или циклов, описаны в других разделах.10301031#### Импорты10321033#### `class ast.Import(names)`10341035Инструкция импорта. `names` – это список узлов [`alias`](https://python-all.ru/3.13/library/ast.html#ast.alias).10361037```pycon1038>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))1039Module(1040    body=[1041        Import(1042            names=[1043                alias(name='x'),1044                alias(name='y'),1045                alias(name='z')])])1046```10471048#### `class ast.ImportFrom(module, names, level)`10491050Представляет `from x import y`. `module` – это необработанная строка имени from, без начальных точек, или `None` для инструкций вроде `from . import foo`. `level` – целое число, указывающее уровень относительного импорта (0 означает абсолютный импорт).10511052```pycon1053>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))1054Module(1055    body=[1056        ImportFrom(1057            module='y',1058            names=[1059                alias(name='x'),1060                alias(name='y'),1061                alias(name='z')],1062            level=0)])1063```10641065#### `class ast.alias(name, asname)`10661067Оба параметра – необработанные строки имён. `asname` может быть `None`, если должно использоваться обычное имя.10681069```pycon1070>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))1071Module(1072    body=[1073        ImportFrom(1074            module='foo.bar',1075            names=[1076                alias(name='a', asname='b'),1077                alias(name='c')],1078            level=2)])1079```10801081### Управление потоком10821083> **Примечание**1084>1085> Необязательные предложения, такие как `else`, сохраняются как пустой список, если они отсутствуют.10861087#### `class ast.If(test, body, orelse)`10881089Инструкция `if`. `test` содержит один узел, например узел [`Compare`](https://python-all.ru/3.13/library/ast.html#ast.Compare). `body` и `orelse` содержат по списку узлов.10901091Предложения `elif` не имеют специального представления в AST, а появляются как дополнительные узлы `If` в разделе `orelse` предыдущего.10921093```pycon1094>>> print(ast.dump(ast.parse("""1095... if x:1096...    ...1097... elif y:1098...    ...1099... else:1100...    ...1101... """), indent=4))1102Module(1103    body=[1104        If(1105            test=Name(id='x', ctx=Load()),1106            body=[1107                Expr(1108                    value=Constant(value=Ellipsis))],1109            orelse=[1110                If(1111                    test=Name(id='y', ctx=Load()),1112                    body=[1113                        Expr(1114                            value=Constant(value=Ellipsis))],1115                    orelse=[1116                        Expr(1117                            value=Constant(value=Ellipsis))])])])1118```11191120#### `class ast.For(target, iter, body, orelse, type_comment)`11211122Цикл `for`. `target` содержит переменную (или переменные), которой присваивает цикл, в виде одного узла [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple), [`List`](https://python-all.ru/3.13/library/ast.html#ast.List), [`Attribute`](https://python-all.ru/3.13/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.13/library/ast.html#ast.Subscript). `iter` содержит элемент, по которому выполняется итерация, также в виде одного узла. `body` и `orelse` содержат списки узлов для выполнения. Те, что в `orelse`, выполняются, если цикл завершается нормально, а не по инструкции `break`.11231124#### `type_comment`11251126`type_comment` – это необязательная строка с аннотацией типа в виде комментария.11271128```pycon1129>>> print(ast.dump(ast.parse("""1130... for x in y:1131...     ...1132... else:1133...     ...1134... """), indent=4))1135Module(1136    body=[1137        For(1138            target=Name(id='x', ctx=Store()),1139            iter=Name(id='y', ctx=Load()),1140            body=[1141                Expr(1142                    value=Constant(value=Ellipsis))],1143            orelse=[1144                Expr(1145                    value=Constant(value=Ellipsis))])])1146```11471148#### `class ast.While(test, body, orelse)`11491150Цикл `while`. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.13/library/ast.html#ast.Compare).11511152```pycon1153>>> print(ast.dump(ast.parse("""1154... while x:1155...    ...1156... else:1157...    ...1158... """), indent=4))1159Module(1160    body=[1161        While(1162            test=Name(id='x', ctx=Load()),1163            body=[1164                Expr(1165                    value=Constant(value=Ellipsis))],1166            orelse=[1167                Expr(1168                    value=Constant(value=Ellipsis))])])1169```11701171#### `class ast.Break`11721173#### `class ast.Continue`11741175Инструкции `break` и `continue`.11761177```pycon1178>>> print(ast.dump(ast.parse("""\1179... for a in b:1180...     if a > 5:1181...         break1182...     else:1183...         continue1184...1185... """), indent=4))1186Module(1187    body=[1188        For(1189            target=Name(id='a', ctx=Store()),1190            iter=Name(id='b', ctx=Load()),1191            body=[1192                If(1193                    test=Compare(1194                        left=Name(id='a', ctx=Load()),1195                        ops=[1196                            Gt()],1197                        comparators=[1198                            Constant(value=5)]),1199                    body=[1200                        Break()],1201                    orelse=[1202                        Continue()])])])1203```12041205#### `class ast.Try(body, handlers, orelse, finalbody)`12061207Блоки `try`. Все атрибуты – списки узлов для выполнения, за исключением `handlers`, который является списком узлов [`ExceptHandler`](https://python-all.ru/3.13/library/ast.html#ast.ExceptHandler).12081209```pycon1210>>> print(ast.dump(ast.parse("""1211... try:1212...    ...1213... except Exception:1214...    ...1215... except OtherException as e:1216...    ...1217... else:1218...    ...1219... finally:1220...    ...1221... """), indent=4))1222Module(1223    body=[1224        Try(1225            body=[1226                Expr(1227                    value=Constant(value=Ellipsis))],1228            handlers=[1229                ExceptHandler(1230                    type=Name(id='Exception', ctx=Load()),1231                    body=[1232                        Expr(1233                            value=Constant(value=Ellipsis))]),1234                ExceptHandler(1235                    type=Name(id='OtherException', ctx=Load()),1236                    name='e',1237                    body=[1238                        Expr(1239                            value=Constant(value=Ellipsis))])],1240            orelse=[1241                Expr(1242                    value=Constant(value=Ellipsis))],1243            finalbody=[1244                Expr(1245                    value=Constant(value=Ellipsis))])])1246```12471248#### `class ast.TryStar(body, handlers, orelse, finalbody)`12491250Блоки `try`, за которыми следуют предложения `except*`. Атрибуты такие же, как для [`Try`](https://python-all.ru/3.13/library/ast.html#ast.Try), но узлы [`ExceptHandler`](https://python-all.ru/3.13/library/ast.html#ast.ExceptHandler) в `handlers` интерпретируются как блоки `except*`, а не `except`.12511252```pycon1253>>> print(ast.dump(ast.parse("""1254... try:1255...    ...1256... except* Exception:1257...    ...1258... """), indent=4))1259Module(1260    body=[1261        TryStar(1262            body=[1263                Expr(1264                    value=Constant(value=Ellipsis))],1265            handlers=[1266                ExceptHandler(1267                    type=Name(id='Exception', ctx=Load()),1268                    body=[1269                        Expr(1270                            value=Constant(value=Ellipsis))])])])1271```12721273Добавлено в версии 3.12.12741275#### `class ast.ExceptHandler(type, name, body)`12761277Одно предложение `except`. `type` – тип исключения, который оно перехватывает, обычно узел [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name) (или `None` для универсального предложения `except:`). `name` – необработанная строка для имени, в котором будет сохранено исключение, или `None`, если в предложении нет `as foo`. `body` – список узлов.12781279```pycon1280>>> print(ast.dump(ast.parse("""\1281... try:1282...     a + 11283... except TypeError:1284...     pass1285... """), indent=4))1286Module(1287    body=[1288        Try(1289            body=[1290                Expr(1291                    value=BinOp(1292                        left=Name(id='a', ctx=Load()),1293                        op=Add(),1294                        right=Constant(value=1)))],1295            handlers=[1296                ExceptHandler(1297                    type=Name(id='TypeError', ctx=Load()),1298                    body=[1299                        Pass()])])])1300```13011302#### `class ast.With(items, body, type_comment)`13031304Блок `with`. `items` – это список узлов [`withitem`](https://python-all.ru/3.13/library/ast.html#ast.withitem), представляющих менеджеры контекста, а `body` – это блок с отступом внутри контекста.13051306#### `type_comment`13071308`type_comment` – это необязательная строка с аннотацией типа в виде комментария.13091310#### `class ast.withitem(context_expr, optional_vars)`13111312Один менеджер контекста в блоке `with`. `context_expr` – это менеджер контекста, часто узел [`Call`](https://python-all.ru/3.13/library/ast.html#ast.Call). `optional_vars` – это [`Name`](https://python-all.ru/3.13/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.13/library/ast.html#ast.List) для части `as foo`, или `None`, если она не используется.13131314```pycon1315>>> print(ast.dump(ast.parse("""\1316... with a as b, c as d:1317...    something(b, d)1318... """), indent=4))1319Module(1320    body=[1321        With(1322            items=[1323                withitem(1324                    context_expr=Name(id='a', ctx=Load()),1325                    optional_vars=Name(id='b', ctx=Store())),1326                withitem(1327                    context_expr=Name(id='c', ctx=Load()),1328                    optional_vars=Name(id='d', ctx=Store()))],1329            body=[1330                Expr(1331                    value=Call(1332                        func=Name(id='something', ctx=Load()),1333                        args=[1334                            Name(id='b', ctx=Load()),1335                            Name(id='d', ctx=Load())]))])])1336```13371338### Сопоставление с образцом13391340#### `class ast.Match(subject, cases)`13411342Оператор `match`. В `subject` хранится subject сопоставления (объект, который сравнивается с вариантами), а `cases` содержит итерируемый набор узлов [`match_case`](https://python-all.ru/3.13/library/ast.html#ast.match_case) с различными вариантами.13431344Добавлено в версии 3.10.13451346#### `class ast.match_case(pattern, guard, body)`13471348Один вариант (case) в операторе `match`. `pattern` содержит шаблон сопоставления, с которым будет сравниваться subject. Обратите внимание, что узлы [`AST`](https://python-all.ru/3.13/library/ast.html#ast.AST), создаваемые для шаблонов, отличаются от узлов, создаваемых для выражений, даже при одинаковом синтаксисе.13491350Атрибут `guard` содержит выражение, которое будет вычислено, если шаблон совпадает с subject.13511352`body` содержит список узлов, которые выполняются, если шаблон совпадает и результат вычисления guard-выражения истинен.13531354```pycon1355>>> print(ast.dump(ast.parse("""1356... match x:1357...     case [x] if x>0:1358...         ...1359...     case tuple():1360...         ...1361... """), indent=4))1362Module(1363    body=[1364        Match(1365            subject=Name(id='x', ctx=Load()),1366            cases=[1367                match_case(1368                    pattern=MatchSequence(1369                        patterns=[1370                            MatchAs(name='x')]),1371                    guard=Compare(1372                        left=Name(id='x', ctx=Load()),1373                        ops=[1374                            Gt()],1375                        comparators=[1376                            Constant(value=0)]),1377                    body=[1378                        Expr(1379                            value=Constant(value=Ellipsis))]),1380                match_case(1381                    pattern=MatchClass(1382                        cls=Name(id='tuple', ctx=Load())),1383                    body=[1384                        Expr(1385                            value=Constant(value=Ellipsis))])])])1386```13871388Добавлено в версии 3.10.13891390#### `class ast.MatchValue(value)`13911392Сопоставление с литералом или шаблоном значения, сравниваемым по равенству. `value` – это узел выражения. Допустимые узлы значений ограничены, как описано в документации оператора match. Этот шаблон успешно срабатывает, если subject сопоставления равен вычисленному значению.13931394```pycon1395>>> print(ast.dump(ast.parse("""1396... match x:1397...     case "Relevant":1398...         ...1399... """), indent=4))1400Module(1401    body=[1402        Match(1403            subject=Name(id='x', ctx=Load()),1404            cases=[1405                match_case(1406                    pattern=MatchValue(1407                        value=Constant(value='Relevant')),1408                    body=[1409                        Expr(1410                            value=Constant(value=Ellipsis))])])])1411```14121413Добавлено в версии 3.10.14141415#### `class ast.MatchSingleton(value)`14161417Сопоставление с литералом, сравниваемым по идентичности. `value` – это синглтон, с которым производится сравнение: `None`, `True` или `False`. Этот шаблон успешно срабатывает, если subject сопоставления является заданной константой.14181419```pycon1420>>> print(ast.dump(ast.parse("""1421... match x:1422...     case None:1423...         ...1424... """), indent=4))1425Module(1426    body=[1427        Match(1428            subject=Name(id='x', ctx=Load()),1429            cases=[1430                match_case(1431                    pattern=MatchSingleton(value=None),1432                    body=[1433                        Expr(1434                            value=Constant(value=Ellipsis))])])])1435```14361437Добавлено в версии 3.10.14381439#### `class ast.MatchSequence(patterns)`14401441Шаблон последовательности (sequence pattern) в match. `patterns` содержит шаблоны, которые будут сопоставляться с элементами subject, если subject является последовательностью. Сопоставляется с последовательностью переменной длины, если один из подшаблонов является узлом `MatchStar`, в противном случае сопоставляется с последовательностью фиксированной длины.14421443```pycon1444>>> print(ast.dump(ast.parse("""1445... match x:1446...     case [1, 2]:1447...         ...1448... """), indent=4))1449Module(1450    body=[1451        Match(1452            subject=Name(id='x', ctx=Load()),1453            cases=[1454                match_case(1455                    pattern=MatchSequence(1456                        patterns=[1457                            MatchValue(1458                                value=Constant(value=1)),1459                            MatchValue(1460                                value=Constant(value=2))]),1461                    body=[1462                        Expr(1463                            value=Constant(value=Ellipsis))])])])1464```14651466Добавлено в версии 3.10.14671468#### `class ast.MatchStar(name)`14691470Сопоставляется с остатком последовательности в шаблоне последовательности переменной длины. Если `name` не равно `None`, то при успешном сопоставлении всего шаблона последовательности этому имени привязывается список, содержащий оставшиеся элементы последовательности.14711472```pycon1473>>> print(ast.dump(ast.parse("""1474... match x:1475...     case [1, 2, *rest]:1476...         ...1477...     case [*_]:1478...         ...1479... """), indent=4))1480Module(1481    body=[1482        Match(1483            subject=Name(id='x', ctx=Load()),1484            cases=[1485                match_case(1486                    pattern=MatchSequence(1487                        patterns=[1488                            MatchValue(1489                                value=Constant(value=1)),1490                            MatchValue(1491                                value=Constant(value=2)),1492                            MatchStar(name='rest')]),1493                    body=[1494                        Expr(1495                            value=Constant(value=Ellipsis))]),1496                match_case(1497                    pattern=MatchSequence(1498                        patterns=[1499                            MatchStar()]),1500                    body=[1501                        Expr(1502                            value=Constant(value=Ellipsis))])])])1503```15041505Добавлено в версии 3.10.15061507#### `class ast.MatchMapping(keys, patterns, rest)`15081509Шаблон отображения (mapping pattern) в match. `keys` – последовательность узлов выражений. `patterns` – соответствующая последовательность узлов шаблонов. `rest` – необязательное имя, которое можно указать для захвата оставшихся элементов отображения. Допустимые ключевые выражения ограничены, как описано в документации оператора match.15101511Этот шаблон успешно срабатывает, если subject является отображением, все вычисленные ключевые выражения присутствуют в отображении, а значение, соответствующее каждому ключу, совпадает с соответствующим подшаблоном. Если `rest` не равно `None`, то при успешном сопоставлении всего шаблона отображения этому имени привязывается словарь, содержащий оставшиеся элементы отображения.15121513```pycon1514>>> print(ast.dump(ast.parse("""1515... match x:1516...     case {1: _, 2: _}:1517...         ...1518...     case {**rest}:1519...         ...1520... """), indent=4))1521Module(1522    body=[1523        Match(1524            subject=Name(id='x', ctx=Load()),1525            cases=[1526                match_case(1527                    pattern=MatchMapping(1528                        keys=[1529                            Constant(value=1),1530                            Constant(value=2)],1531                        patterns=[1532                            MatchAs(),1533                            MatchAs()]),1534                    body=[1535                        Expr(1536                            value=Constant(value=Ellipsis))]),1537                match_case(1538                    pattern=MatchMapping(rest='rest'),1539                    body=[1540                        Expr(1541                            value=Constant(value=Ellipsis))])])])1542```15431544Добавлено в версии 3.10.15451546#### `class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)`15471548Шаблон класса (class pattern) в match. `cls` – выражение, задающее номинальный класс для сопоставления. `patterns` – последовательность узлов шаблонов, которые будут сопоставляться с определённой классом последовательностью атрибутов для сопоставления с образцом. `kwd_attrs` – последовательность дополнительных атрибутов для сопоставления (указанных как ключевые аргументы в шаблоне класса), `kwd_patterns` – соответствующие шаблоны (указанные как значения ключевых слов в шаблоне класса).15491550Этот шаблон успешно срабатывает, если subject является экземпляром указанного класса, все позиционные шаблоны совпадают с соответствующими атрибутами, определёнными классом, и все указанные ключевые атрибуты совпадают со своими шаблонами.15511552Примечание: классы могут определять свойство, возвращающее self, чтобы сопоставлять узел шаблона с сопоставляемым экземпляром. Некоторые встроенные типы также сопоставляются таким образом, как описано в документации оператора match.15531554```pycon1555>>> print(ast.dump(ast.parse("""1556... match x:1557...     case Point2D(0, 0):1558...         ...1559...     case Point3D(x=0, y=0, z=0):1560...         ...1561... """), indent=4))1562Module(1563    body=[1564        Match(1565            subject=Name(id='x', ctx=Load()),1566            cases=[1567                match_case(1568                    pattern=MatchClass(1569                        cls=Name(id='Point2D', ctx=Load()),1570                        patterns=[1571                            MatchValue(1572                                value=Constant(value=0)),1573                            MatchValue(1574                                value=Constant(value=0))]),1575                    body=[1576                        Expr(1577                            value=Constant(value=Ellipsis))]),1578                match_case(1579                    pattern=MatchClass(1580                        cls=Name(id='Point3D', ctx=Load()),1581                        kwd_attrs=[1582                            'x',1583                            'y',1584                            'z'],1585                        kwd_patterns=[1586                            MatchValue(1587                                value=Constant(value=0)),1588                            MatchValue(1589                                value=Constant(value=0)),1590                            MatchValue(1591                                value=Constant(value=0))]),1592                    body=[1593                        Expr(1594                            value=Constant(value=Ellipsis))])])])1595```15961597Добавлено в версии 3.10.15981599#### `class ast.MatchAs(pattern, name)`16001601Сопоставление «as-pattern», шаблон захвата (capture pattern) или шаблон-заменитель (wildcard pattern). `pattern` содержит шаблон match, с которым будет сопоставлен subject. Если шаблон равен `None`, узел представляет собой шаблон захвата (т.е. просто имя) и всегда успешно срабатывает.16021603Атрибут `name` содержит имя, которое будет привязано при успешном сопоставлении шаблона. Если `name` равно `None`, то `pattern` также должно быть `None`, и узел представляет собой шаблон-заменитель (wildcard).16041605```pycon1606>>> print(ast.dump(ast.parse("""1607... match x:1608...     case [x] as y:1609...         ...1610...     case _:1611...         ...1612... """), indent=4))1613Module(1614    body=[1615        Match(1616            subject=Name(id='x', ctx=Load()),1617            cases=[1618                match_case(1619                    pattern=MatchAs(1620                        pattern=MatchSequence(1621                            patterns=[1622                                MatchAs(name='x')]),1623                        name='y'),1624                    body=[1625                        Expr(1626                            value=Constant(value=Ellipsis))]),1627                match_case(1628                    pattern=MatchAs(),1629                    body=[1630                        Expr(1631                            value=Constant(value=Ellipsis))])])])1632```16331634Добавлено в версии 3.10.16351636#### `class ast.MatchOr(patterns)`16371638Сопоставление «or-pattern» (шаблон ИЛИ). Or-pattern последовательно сопоставляет каждый из своих подшаблонов с subject, пока один из них не сработает. Тогда считается, что or-pattern сработал. Если ни один из подшаблонов не сработал, or-pattern не срабатывает. Атрибут `patterns` содержит список узлов шаблонов match, которые будут сопоставляться с subject.16391640```pycon1641>>> print(ast.dump(ast.parse("""1642... match x:1643...     case [x] | (y):1644...         ...1645... """), indent=4))1646Module(1647    body=[1648        Match(1649            subject=Name(id='x', ctx=Load()),1650            cases=[1651                match_case(1652                    pattern=MatchOr(1653                        patterns=[1654                            MatchSequence(1655                                patterns=[1656                                    MatchAs(name='x')]),1657                            MatchAs(name='y')]),1658                    body=[1659                        Expr(1660                            value=Constant(value=Ellipsis))])])])1661```16621663Добавлено в версии 3.10.16641665### Аннотации типов16661667#### `class ast.TypeIgnore(lineno, tag)`16681669Комментарий `# type: ignore`, расположенный на строке *lineno*. *tag* – опциональный тег, задаваемый формой `# type: ignore <tag>`.16701671```pycon1672>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))1673Module(1674    body=[1675        Assign(1676            targets=[1677                Name(id='x', ctx=Store())],1678            value=Constant(value=1))],1679    type_ignores=[1680        TypeIgnore(lineno=1, tag='')])1681>>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))1682Module(1683    body=[1684        AnnAssign(1685            target=Name(id='x', ctx=Store()),1686            annotation=Name(id='bool', ctx=Load()),1687            value=Constant(value=1),1688            simple=1)],1689    type_ignores=[1690        TypeIgnore(lineno=1, tag='[assignment]')])1691```16921693> **Примечание**1694>1695> Узлы `TypeIgnore` не создаются, когда параметр *type\_comments* установлен в `False` (по умолчанию). Подробнее см. [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse).16961697Добавлено в версии 3.8.16981699### Параметры типа17001701[Параметры типа](https://python-all.ru/3.13/reference/compound_stmts.html#type-params) могут существовать у классов, функций и псевдонимов типов.17021703#### `class ast.TypeVar(name, bound, default_value)`17041705[`typing.TypeVar`](https://python-all.ru/3.13/library/typing.html#typing.TypeVar). `name` – это имя переменной типа. `bound` – это граница или ограничения, если они есть. Если `bound` представляет собой [`Tuple`](https://python-all.ru/3.13/library/ast.html#ast.Tuple), то это ограничения; иначе – граница. `default_value` – значение по умолчанию; если `TypeVar` не имеет значения по умолчанию, то этот атрибут равен `None`.17061707```pycon1708>>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4))1709Module(1710    body=[1711        TypeAlias(1712            name=Name(id='Alias', ctx=Store()),1713            type_params=[1714                TypeVar(1715                    name='T',1716                    bound=Name(id='int', ctx=Load()),1717                    default_value=Name(id='bool', ctx=Load()))],1718            value=Subscript(1719                value=Name(id='list', ctx=Load()),1720                slice=Name(id='T', ctx=Load()),1721                ctx=Load()))])1722```17231724Добавлено в версии 3.12.17251726Изменено в версии 3.13: Добавлен параметр *default\_value*.17271728#### `class ast.ParamSpec(name, default_value)`17291730[`typing.ParamSpec`](https://python-all.ru/3.13/library/typing.html#typing.ParamSpec). `name` – это имя спецификации параметра. `default_value` – значение по умолчанию; если `ParamSpec` не имеет значения по умолчанию, то этот атрибут устанавливается в `None`.17311732```pycon1733>>> print(ast.dump(ast.parse("type Alias[**P = [int, str]] = Callable[P, int]"), indent=4))1734Module(1735    body=[1736        TypeAlias(1737            name=Name(id='Alias', ctx=Store()),1738            type_params=[1739                ParamSpec(1740                    name='P',1741                    default_value=List(1742                        elts=[1743                            Name(id='int', ctx=Load()),1744                            Name(id='str', ctx=Load())],1745                        ctx=Load()))],1746            value=Subscript(1747                value=Name(id='Callable', ctx=Load()),1748                slice=Tuple(1749                    elts=[1750                        Name(id='P', ctx=Load()),1751                        Name(id='int', ctx=Load())],1752                    ctx=Load()),1753                ctx=Load()))])1754```17551756Добавлено в версии 3.12.17571758Изменено в версии 3.13: Добавлен параметр *default\_value*.17591760#### `class ast.TypeVarTuple(name, default_value)`17611762[`typing.TypeVarTuple`](https://python-all.ru/3.13/library/typing.html#typing.TypeVarTuple). `name` – это имя кортежа переменных типа. `default_value` – значение по умолчанию; если `TypeVarTuple` не имеет значения по умолчанию, то этот атрибут устанавливается в `None`.17631764```pycon1765>>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4))1766Module(1767    body=[1768        TypeAlias(1769            name=Name(id='Alias', ctx=Store()),1770            type_params=[1771                TypeVarTuple(1772                    name='Ts',1773                    default_value=Tuple(ctx=Load()))],1774            value=Subscript(1775                value=Name(id='tuple', ctx=Load()),1776                slice=Tuple(1777                    elts=[1778                        Starred(1779                            value=Name(id='Ts', ctx=Load()),1780                            ctx=Load())],1781                    ctx=Load()),1782                ctx=Load()))])1783```17841785Добавлено в версии 3.12.17861787Изменено в версии 3.13: Добавлен параметр *default\_value*.17881789### Определения функций и классов17901791#### `class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)`17921793Определение функции.17941795- `name` – это необработанная строка имени функции.1796- `args` – это узел [`arguments`](https://python-all.ru/3.13/library/ast.html#ast.arguments).1797- `body` – это список узлов внутри функции.1798- `decorator_list` – это список декораторов, которые будут применены; декораторы перечислены от самого внешнего к внутреннему (т.е. первый в списке применяется последним).1799- `returns` – это аннотация возвращаемого значения.1800- `type_params` – это список [параметров типа](https://python-all.ru/3.13/library/ast.html#ast-type-params).18011802#### `type_comment`18031804`type_comment` – это необязательная строка с аннотацией типа в виде комментария.18051806Изменено в версии 3.12: Добавлен `type_params`.18071808#### `class ast.Lambda(args, body)`18091810`lambda` – это минимальное определение функции, которое можно использовать внутри выражения. В отличие от [`FunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.FunctionDef), `body` содержит один узел.18111812```pycon1813>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))1814Module(1815    body=[1816        Expr(1817            value=Lambda(1818                args=arguments(1819                    args=[1820                        arg(arg='x'),1821                        arg(arg='y')]),1822                body=Constant(value=Ellipsis)))])1823```18241825#### `class ast.arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)`18261827Аргументы функции.18281829- `posonlyargs`, `args` и `kwonlyargs` – это списки узлов [`arg`](https://python-all.ru/3.13/library/ast.html#ast.arg).1830- `vararg` и `kwarg` – это одиночные узлы [`arg`](https://python-all.ru/3.13/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.13/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                args=[1855                    arg(1856                        arg='a',1857                        annotation=Constant(value='annotation')),1858                    arg(arg='b'),1859                    arg(arg='c')],1860                vararg=arg(arg='d'),1861                kwonlyargs=[1862                    arg(arg='e'),1863                    arg(arg='f')],1864                kw_defaults=[1865                    None,1866                    Constant(value=3)],1867                kwarg=arg(arg='g'),1868                defaults=[1869                    Constant(value=1),1870                    Constant(value=2)]),1871            body=[1872                Pass()],1873            decorator_list=[1874                Name(id='decorator1', ctx=Load()),1875                Name(id='decorator2', ctx=Load())],1876            returns=Constant(value='return annotation'))])1877```18781879#### `class ast.Return(value)`18801881Инструкция `return`.18821883```pycon1884>>> print(ast.dump(ast.parse('return 4'), indent=4))1885Module(1886    body=[1887        Return(1888            value=Constant(value=4))])1889```18901891#### `class ast.Yield(value)`18921893#### `class ast.YieldFrom(value)`18941895Выражение `yield` или `yield from`. Поскольку это выражения, они должны быть обёрнуты в узел [`Expr`](https://python-all.ru/3.13/library/ast.html#ast.Expr), если возвращаемое значение не используется.18961897```pycon1898>>> print(ast.dump(ast.parse('yield x'), indent=4))1899Module(1900    body=[1901        Expr(1902            value=Yield(1903                value=Name(id='x', ctx=Load())))])19041905>>> print(ast.dump(ast.parse('yield from x'), indent=4))1906Module(1907    body=[1908        Expr(1909            value=YieldFrom(1910                value=Name(id='x', ctx=Load())))])1911```19121913#### `class ast.Global(names)`19141915#### `class ast.Nonlocal(names)`19161917Инструкции `global` и `nonlocal`. `names` – это список сырых строк.19181919```pycon1920>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))1921Module(1922    body=[1923        Global(1924            names=[1925                'x',1926                'y',1927                'z'])])19281929>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))1930Module(1931    body=[1932        Nonlocal(1933            names=[1934                'x',1935                'y',1936                'z'])])1937```19381939#### `class ast.ClassDef(name, bases, keywords, body, decorator_list, type_params)`19401941Определение класса.19421943- `name` – это сырая строка с именем класса.1944- `bases` – это список узлов для явно указанных базовых классов.1945- `keywords` – это список узлов [`keyword`](https://python-all.ru/3.13/library/ast.html#ast.keyword), в первую очередь для ‘metaclass’. Остальные ключевые слова будут переданы метаклассу, в соответствии с [**PEP 3115**](https://python-all.ru/3.13/library/ast.html).1946- `body` – это список узлов, представляющих код внутри определения класса.1947- `decorator_list` – это список узлов, как и в [`FunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.FunctionDef).1948- `type_params` – это список [параметров типа](https://python-all.ru/3.13/library/ast.html#ast-type-params).19491950```pycon1951>>> print(ast.dump(ast.parse("""\1952... @decorator11953... @decorator21954... class Foo(base1, base2, metaclass=meta):1955...     pass1956... """), indent=4))1957Module(1958    body=[1959        ClassDef(1960            name='Foo',1961            bases=[1962                Name(id='base1', ctx=Load()),1963                Name(id='base2', ctx=Load())],1964            keywords=[1965                keyword(1966                    arg='metaclass',1967                    value=Name(id='meta', ctx=Load()))],1968            body=[1969                Pass()],1970            decorator_list=[1971                Name(id='decorator1', ctx=Load()),1972                Name(id='decorator2', ctx=Load())])])1973```19741975Изменено в версии 3.12: Добавлен `type_params`.19761977### async и await19781979#### `class ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)`19801981Определение функции `async def`. Имеет те же поля, что и [`FunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.FunctionDef).19821983Изменено в версии 3.12: Добавлен `type_params`.19841985#### `class ast.Await(value)`19861987Выражение `await`. `value` – это то, чего оно ожидает. Допустимо только в теле [`AsyncFunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.AsyncFunctionDef).19881989```pycon1990>>> print(ast.dump(ast.parse("""\1991... async def f():1992...     await other_func()1993... """), indent=4))1994Module(1995    body=[1996        AsyncFunctionDef(1997            name='f',1998            args=arguments(),1999            body=[2000                Expr(2001                    value=Await(2002                        value=Call(2003                            func=Name(id='other_func', ctx=Load()))))])])2004```20052006#### `class ast.AsyncFor(target, iter, body, orelse, type_comment)`20072008#### `class ast.AsyncWith(items, body, type_comment)`20092010`async for` циклы и `async with` менеджеры контекста. Они имеют те же поля, что [`For`](https://python-all.ru/3.13/library/ast.html#ast.For) и [`With`](https://python-all.ru/3.13/library/ast.html#ast.With), соответственно. Допустимы только в теле [`AsyncFunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.AsyncFunctionDef).20112012> **Примечание**2013>2014> Когда строка разбирается парсером [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse), узлы операторов (подклассы `ast.operator`, `ast.unaryop`, `ast.cmpop`, `ast.boolop` и `ast.expr_context`) на возвращаемом дереве являются синглтонами. Изменения в одном будут отражены во всех других вхождениях того же значения (например, [`ast.Add`](https://python-all.ru/3.13/library/ast.html#ast.Add)).20152016## `ast` Вспомогательные функции20172018Помимо классов узлов, модуль `ast` определяет следующие служебные функции и классы для обхода абстрактных синтаксических деревьев:20192020#### `ast.parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)`20212022Разбирает исходный код в узел AST. Эквивалентно `compile(source, filename, mode, flags=FLAGS_VALUE, optimize=optimize)`, где `FLAGS_VALUE` равно `ast.PyCF_ONLY_AST`, если `optimize <= 0`, и `ast.PyCF_OPTIMIZED_AST` в противном случае.20232024Если задан `type_comments=True`, парсер изменяется, чтобы проверять и возвращать комментарии типов, как указано в [**PEP 484**](https://python-all.ru/3.13/library/ast.html) и [**PEP 526**](https://python-all.ru/3.13/library/ast.html). Это эквивалентно добавлению [`ast.PyCF_TYPE_COMMENTS`](https://python-all.ru/3.13/library/ast.html#ast.PyCF_TYPE_COMMENTS) к флагам, передаваемым в [`compile()`](https://python-all.ru/3.13/library/functions.html#compile). Это приведёт к сообщению об ошибках синтаксиса для неправильно расположенных комментариев типов. Без этого флага комментарии типов будут игнорироваться, и поле `type_comment` в выбранных узлах AST всегда будет `None`. Кроме того, расположение комментариев `# type: ignore` будет возвращаться как атрибут `type_ignores` объекта [`Module`](https://python-all.ru/3.13/library/ast.html#ast.Module) (иначе это всегда пустой список).20252026Кроме того, если `mode` равно `'func_type'`, синтаксис входных данных изменяется в соответствии с [**PEP 484**](https://python-all.ru/3.13/library/ast.html) «сигнатурными комментариями типов», например `(str, int) -> List[str]`.20272028Установка `feature_version` в кортеж `(major, minor)` приведёт к «наилучшей попытке» разбора с использованием грамматики этой версии Python. Например, установка `feature_version=(3, 9)` будет пытаться запретить разбор инструкций [`match`](https://python-all.ru/3.13/reference/compound_stmts.html#match). В настоящее время `major` должно быть равно `3`. Самая низкая поддерживаемая версия – `(3, 7)` (и это может увеличиться в будущих версиях Python); самая высокая – `sys.version_info[0:2]`. «Наилучшая попытка» означает, что нет гарантии, что разбор (или успех разбора) будет таким же, как при запуске на версии Python, соответствующей `feature_version`.20292030Если исходный код содержит нулевой символ (`\0`), возбуждается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).20312032> **Предупреждение**2033>2034> Обратите внимание, что успешный разбор исходного кода в объект AST не гарантирует, что предоставленный исходный код является корректным кодом Python, который можно выполнить, поскольку этап компиляции может вызывать дополнительные исключения [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError). Например, исходный код `return 42` генерирует корректный узел AST для инструкции return, но его нельзя скомпилировать отдельно (он должен находиться внутри узла функции).2035>2036> В частности, `ast.parse()` не выполняет никаких проверок областей видимости, которые выполняет этап компиляции.20372038> **Предупреждение**2039>2040> Можно вызвать сбой интерпретатора Python с помощью достаточно большой/сложной строки из-за ограничений глубины стека в компиляторе AST Python.20412042Изменено в версии 3.8: Добавлены `type_comments`, `mode='func_type'` и `feature_version`.20432044Изменено в версии 3.13: Минимальная поддерживаемая версия для `feature_version` теперь `(3, 7)`. Был добавлен аргумент `optimize`.20452046#### `ast.unparse(ast_obj)`20472048Выполняет обратный разбор объекта [`ast.AST`](https://python-all.ru/3.13/library/ast.html#ast.AST) и генерирует строку с кодом, который при обратном разборе с помощью [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse) даст эквивалентный объект `ast.AST`.20492050> **Предупреждение**2051>2052> Полученная строка кода не обязательно будет равна исходному коду, который породил объект [`ast.AST`](https://python-all.ru/3.13/library/ast.html#ast.AST) (без каких-либо оптимизаций компилятора, таких как константные кортежи/frozensets).20532054> **Предупреждение**2055>2056> Попытка выполнить обратный разбор очень сложного выражения приведёт к [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError).20572058Добавлено в версии 3.9.20592060#### `ast.literal_eval(node_or_string)`20612062Вычисляет узел выражения или строку, содержащую только литерал Python или отображение контейнера. Предоставленная строка или узел могут состоять только из следующих структур литералов Python: строки, байты, числа, кортежи, списки, словари, множества, булевы значения, `None` и `Ellipsis`.20632064Это можно использовать для вычисления строк, содержащих значения Python, без необходимости разбирать значения самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с операторами или индексацией.20652066Раньше эта функция документировалась как «безопасная» без определения, что это значит. Это вводило в заблуждение. Она специально разработана так, чтобы не выполнять код Python, в отличие от более общей [`eval()`](https://python-all.ru/3.13/library/functions.html#eval). Нет пространства имён, поиска имён или возможности внешних вызовов. Но она не свободна от атак: относительно небольшой ввод может привести к истощению памяти или истощению стека C, что вызовет сбой процесса. Также существует возможность отказа в обслуживании из-за чрезмерного потребления ЦП на некоторых входных данных. Поэтому вызывать её на недоверенных данных не рекомендуется.20672068> **Предупреждение**2069>2070> Можно вызвать сбой интерпретатора Python из-за ограничений глубины стека в компиляторе AST Python.2071>2072> Она может возбуждать [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError), [`TypeError`](https://python-all.ru/3.13/library/exceptions.html#TypeError), [`SyntaxError`](https://python-all.ru/3.13/library/exceptions.html#SyntaxError), [`MemoryError`](https://python-all.ru/3.13/library/exceptions.html#MemoryError) и [`RecursionError`](https://python-all.ru/3.13/library/exceptions.html#RecursionError) в зависимости от некорректного ввода.20732074Изменено в версии 3.2: Теперь допускает литералы байтов и множеств.20752076Изменено в версии 3.9: Теперь поддерживает создание пустых множеств с помощью `'set()'`.20772078Изменено в версии 3.10: Для строковых входных данных начальные пробелы и табуляции теперь удаляются.20792080#### `ast.get_docstring(node, clean=True)`20812082Возвращает строку документации для данного *узла* (который должен быть узлом [`FunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.FunctionDef), [`AsyncFunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.AsyncFunctionDef), [`ClassDef`](https://python-all.ru/3.13/library/ast.html#ast.ClassDef) или [`Module`](https://python-all.ru/3.13/library/ast.html#ast.Module)) или `None`, если у него нет строки документации. Если *clean* истинно, очищает отступы строки документации с помощью [`inspect.cleandoc()`](https://python-all.ru/3.13/library/inspect.html#inspect.cleandoc).20832084Изменено в версии 3.5: Теперь поддерживается [`AsyncFunctionDef`](https://python-all.ru/3.13/library/ast.html#ast.AsyncFunctionDef).20852086#### `ast.get_source_segment(source, node, *, padded=False)`20872088Возвращает фрагмент исходного кода из *source*, который породил узел *node*. Если не хватает информации о местоположении ([`lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.lineno), [`end_lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_lineno), [`col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.col_offset) или [`end_col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_col_offset)), возвращает `None`.20892090Если *padded* равно `True`, первая строка многострочного оператора будет дополнена пробелами, чтобы соответствовать исходной позиции.20912092Добавлено в версии 3.8.20932094#### `ast.fix_missing_locations(node)`20952096При компиляции дерева узлов с помощью [`compile()`](https://python-all.ru/3.13/library/functions.html#compile) компилятор ожидает атрибуты [`lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.lineno) и [`col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.col_offset) для каждого узла, который их поддерживает. Заполнять их вручную для сгенерированных узлов довольно утомительно, поэтому эта вспомогательная функция рекурсивно добавляет эти атрибуты, если их ещё нет, устанавливая их равными значениям родительского узла. Работает рекурсивно, начиная с *node*.20972098#### `ast.increment_lineno(node, n=1)`20992100Увеличивает номер строки и номер конечной строки каждого узла в дереве, начиная с *node*, на *n*. Это полезно для «перемещения кода» в другое место в файле.21012102#### `ast.copy_location(new_node, old_node)`21032104Копирует информацию о местоположении в исходном коде ([`lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.13/library/ast.html#ast.AST.end_col_offset)) из *old\_node* в *new\_node*, если это возможно, и возвращает *new\_node*.21052106#### `ast.iter_fields(node)`21072108Генерирует кортеж из `(fieldname, value)` для каждого поля в `node._fields`, которое присутствует в *node*.21092110#### `ast.iter_child_nodes(node)`21112112Генерирует все непосредственные дочерние узлы *node*, то есть все поля, являющиеся узлами, и все элементы полей, являющихся списками узлов.21132114#### `ast.walk(node)`21152116Рекурсивно генерирует все узлы-потомки в дереве, начиная с *node* (включая сам *node*), в произвольном порядке. Это полезно, если требуется только изменить узлы на месте, а контекст не важен.21172118#### `class ast.NodeVisitor`21192120Базовый класс для обхода узлов, который обходит абстрактное синтаксическое дерево и вызывает функцию-посетитель для каждого найденного узла. Эта функция может вернуть значение, которое передаётся методом [`visit()`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor.visit).21212122Этот класс предназначен для наследования; в подклассе добавляются методы-посетители.21232124#### `visit(node)`21252126Посещает узел. Реализация по умолчанию вызывает метод `self.visit_classname`, где *classname* – имя класса узла, или [`generic_visit()`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor.generic_visit), если такой метод отсутствует.21272128#### `generic_visit(node)`21292130Этот посетитель вызывает [`visit()`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor.visit) для всех дочерних узлов.21312132Обратите внимание, что дочерние узлы тех узлов, для которых определён собственный метод-посетитель, не будут посещены, если посетитель сам не вызовет `generic_visit()` или не обойдёт их самостоятельно.21332134#### `visit_Constant(node)`21352136Обрабатывает все константные узлы.21372138Не используйте `NodeVisitor`, если требуется вносить изменения в узлы во время обхода. Для этого существует специальный посетитель ([`NodeTransformer`](https://python-all.ru/3.13/library/ast.html#ast.NodeTransformer)), который допускает модификации.21392140Устарело с версии 3.8: Методы `visit_Num()`, `visit_Str()`, `visit_Bytes()`, `visit_NameConstant()` и `visit_Ellipsis()` теперь устарели и не будут вызываться в будущих версиях Python. Добавьте метод [`visit_Constant()`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor.visit_Constant) для обработки всех узлов-констант.21412142#### `class ast.NodeTransformer`21432144Подкласс [`NodeVisitor`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor), который обходит абстрактное синтаксическое дерево и позволяет изменять узлы.21452146Метод `NodeTransformer` обходит AST и использует возвращаемое значение методов-посетителей для замены или удаления старого узла. Если возвращаемое значение метода-посетителя равно `None`, узел будет удалён из своего местоположения; в противном случае он заменяется возвращённым значением. Возвращённое значение может быть исходным узлом – в этом случае замена не происходит.21472148Вот пример преобразователя, который переписывает все обращения к именам (`foo`) в `data['foo']`:21492150```python2151class RewriteName(NodeTransformer):21522153    def visit_Name(self, node):2154        return Subscript(2155            value=Name(id='data', ctx=Load()),2156            slice=Constant(value=node.id),2157            ctx=node.ctx2158        )2159```21602161Имейте в виду: если у узла, с которым вы работаете, есть дочерние узлы, необходимо либо преобразовать дочерние узлы самостоятельно, либо сначала вызвать для узла метод [`generic_visit()`](https://python-all.ru/3.13/library/ast.html#ast.NodeVisitor.generic_visit).21622163Для узлов, входящих в состав набора инструкций (это относится ко всем узлам инструкций), посетитель может также возвращать список узлов, а не один узел.21642165Если `NodeTransformer` вводит новые узлы (не входившие в исходное дерево) без указания информации о расположении (например, [`lineno`](https://python-all.ru/3.13/library/ast.html#ast.AST.lineno)), следует вызвать [`fix_missing_locations()`](https://python-all.ru/3.13/library/ast.html#ast.fix_missing_locations) для нового поддерева, чтобы пересчитать информацию о расположении:21662167```python2168tree = ast.parse('foo', mode='eval')2169new_tree = fix_missing_locations(RewriteName().visit(tree))2170```21712172Обычно преобразователь используется следующим образом:21732174```python2175node = YourTransformer().visit(node)2176```21772178#### `ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)`21792180Возвращает форматированный дамп дерева из *node*. Это в основном полезно для отладки. Если *annotate\_fields* равно true (по умолчанию), возвращаемая строка будет показывать имена и значения полей. Если *annotate\_fields* равно false, результирующая строка будет более компактной за счёт опускания однозначных имён полей. Атрибуты, такие как номера строк и смещения столбцов, по умолчанию не выводятся. Если это нужно, *include\_attributes* можно установить в true.21812182Если *indent* – неотрицательное целое число или строка, дерево будет выведено с отступами указанного уровня. Уровень отступа 0, отрицательное значение или `""` вставляет только переводы строк. `None` (по умолчанию) выбирает однострочное представление. Положительный целочисленный отступ добавляет соответствующее количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), эта строка используется для отступа каждого уровня.21832184Если *show\_empty* равно false (по умолчанию), необязательные пустые списки будут опущены в выводе. Необязательные значения `None` всегда опускаются.21852186Изменено в версии 3.9: Добавлена опция *indent*.21872188Изменено в версии 3.13: Добавлена опция *show\_empty*.21892190```pycon2191>>> print(ast.dump(ast.parse("""\2192... async def f():2193...     await other_func()2194... """), indent=4, show_empty=True))2195Module(2196    body=[2197        AsyncFunctionDef(2198            name='f',2199            args=arguments(2200                posonlyargs=[],2201                args=[],2202                kwonlyargs=[],2203                kw_defaults=[],2204                defaults=[]),2205            body=[2206                Expr(2207                    value=Await(2208                        value=Call(2209                            func=Name(id='other_func', ctx=Load()),2210                            args=[],2211                            keywords=[])))],2212            decorator_list=[],2213            type_params=[])],2214    type_ignores=[])2215```22162217## Флаги компилятора22182219Следующие флаги могут быть переданы в [`compile()`](https://python-all.ru/3.13/library/functions.html#compile) для изменения эффектов компиляции программы:22202221#### `ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`22222223Включает поддержку `await`, `async for`, `async with` и асинхронных включений верхнего уровня.22242225Добавлено в версии 3.8.22262227#### `ast.PyCF_ONLY_AST`22282229Генерирует и возвращает абстрактное синтаксическое дерево вместо скомпилированного объекта кода.22302231#### `ast.PyCF_OPTIMIZED_AST`22322233Возвращаемое AST оптимизируется в соответствии с аргументом *optimize* в [`compile()`](https://python-all.ru/3.13/library/functions.html#compile) или [`ast.parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse).22342235Добавлено в версии 3.13.22362237#### `ast.PyCF_TYPE_COMMENTS`22382239Включает поддержку комментариев типов в стиле [**PEP 484**](https://python-all.ru/3.13/library/ast.html) и [**PEP 526**](https://python-all.ru/3.13/library/ast.html) (`# type: <type>`, `# type: ignore <stuff>`).22402241Добавлено в версии 3.8.22422243## Использование командной строки22442245Добавлено в версии 3.9.22462247Модуль `ast` может быть выполнен как скрипт из командной строки. Это просто:22482249```sh2250python -m ast [-m <mode>] [-a] [infile]2251```22522253Принимаются следующие опции:22542255#### `-h, --help`22562257Показать справку и выйти.22582259#### `-m <mode>`22602261#### `--mode <mode>`22622263Определяет, какой вид кода должен быть скомпилирован, как аргумент *mode* в [`parse()`](https://python-all.ru/3.13/library/ast.html#ast.parse).22642265#### `--no-type-comments`22662267Не обрабатывать комментарии типов.22682269#### `-a, --include-attributes`22702271Включать атрибуты, такие как номера строк и смещения столбцов.22722273#### `-i <indent>`22742275#### `--indent <indent>`22762277Отступ узлов в AST (количество пробелов).22782279Если указан `infile`, его содержимое разбирается в AST и выводится в stdout. В противном случае содержимое читается из stdin.22802281> **См. также**2282>2283> [Green Tree Snakes](https://python-all.ru/3.13/library/ast.html) – внешний документационный ресурс, содержащий подробности работы с AST Python.2284>2285> [ASTTokens](https://python-all.ru/3.13/library/ast.html) дополняет AST Python позициями токенов и текста в исходном коде, который их породил. Это полезно для инструментов, выполняющих преобразования исходного кода.2286>2287> [leoAst.py](https://python-all.ru/3.13/library/ast.html) объединяет токен-ориентированное и синтаксическое представление программ Python, вставляя двунаправленные связи между токенами и узлами AST.2288>2289> [LibCST](https://python-all.ru/3.13/library/ast.html) разбирает код как конкретное синтаксическое дерево, похожее на AST, и сохраняет все детали форматирования. Это полезно для создания приложений автоматического рефакторинга (codemod) и линтеров.2290>2291> [Parso](https://python-all.ru/3.13/library/ast.html) – это парсер Python, поддерживающий восстановление после ошибок и сквозной разбор для разных версий Python (в нескольких версиях Python). Parso также может выводить несколько синтаксических ошибок в вашем файле Python.2292