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

ast.md

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

1> **Источник:** https://python-all.ru/3.11/library/ast.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast) – абстрактные синтаксические деревья89**Исходный код:** [Lib/ast.py](https://python-all.ru/src/3.11/Lib/ast.py)1011---1213Модуль [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast) помогает приложениям Python обрабатывать деревья абстрактного синтаксиса языка Python. Абстрактный синтаксис может меняться от версии к версии; с помощью этого модуля можно программно узнать, как выглядит текущая грамматика.1415Абстрактное синтаксическое дерево можно создать, передав [`ast.PyCF_ONLY_AST`](https://python-all.ru/3.11/library/ast.html#ast.PyCF_ONLY_AST) в качестве флага встроенной функции [`compile()`](https://python-all.ru/3.11/library/functions.html#compile) или используя вспомогательную функцию [`parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) из этого модуля. Результатом будет дерево объектов, классы которых наследуют от [`ast.AST`](https://python-all.ru/3.11/library/ast.html#ast.AST). Абстрактное синтаксическое дерево можно скомпилировать в объект кода Python с помощью встроенной функции [`compile()`](https://python-all.ru/3.11/library/functions.html#compile).1617## Абстрактная грамматика1819Абстрактная грамматика в настоящее время определяется следующим образом:2021```asdl22-- Встроенные типы ASDL:23-- идентификатор, целое, строка, константа2425module Python26{27    mod = Module(stmt* body, type_ignore* type_ignores)28        | Interactive(stmt* body)29        | Expression(expr body)30        | FunctionType(expr* argtypes, expr returns)3132    stmt = FunctionDef(identifier name, arguments args,33                       stmt* body, expr* decorator_list, expr? returns,34                       string? type_comment)35          | AsyncFunctionDef(identifier name, arguments args,36                             stmt* body, expr* decorator_list, expr? returns,37                             string? type_comment)3839          | ClassDef(identifier name,40             expr* bases,41             keyword* keywords,42             stmt* body,43             expr* decorator_list)44          | Return(expr? value)4546          | Delete(expr* targets)47          | Assign(expr* targets, expr value, string? type_comment)48          | AugAssign(expr target, operator op, expr value)49          -- 'simple' указывает, что аннотируется простое имя без скобок50          | AnnAssign(expr target, expr annotation, expr? value, int simple)5152          -- используется 'orelse', так как else – ключевое слово в целевых языках53          | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)54          | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)55          | While(expr test, stmt* body, stmt* orelse)56          | If(expr test, stmt* body, stmt* orelse)57          | With(withitem* items, stmt* body, string? type_comment)58          | AsyncWith(withitem* items, stmt* body, string? type_comment)5960          | Match(expr subject, match_case* cases)6162          | Raise(expr? exc, expr? cause)63          | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)64          | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)65          | Assert(expr test, expr? msg)6667          | Import(alias* names)68          | ImportFrom(identifier? module, alias* names, int? level)6970          | Global(identifier* names)71          | Nonlocal(identifier* names)72          | Expr(expr value)73          | Pass | Break | Continue7475          -- col_offset – это смещение в байтах в строке UTF-8, используемой парсером76          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)7778          -- BoolOp() может использовать left и right?79    expr = BoolOp(boolop op, expr* values)80         | NamedExpr(expr target, expr value)81         | BinOp(expr left, operator op, expr right)82         | UnaryOp(unaryop op, expr operand)83         | Lambda(arguments args, expr body)84         | IfExp(expr test, expr body, expr orelse)85         | Dict(expr* keys, expr* values)86         | Set(expr* elts)87         | ListComp(expr elt, comprehension* generators)88         | SetComp(expr elt, comprehension* generators)89         | DictComp(expr key, expr value, comprehension* generators)90         | GeneratorExp(expr elt, comprehension* generators)91         -- грамматика ограничивает, где могут встречаться выражения yield92         | Await(expr value)93         | Yield(expr? value)94         | YieldFrom(expr value)95         -- нужны последовательности для сравнения, чтобы различать96         -- x < 4 < 3 and (x < 4) < 397         | Compare(expr left, cmpop* ops, expr* comparators)98         | Call(expr func, expr* args, keyword* keywords)99         | FormattedValue(expr value, int conversion, expr? format_spec)100         | JoinedStr(expr* values)101         | Constant(constant value, string? kind)102103         -- следующее выражение может появляться в контексте присваивания104         | Attribute(expr value, identifier attr, expr_context ctx)105         | Subscript(expr value, expr slice, expr_context ctx)106         | Starred(expr value, expr_context ctx)107         | Name(identifier id, expr_context ctx)108         | List(expr* elts, expr_context ctx)109         | Tuple(expr* elts, expr_context ctx)110111         -- может встречаться только в Subscript112         | Slice(expr? lower, expr? upper, expr? step)113114          -- col_offset – это смещение в байтах в строке UTF-8, используемой парсером115          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)116117    expr_context = Load | Store | Del118119    boolop = And | Or120121    operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift122                 | RShift | BitOr | BitXor | BitAnd | FloorDiv123124    unaryop = Invert | Not | UAdd | USub125126    cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn127128    comprehension = (expr target, expr iter, expr* ifs, int is_async)129130    excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)131                    attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)132133    arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,134                 expr* kw_defaults, arg? kwarg, expr* defaults)135136    arg = (identifier arg, expr? annotation, string? type_comment)137           attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)138139    -- ключевые аргументы, переданные вызову (идентификатор NULL для **kwargs)140    keyword = (identifier? arg, expr value)141               attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)142143    -- имя импорта с необязательным псевдонимом 'as'144    alias = (identifier name, identifier? asname)145             attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)146147    withitem = (expr context_expr, expr? optional_vars)148149    match_case = (pattern pattern, expr? guard, stmt* body)150151    pattern = MatchValue(expr value)152            | MatchSingleton(constant value)153            | MatchSequence(pattern* patterns)154            | MatchMapping(expr* keys, pattern* patterns, identifier? rest)155            | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)156157            | MatchStar(identifier? name)158            -- необязательный параметр "rest" MatchMapping обрабатывает захват дополнительных ключей отображения159160            | MatchAs(pattern? pattern, identifier? name)161            | MatchOr(pattern* patterns)162163             attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)164165    type_ignore = TypeIgnore(int lineno, string tag)166}167```168169## Классы узлов170171#### `class ast.AST`172173Это базовый класс для всех узлов AST. Реальные классы узлов унаследованы из файла `Parser/Python.asdl`, который воспроизведён [выше](https://python-all.ru/3.11/library/ast.html#abstract-grammar). Они определены в C-модуле `_ast` и повторно экспортируются в [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast).174175Для каждого символа левой части абстрактной грамматики определён один класс (например, `ast.stmt` или `ast.expr`). Кроме того, для каждого конструктора правой части определён один класс; эти классы наследуют от классов для деревьев левой части. Например, [`ast.BinOp`](https://python-all.ru/3.11/library/ast.html#ast.BinOp) наследует от `ast.expr`. Для продукционных правил с альтернативами (так называемых «сумм») класс левой части является абстрактным: создаются только экземпляры конкретных узлов-конструкторов.176177#### `_fields`178179Каждый конкретный класс имеет атрибут [`_fields`](https://python-all.ru/3.11/library/ast.html#ast.AST._fields), который содержит имена всех дочерних узлов.180181Каждый экземпляр конкретного класса имеет по одному атрибуту для каждого дочернего узла, тип которого определён в грамматике. Например, экземпляры [`ast.BinOp`](https://python-all.ru/3.11/library/ast.html#ast.BinOp) имеют атрибут `left` типа `ast.expr`.182183Если эти атрибуты помечены как необязательные в грамматике (с помощью вопросительного знака), значением может быть `None`. Если атрибуты могут иметь ноль или более значений (помечены звёздочкой), значения представляются в виде списков Python. Все возможные атрибуты должны присутствовать и иметь корректные значения при компиляции AST с помощью [`compile()`](https://python-all.ru/3.11/library/functions.html#compile).184185#### `lineno`186187#### `col_offset`188189#### `end_lineno`190191#### `end_col_offset`192193Экземпляры подклассов `ast.expr` и `ast.stmt` имеют атрибуты [`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_col_offset). Атрибуты [`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno) и [`end_lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_lineno) – это номер первой и последней строки исходного текста (нумерация с 1, то есть первая строка – строка 1), а [`col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.col_offset) и [`end_col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_col_offset) – соответствующие смещения в байтах UTF-8 от первого и последнего токенов, породивших узел. Смещение UTF-8 записывается, потому что парсер использует UTF-8 внутри.194195Обратите внимание, что конечные позиции не требуются компилятором и поэтому являются необязательными. Смещение конца находится *после* последнего символа, например, можно получить фрагмент исходного кода узла выражения из одной строки с помощью `source_line[node.col_offset : node.end_col_offset]`.196197Конструктор класса `ast.T` разбирает свои аргументы следующим образом:198199- Если есть позиционные аргументы, их должно быть столько же, сколько элементов в `T._fields`; они будут присвоены как атрибуты с этими именами.200- Если есть ключевые аргументы, они установят атрибуты с теми же именами в указанные значения.201202Например, чтобы создать и заполнить узел [`ast.UnaryOp`](https://python-all.ru/3.11/library/ast.html#ast.UnaryOp), можно использовать203204```python205node = ast.UnaryOp()206node.op = ast.USub()207node.operand = ast.Constant()208node.operand.value = 5209node.operand.lineno = 0210node.operand.col_offset = 0211node.lineno = 0212node.col_offset = 0213```214215или более компактный216217```python218node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),219                   lineno=0, col_offset=0)220```221222Изменено в версии 3.8: Класс [`ast.Constant`](https://python-all.ru/3.11/library/ast.html#ast.Constant) теперь используется для всех констант.223224Изменено в версии 3.9: Простые индексы представляются своим значением, расширенные срезы представляются кортежами.225226Устарело с версии 3.8: Старые классы `ast.Num`, `ast.Str`, `ast.Bytes`, `ast.NameConstant` и `ast.Ellipsis` всё ещё доступны, но будут удалены в будущих версиях Python. А пока их создание будет возвращать экземпляр другого класса.227228Устарело с версии 3.9: Старые классы `ast.Index` и `ast.ExtSlice` всё ещё доступны, но будут удалены в будущих выпусках Python. При этом при их создании будет возвращён экземпляр другого класса.229230> **Примечание**231>232> Описания конкретных классов узлов, приведённые здесь, изначально были адаптированы из замечательного проекта [Green Tree Snakes](https://python-all.ru/3.11/library/ast.html) и всех его участников.233234### Корневые узлы235236#### `class ast.Module(body, type_ignores)`237238A Python module, as with [file input](https://python-all.ru/3.11/reference/toplevel_components.html#file-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) in the default `"exec"` *mode*.239240*body* – это [`list`](https://python-all.ru/3.11/library/stdtypes.html#list) из [Statements](https://python-all.ru/3.11/library/ast.html#ast-statements) модуля.241242*type\_ignores* – это [`list`](https://python-all.ru/3.11/library/stdtypes.html#list) комментариев type ignore модуля; подробнее см. [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse).243244```pycon245>>> print(ast.dump(ast.parse('x = 1'), indent=4))246Module(247    body=[248        Assign(249            targets=[250                Name(id='x', ctx=Store())],251            value=Constant(value=1))],252    type_ignores=[])253```254255#### `class ast.Expression(body)`256257A single Python [expression input](https://python-all.ru/3.11/reference/toplevel_components.html#expression-input). Node type generated by [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) when *mode* is `"eval"`.258259*body* – это один узел, один из [типов выражений](https://python-all.ru/3.11/library/ast.html#ast-expressions).260261```pycon262>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))263Expression(264    body=Constant(value=123))265```266267#### `class ast.Interactive(body)`268269A single [interactive input](https://python-all.ru/3.11/reference/toplevel_components.html#interactive), like in [Interactive Mode](https://python-all.ru/3.11/tutorial/appendix.html#tut-interac). Node type generated by [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) when *mode* is `"single"`.270271*body* – это [`list`](https://python-all.ru/3.11/library/stdtypes.html#list) [узлов инструкций](https://python-all.ru/3.11/library/ast.html#ast-statements).272273```pycon274>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))275Interactive(276    body=[277        Assign(278            targets=[279                Name(id='x', ctx=Store())],280            value=Constant(value=1)),281        Assign(282            targets=[283                Name(id='y', ctx=Store())],284            value=Constant(value=2))])285```286287#### `class ast.FunctionType(argtypes, returns)`288289A 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.11/library/ast.html) annotations. Node type generated by [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) when *mode* is `"func_type"`.290291Такие комментарии о типах выглядели следующим образом:292293```python294def sum_two_number(a, b):295    # type: (int, int) -> int296    return a + b297```298299*argtypes* – это [`list`](https://python-all.ru/3.11/library/stdtypes.html#list) [узлов выражений](https://python-all.ru/3.11/library/ast.html#ast-expressions).300301*returns* – это один [узел выражения](https://python-all.ru/3.11/library/ast.html#ast-expressions).302303```pycon304>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))305FunctionType(306    argtypes=[307        Name(id='int', ctx=Load()),308        Name(id='str', ctx=Load())],309    returns=Subscript(310        value=Name(id='List', ctx=Load()),311        slice=Name(id='int', ctx=Load()),312        ctx=Load()))313```314315Новое в версии 3.8.316317### Литералы318319#### `class ast.Constant(value)`320321Постоянное значение. Атрибут `value` литерала `Constant` содержит объект Python, который он представляет. Представленные значения могут быть простыми типами, такими как число, строка или `None`, а также неизменяемыми контейнерными типами (кортежами и замороженными множествами), если все их элементы постоянны.322323```pycon324>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))325Expression(326    body=Constant(value=123))327```328329#### `class ast.FormattedValue(value, conversion, format_spec)`330331Узел, представляющий одно поле форматирования в f-строке. Если строка содержит только одно поле форматирования и больше ничего, узел может быть изолированным; в противном случае он встречается внутри [`JoinedStr`](https://python-all.ru/3.11/library/ast.html#ast.JoinedStr).332333- `value` – это любой узел выражения (например, литерал, переменная или вызов функции).334- `conversion` – целое число:335336  - -1: без форматирования337  - 115: `!s` форматирование строк338  - 114: `!r` форматирование repr339  - 97: `!a` форматирование ascii340- `format_spec` – узел [`JoinedStr`](https://python-all.ru/3.11/library/ast.html#ast.JoinedStr), представляющий форматирование значения, или `None`, если формат не указан. `conversion` и `format_spec` могут быть установлены одновременно.341342#### `class ast.JoinedStr(values)`343344F-строка, содержащая последовательность [`FormattedValue`](https://python-all.ru/3.11/library/ast.html#ast.FormattedValue) и [`Constant`](https://python-all.ru/3.11/library/ast.html#ast.Constant) узлов.345346```pycon347>>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4))348Expression(349    body=JoinedStr(350        values=[351            Constant(value='sin('),352            FormattedValue(353                value=Name(id='a', ctx=Load()),354                conversion=-1),355            Constant(value=') is '),356            FormattedValue(357                value=Call(358                    func=Name(id='sin', ctx=Load()),359                    args=[360                        Name(id='a', ctx=Load())],361                    keywords=[]),362                conversion=-1,363                format_spec=JoinedStr(364                    values=[365                        Constant(value='.3')]))]))366```367368#### `class ast.List(elts, ctx)`369370#### `class ast.Tuple(elts, ctx)`371372Список или кортеж. `elts` содержит список узлов, представляющих элементы. `ctx` равен [`Store`](https://python-all.ru/3.11/library/ast.html#ast.Store), если контейнер является целью присваивания (т.е. `(x,y)=something`), и [`Load`](https://python-all.ru/3.11/library/ast.html#ast.Load) в противном случае.373374```pycon375>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))376Expression(377    body=List(378        elts=[379            Constant(value=1),380            Constant(value=2),381            Constant(value=3)],382        ctx=Load()))383>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))384Expression(385    body=Tuple(386        elts=[387            Constant(value=1),388            Constant(value=2),389            Constant(value=3)],390        ctx=Load()))391```392393#### `class ast.Set(elts)`394395Множество. `elts` содержит список узлов, представляющих элементы множества.396397```pycon398>>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))399Expression(400    body=Set(401        elts=[402            Constant(value=1),403            Constant(value=2),404            Constant(value=3)]))405```406407#### `class ast.Dict(keys, values)`408409Словарь. `keys` и `values` содержат списки узлов, представляющих ключи и значения соответственно, в соответствующем порядке (то, что было бы возвращено при вызове `dictionary.keys()` и `dictionary.values()`).410411При распаковке словаря с помощью литералов словаря выражение, которое нужно раскрыть, помещается в список `values`, а `None` – на соответствующую позицию в `keys`.412413```pycon414>>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4))415Expression(416    body=Dict(417        keys=[418            Constant(value='a'),419            None],420        values=[421            Constant(value=1),422            Name(id='d', ctx=Load())]))423```424425### Переменные426427#### `class ast.Name(id, ctx)`428429Имя переменной. `id` содержит имя в виде строки, а `ctx` – один из следующих типов.430431#### `class ast.Load`432433#### `class ast.Store`434435#### `class ast.Del`436437Ссылки на переменные можно использовать для загрузки значения переменной, для присваивания ей нового значения или для её удаления. Ссылки на переменные получают контекст, чтобы различать эти случаи.438439```pycon440>>> print(ast.dump(ast.parse('a'), indent=4))441Module(442    body=[443        Expr(444            value=Name(id='a', ctx=Load()))],445    type_ignores=[])446447>>> print(ast.dump(ast.parse('a = 1'), indent=4))448Module(449    body=[450        Assign(451            targets=[452                Name(id='a', ctx=Store())],453            value=Constant(value=1))],454    type_ignores=[])455456>>> print(ast.dump(ast.parse('del a'), indent=4))457Module(458    body=[459        Delete(460            targets=[461                Name(id='a', ctx=Del())])],462    type_ignores=[])463```464465#### `class ast.Starred(value, ctx)`466467Ссылка на переменную `*var`. В `value` хранится переменная, обычно узел [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name). Этот тип необходимо использовать при построении узла [`Call`](https://python-all.ru/3.11/library/ast.html#ast.Call) с помощью `*args`.468469```pycon470>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))471Module(472    body=[473        Assign(474            targets=[475                Tuple(476                    elts=[477                        Name(id='a', ctx=Store()),478                        Starred(479                            value=Name(id='b', ctx=Store()),480                            ctx=Store())],481                    ctx=Store())],482            value=Name(id='it', ctx=Load()))],483    type_ignores=[])484```485486### Выражения487488#### `class ast.Expr(value)`489490Когда выражение, например вызов функции, выступает в роли самостоятельного оператора и его возвращаемое значение не используется и не сохраняется, оно помещается в этот контейнер. `value` содержит один из остальных узлов этого раздела: узел [`Constant`](https://python-all.ru/3.11/library/ast.html#ast.Constant), узел [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name), [`Lambda`](https://python-all.ru/3.11/library/ast.html#ast.Lambda), [`Yield`](https://python-all.ru/3.11/library/ast.html#ast.Yield) или [`YieldFrom`](https://python-all.ru/3.11/library/ast.html#ast.YieldFrom).491492```pycon493>>> print(ast.dump(ast.parse('-a'), indent=4))494Module(495    body=[496        Expr(497            value=UnaryOp(498                op=USub(),499                operand=Name(id='a', ctx=Load())))],500    type_ignores=[])501```502503#### `class ast.UnaryOp(op, operand)`504505Унарная операция. `op` – оператор, а `operand` – любой узел выражения.506507#### `class ast.UAdd`508509#### `class ast.USub`510511#### `class ast.Not`512513#### `class ast.Invert`514515Токены унарных операторов. [`Not`](https://python-all.ru/3.11/library/ast.html#ast.Not) – ключевое слово `not`, [`Invert`](https://python-all.ru/3.11/library/ast.html#ast.Invert) – оператор `~`.516517```pycon518>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))519Expression(520    body=UnaryOp(521        op=Not(),522        operand=Name(id='x', ctx=Load())))523```524525#### `class ast.BinOp(left, op, right)`526527Бинарная операция (например, сложение или деление). `op` – оператор, а `left` и `right` – любые узлы выражений.528529```pycon530>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))531Expression(532    body=BinOp(533        left=Name(id='x', ctx=Load()),534        op=Add(),535        right=Name(id='y', ctx=Load())))536```537538#### `class ast.Add`539540#### `class ast.Sub`541542#### `class ast.Mult`543544#### `class ast.Div`545546#### `class ast.FloorDiv`547548#### `class ast.Mod`549550#### `class ast.Pow`551552#### `class ast.LShift`553554#### `class ast.RShift`555556#### `class ast.BitOr`557558#### `class ast.BitXor`559560#### `class ast.BitAnd`561562#### `class ast.MatMult`563564Токены бинарных операторов.565566#### `class ast.BoolOp(op, values)`567568Логическая операция – 'or' или 'and'. `op` – это [`Or`](https://python-all.ru/3.11/library/ast.html#ast.Or) или [`And`](https://python-all.ru/3.11/library/ast.html#ast.And). `values` – участвующие значения. Последовательные операции с одним и тем же оператором, например `a or b or c`, сводятся в один узел с несколькими значениями.569570Это не включает `not`, который является [`UnaryOp`](https://python-all.ru/3.11/library/ast.html#ast.UnaryOp).571572```pycon573>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))574Expression(575    body=BoolOp(576        op=Or(),577        values=[578            Name(id='x', ctx=Load()),579            Name(id='y', ctx=Load())]))580```581582#### `class ast.And`583584#### `class ast.Or`585586Токены логических операторов.587588#### `class ast.Compare(left, ops, comparators)`589590Сравнение двух или более значений. `left` – первое значение в сравнении, `ops` – список операторов, а `comparators` – список значений после первого элемента сравнения.591592```pycon593>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))594Expression(595    body=Compare(596        left=Constant(value=1),597        ops=[598            LtE(),599            Lt()],600        comparators=[601            Name(id='a', ctx=Load()),602            Constant(value=10)]))603```604605#### `class ast.Eq`606607#### `class ast.NotEq`608609#### `class ast.Lt`610611#### `class ast.LtE`612613#### `class ast.Gt`614615#### `class ast.GtE`616617#### `class ast.Is`618619#### `class ast.IsNot`620621#### `class ast.In`622623#### `class ast.NotIn`624625Токены операторов сравнения.626627#### `class ast.Call(func, args, keywords)`628629Вызов функции. `func` – это функция; обычно это объект [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name) или [`Attribute`](https://python-all.ru/3.11/library/ast.html#ast.Attribute). Об аргументах:630631- `args` содержит список аргументов, переданных по позиции.632- `keywords` содержит список объектов [`keyword`](https://python-all.ru/3.11/library/ast.html#ast.keyword), представляющих аргументы, переданные по ключевому слову.633634При создании узла `Call` обязательны `args` и `keywords`, но они могут быть пустыми списками.635636```pycon637>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))638Expression(639    body=Call(640        func=Name(id='func', ctx=Load()),641        args=[642            Name(id='a', ctx=Load()),643            Starred(644                value=Name(id='d', ctx=Load()),645                ctx=Load())],646        keywords=[647            keyword(648                arg='b',649                value=Name(id='c', ctx=Load())),650            keyword(651                value=Name(id='e', ctx=Load()))]))652```653654#### `class ast.keyword(arg, value)`655656Именованный аргумент вызова функции или определения класса. `arg` – это необработанная строка с именем параметра, `value` – узел, который нужно передать.657658#### `class ast.IfExp(test, body, orelse)`659660Выражение, например `a if b else c`. Каждое поле содержит один узел, поэтому в следующем примере все три являются узлами [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name).661662```pycon663>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))664Expression(665    body=IfExp(666        test=Name(id='b', ctx=Load()),667        body=Name(id='a', ctx=Load()),668        orelse=Name(id='c', ctx=Load())))669```670671#### `class ast.Attribute(value, attr, ctx)`672673Доступ к атрибуту, например `d.keys`. `value` – это узел, обычно [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name). `attr` – это строка с именем атрибута, а `ctx` – [`Load`](https://python-all.ru/3.11/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.11/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.11/library/ast.html#ast.Del) в зависимости от того, как используется атрибут.674675```pycon676>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))677Expression(678    body=Attribute(679        value=Name(id='snake', ctx=Load()),680        attr='colour',681        ctx=Load()))682```683684#### `class ast.NamedExpr(target, value)`685686> Именованное выражение. Этот узел AST создаётся оператором присваивания (также известным как оператор «морж»). В отличие от узла [`Assign`](https://python-all.ru/3.11/library/ast.html#ast.Assign), где первый аргумент может быть несколькими узлами, в данном случае и `target`, и `value` должны быть одиночными узлами.687688```pycon689>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))690Expression(691    body=NamedExpr(692        target=Name(id='x', ctx=Store()),693        value=Constant(value=4)))694```695696#### Индексирование697698#### `class ast.Subscript(value, slice, ctx)`699700Индексация, такая как `l[1]`. `value` – индексируемый объект (обычно последовательность или отображение). `slice` – это индекс, срез или ключ. Оно может быть [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple) и содержать [`Slice`](https://python-all.ru/3.11/library/ast.html#ast.Slice). `ctx` является [`Load`](https://python-all.ru/3.11/library/ast.html#ast.Load), [`Store`](https://python-all.ru/3.11/library/ast.html#ast.Store) или [`Del`](https://python-all.ru/3.11/library/ast.html#ast.Del) в зависимости от выполняемого действия при индексации.701702```pycon703>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))704Expression(705    body=Subscript(706        value=Name(id='l', ctx=Load()),707        slice=Tuple(708            elts=[709                Slice(710                    lower=Constant(value=1),711                    upper=Constant(value=2)),712                Constant(value=3)],713            ctx=Load()),714        ctx=Load()))715```716717#### `class ast.Slice(lower, upper, step)`718719Обычный срез (в виде `lower:upper` или `lower:upper:step`). Может встречаться только внутри поля *slice* узла [`Subscript`](https://python-all.ru/3.11/library/ast.html#ast.Subscript), либо напрямую, либо как элемент [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple).720721```pycon722>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))723Expression(724    body=Subscript(725        value=Name(id='l', ctx=Load()),726        slice=Slice(727            lower=Constant(value=1),728            upper=Constant(value=2)),729        ctx=Load()))730```731732#### Генераторы коллекций733734#### `class ast.ListComp(elt, generators)`735736#### `class ast.SetComp(elt, generators)`737738#### `class ast.GeneratorExp(elt, generators)`739740#### `class ast.DictComp(key, value, generators)`741742Генераторы списков и множеств, генераторные выражения и генераторы словарей. `elt` (или `key` и `value`) – это один узел, представляющий часть, которая будет вычисляться для каждого элемента.743744`generators` – это список узлов [`comprehension`](https://python-all.ru/3.11/library/ast.html#ast.comprehension).745746```pycon747>>> print(ast.dump(ast.parse('[x for x in numbers]', mode='eval'), indent=4))748Expression(749    body=ListComp(750        elt=Name(id='x', ctx=Load()),751        generators=[752            comprehension(753                target=Name(id='x', ctx=Store()),754                iter=Name(id='numbers', ctx=Load()),755                ifs=[],756                is_async=0)]))757>>> print(ast.dump(ast.parse('{x: x**2 for x in numbers}', mode='eval'), indent=4))758Expression(759    body=DictComp(760        key=Name(id='x', ctx=Load()),761        value=BinOp(762            left=Name(id='x', ctx=Load()),763            op=Pow(),764            right=Constant(value=2)),765        generators=[766            comprehension(767                target=Name(id='x', ctx=Store()),768                iter=Name(id='numbers', ctx=Load()),769                ifs=[],770                is_async=0)]))771>>> print(ast.dump(ast.parse('{x for x in numbers}', mode='eval'), indent=4))772Expression(773    body=SetComp(774        elt=Name(id='x', ctx=Load()),775        generators=[776            comprehension(777                target=Name(id='x', ctx=Store()),778                iter=Name(id='numbers', ctx=Load()),779                ifs=[],780                is_async=0)]))781```782783#### `class ast.comprehension(target, iter, ifs, is_async)`784785Одно предложение `for` в генераторе коллекции. `target` – это ссылка, используемая для каждого элемента (обычно узел [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name) или [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple)). `iter` – объект, по которому выполняется итерация. `ifs` – список проверочных выражений: каждое предложение `for` может содержать несколько `ifs`.786787`is_async` указывает, что генератор коллекции является асинхронным (использует `async for` вместо `for`). Значение – целое число (0 или 1).788789```pycon790>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),791...                indent=4)) # несколько включений в одном792Expression(793    body=ListComp(794        elt=Call(795            func=Name(id='ord', ctx=Load()),796            args=[797                Name(id='c', ctx=Load())],798            keywords=[]),799        generators=[800            comprehension(801                target=Name(id='line', ctx=Store()),802                iter=Name(id='file', ctx=Load()),803                ifs=[],804                is_async=0),805            comprehension(806                target=Name(id='c', ctx=Store()),807                iter=Name(id='line', ctx=Load()),808                ifs=[],809                is_async=0)]))810811>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),812...                indent=4)) # выражение-генератор813Expression(814    body=GeneratorExp(815        elt=BinOp(816            left=Name(id='n', ctx=Load()),817            op=Pow(),818            right=Constant(value=2)),819        generators=[820            comprehension(821                target=Name(id='n', ctx=Store()),822                iter=Name(id='it', ctx=Load()),823                ifs=[824                    Compare(825                        left=Name(id='n', ctx=Load()),826                        ops=[827                            Gt()],828                        comparators=[829                            Constant(value=5)]),830                    Compare(831                        left=Name(id='n', ctx=Load()),832                        ops=[833                            Lt()],834                        comparators=[835                            Constant(value=10)])],836                is_async=0)]))837838>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),839...                indent=4)) # асинхронное включение840Expression(841    body=ListComp(842        elt=Name(id='i', ctx=Load()),843        generators=[844            comprehension(845                target=Name(id='i', ctx=Store()),846                iter=Name(id='soc', ctx=Load()),847                ifs=[],848                is_async=1)]))849```850851### Инструкции852853#### `class ast.Assign(targets, value, type_comment)`854855Присваивание. `targets` – список узлов, а `value` – один узел.856857Несколько узлов в `targets` обозначают присваивание одного и того же значения каждому. Распаковка представляется помещением узла [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.11/library/ast.html#ast.List) внутрь `targets`.858859#### `type_comment`860861`type_comment` – это необязательная строка с аннотацией типа в виде комментария.862863```pycon864>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # множественное присваивание865Module(866    body=[867        Assign(868            targets=[869                Name(id='a', ctx=Store()),870                Name(id='b', ctx=Store())],871            value=Constant(value=1))],872    type_ignores=[])873874>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # распаковка875Module(876    body=[877        Assign(878            targets=[879                Tuple(880                    elts=[881                        Name(id='a', ctx=Store()),882                        Name(id='b', ctx=Store())],883                    ctx=Store())],884            value=Name(id='c', ctx=Load()))],885    type_ignores=[])886```887888#### `class ast.AnnAssign(target, annotation, value, simple)`889890Присваивание с аннотацией типа. `target` – это один узел, которым может быть [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.11/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.11/library/ast.html#ast.Subscript). `annotation` – это аннотация, например узел [`Constant`](https://python-all.ru/3.11/library/ast.html#ast.Constant) или [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name). `value` – единственный необязательный узел. `simple` – целое число-флаг, равное True для узла [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name) в `target`, которые не появляются в круглых скобках и поэтому являются чистыми именами, а не выражениями.891892```pycon893>>> print(ast.dump(ast.parse('c: int'), indent=4))894Module(895    body=[896        AnnAssign(897            target=Name(id='c', ctx=Store()),898            annotation=Name(id='int', ctx=Load()),899            simple=1)],900    type_ignores=[])901902>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # аннотация со скобками903Module(904    body=[905        AnnAssign(906            target=Name(id='a', ctx=Store()),907            annotation=Name(id='int', ctx=Load()),908            value=Constant(value=1),909            simple=0)],910    type_ignores=[])911912>>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # аннотация атрибута913Module(914    body=[915        AnnAssign(916            target=Attribute(917                value=Name(id='a', ctx=Load()),918                attr='b',919                ctx=Store()),920            annotation=Name(id='int', ctx=Load()),921            simple=0)],922    type_ignores=[])923924>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # аннотация подписки925Module(926    body=[927        AnnAssign(928            target=Subscript(929                value=Name(id='a', ctx=Load()),930                slice=Constant(value=1),931                ctx=Store()),932            annotation=Name(id='int', ctx=Load()),933            simple=0)],934    type_ignores=[])935```936937#### `class ast.AugAssign(target, op, value)`938939Расширенное присваивание, например `a += 1`. В следующем примере `target` – это узел [Имя](https://python-all.ru/3.11/library/ast.html#ast.Name) для `x` (с контекстом [`Store`](https://python-all.ru/3.11/library/ast.html#ast.Store)), `op` – это [Сложение](https://python-all.ru/3.11/library/ast.html#ast.Add), а `value` – это [Константа](https://python-all.ru/3.11/library/ast.html#ast.Constant) со значением 1.940941Атрибут `target` не может быть класса [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.11/library/ast.html#ast.List), в отличие от целей [`Assign`](https://python-all.ru/3.11/library/ast.html#ast.Assign).942943```pycon944>>> print(ast.dump(ast.parse('x += 2'), indent=4))945Module(946    body=[947        AugAssign(948            target=Name(id='x', ctx=Store()),949            op=Add(),950            value=Constant(value=2))],951    type_ignores=[])952```953954#### `class ast.Raise(exc, cause)`955956Инструкция `raise`. `exc` – объект исключения, который необходимо возбудить, обычно [Вызов](https://python-all.ru/3.11/library/ast.html#ast.Call) или [Имя](https://python-all.ru/3.11/library/ast.html#ast.Name), или `None` для отдельного `raise`. `cause` – необязательная часть для `y` в `Возбуждение`.957958```pycon959>>> print(ast.dump(ast.parse('raise x from y'), indent=4))960Module(961    body=[962        Raise(963            exc=Name(id='x', ctx=Load()),964            cause=Name(id='y', ctx=Load()))],965    type_ignores=[])966```967968#### `class ast.Assert(test, msg)`969970Утверждение. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.11/library/ast.html#ast.Compare). `msg` содержит сообщение об ошибке.971972```pycon973>>> print(ast.dump(ast.parse('assert x,y'), indent=4))974Module(975    body=[976        Assert(977            test=Name(id='x', ctx=Load()),978            msg=Name(id='y', ctx=Load()))],979    type_ignores=[])980```981982#### `class ast.Delete(targets)`983984Представляет инструкцию `del`. `targets` – список узлов, например узлов [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name), [`Attribute`](https://python-all.ru/3.11/library/ast.html#ast.Attribute) или [`Subscript`](https://python-all.ru/3.11/library/ast.html#ast.Subscript).985986```pycon987>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))988Module(989    body=[990        Delete(991            targets=[992                Name(id='x', ctx=Del()),993                Name(id='y', ctx=Del()),994                Name(id='z', ctx=Del())])],995    type_ignores=[])996```997998#### `class ast.Pass`9991000Инструкция `pass`.10011002```pycon1003>>> print(ast.dump(ast.parse('pass'), indent=4))1004Module(1005    body=[1006        Pass()],1007    type_ignores=[])1008```10091010Другие инструкции, которые применимы только внутри функций или циклов, описаны в других разделах.10111012#### Импорты10131014#### `class ast.Import(names)`10151016Инструкция импорта. `names` – это список узлов [`alias`](https://python-all.ru/3.11/library/ast.html#ast.alias).10171018```pycon1019>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))1020Module(1021    body=[1022        Import(1023            names=[1024                alias(name='x'),1025                alias(name='y'),1026                alias(name='z')])],1027    type_ignores=[])1028```10291030#### `class ast.ImportFrom(module, names, level)`10311032Представляет `from x import y`. `module` – это необработанная строка имени from, без начальных точек, или `None` для инструкций вроде `from . import foo`. `level` – целое число, указывающее уровень относительного импорта (0 означает абсолютный импорт).10331034```pycon1035>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))1036Module(1037    body=[1038        ImportFrom(1039            module='y',1040            names=[1041                alias(name='x'),1042                alias(name='y'),1043                alias(name='z')],1044            level=0)],1045    type_ignores=[])1046```10471048#### `class ast.alias(name, asname)`10491050Оба параметра – необработанные строки имён. `asname` может быть `None`, если должно использоваться обычное имя.10511052```pycon1053>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))1054Module(1055    body=[1056        ImportFrom(1057            module='foo.bar',1058            names=[1059                alias(name='a', asname='b'),1060                alias(name='c')],1061            level=2)],1062    type_ignores=[])1063```10641065### Управление потоком10661067> **Примечание**1068>1069> Необязательные предложения, такие как `else`, сохраняются как пустой список, если они отсутствуют.10701071#### `class ast.If(test, body, orelse)`10721073Инструкция `if`. `test` содержит один узел, например узел [`Compare`](https://python-all.ru/3.11/library/ast.html#ast.Compare). `body` и `orelse` содержат по списку узлов.10741075Предложения `elif` не имеют специального представления в AST, а появляются как дополнительные узлы [`If`](https://python-all.ru/3.11/library/ast.html#ast.If) в разделе `orelse` предыдущего.10761077```pycon1078>>> print(ast.dump(ast.parse("""1079... if x:1080...    ...1081... elif y:1082...    ...1083... else:1084...    ...1085... """), indent=4))1086Module(1087    body=[1088        If(1089            test=Name(id='x', ctx=Load()),1090            body=[1091                Expr(1092                    value=Constant(value=Ellipsis))],1093            orelse=[1094                If(1095                    test=Name(id='y', ctx=Load()),1096                    body=[1097                        Expr(1098                            value=Constant(value=Ellipsis))],1099                    orelse=[1100                        Expr(1101                            value=Constant(value=Ellipsis))])])],1102    type_ignores=[])1103```11041105#### `class ast.For(target, iter, body, orelse, type_comment)`11061107Цикл `for`. `target` содержит переменную (или переменные), которой присваивает цикл, в виде одного узла [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.11/library/ast.html#ast.List). `iter` содержит элемент, по которому выполняется итерация, также в виде одного узла. `body` и `orelse` содержат списки узлов для выполнения. Узлы в `orelse` выполняются, если цикл завершается нормально, а не через оператор `break`.11081109#### `type_comment`11101111`type_comment` – это необязательная строка с аннотацией типа в виде комментария.11121113```pycon1114>>> print(ast.dump(ast.parse("""1115... for x in y:1116...     ...1117... else:1118...     ...1119... """), indent=4))1120Module(1121    body=[1122        For(1123            target=Name(id='x', ctx=Store()),1124            iter=Name(id='y', ctx=Load()),1125            body=[1126                Expr(1127                    value=Constant(value=Ellipsis))],1128            orelse=[1129                Expr(1130                    value=Constant(value=Ellipsis))])],1131    type_ignores=[])1132```11331134#### `class ast.While(test, body, orelse)`11351136Цикл `while`. `test` содержит условие, например узел [`Compare`](https://python-all.ru/3.11/library/ast.html#ast.Compare).11371138```pycon1139>> print(ast.dump(ast.parse("""1140... while x:1141...    ...1142... else:1143...    ...1144... """), indent=4))1145Module(1146    body=[1147        While(1148            test=Name(id='x', ctx=Load()),1149            body=[1150                Expr(1151                    value=Constant(value=Ellipsis))],1152            orelse=[1153                Expr(1154                    value=Constant(value=Ellipsis))])],1155    type_ignores=[])1156```11571158#### `class ast.Break`11591160#### `class ast.Continue`11611162Инструкции `break` и `continue`.11631164```pycon1165>>> print(ast.dump(ast.parse("""\1166... for a in b:1167...     if a > 5:1168...         break1169...     else:1170...         continue1171...1172... """), indent=4))1173Module(1174    body=[1175        For(1176            target=Name(id='a', ctx=Store()),1177            iter=Name(id='b', ctx=Load()),1178            body=[1179                If(1180                    test=Compare(1181                        left=Name(id='a', ctx=Load()),1182                        ops=[1183                            Gt()],1184                        comparators=[1185                            Constant(value=5)]),1186                    body=[1187                        Break()],1188                    orelse=[1189                        Continue()])],1190            orelse=[])],1191    type_ignores=[])1192```11931194#### `class ast.Try(body, handlers, orelse, finalbody)`11951196Блоки `try`. Все атрибуты – списки узлов для выполнения, за исключением `handlers`, который является списком узлов [`ExceptHandler`](https://python-all.ru/3.11/library/ast.html#ast.ExceptHandler).11971198```pycon1199>>> print(ast.dump(ast.parse("""1200... try:1201...    ...1202... except Exception:1203...    ...1204... except OtherException as e:1205...    ...1206... else:1207...    ...1208... finally:1209...    ...1210... """), indent=4))1211Module(1212    body=[1213        Try(1214            body=[1215                Expr(1216                    value=Constant(value=Ellipsis))],1217            handlers=[1218                ExceptHandler(1219                    type=Name(id='Exception', ctx=Load()),1220                    body=[1221                        Expr(1222                            value=Constant(value=Ellipsis))]),1223                ExceptHandler(1224                    type=Name(id='OtherException', ctx=Load()),1225                    name='e',1226                    body=[1227                        Expr(1228                            value=Constant(value=Ellipsis))])],1229            orelse=[1230                Expr(1231                    value=Constant(value=Ellipsis))],1232            finalbody=[1233                Expr(1234                    value=Constant(value=Ellipsis))])],1235    type_ignores=[])1236```12371238#### `class ast.TryStar(body, handlers, orelse, finalbody)`12391240Блоки `try`, за которыми следуют предложения `except*`. Атрибуты такие же, как для [`Try`](https://python-all.ru/3.11/library/ast.html#ast.Try), но узлы [`ExceptHandler`](https://python-all.ru/3.11/library/ast.html#ast.ExceptHandler) в `handlers` интерпретируются как блоки `except*`, а не `except`.12411242```pycon1243>>> print(ast.dump(ast.parse("""1244... try:1245...    ...1246... except* Exception:1247...    ...1248... """), indent=4))1249Module(1250    body=[1251        TryStar(1252            body=[1253                Expr(1254                    value=Constant(value=Ellipsis))],1255            handlers=[1256                ExceptHandler(1257                    type=Name(id='Exception', ctx=Load()),1258                    body=[1259                        Expr(1260                            value=Constant(value=Ellipsis))])],1261            orelse=[],1262            finalbody=[])],1263    type_ignores=[])1264```12651266#### `class ast.ExceptHandler(type, name, body)`12671268Одно предложение `except`. `type` – тип исключения, который оно перехватывает, обычно узел [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name) (или `None` для универсального предложения `except:`). `name` – необработанная строка для имени, в котором будет сохранено исключение, или `None`, если в предложении нет `as foo`. `body` – список узлов.12691270```pycon1271>>> print(ast.dump(ast.parse("""\1272... try:1273...     a + 11274... except TypeError:1275...     pass1276... """), indent=4))1277Module(1278    body=[1279        Try(1280            body=[1281                Expr(1282                    value=BinOp(1283                        left=Name(id='a', ctx=Load()),1284                        op=Add(),1285                        right=Constant(value=1)))],1286            handlers=[1287                ExceptHandler(1288                    type=Name(id='TypeError', ctx=Load()),1289                    body=[1290                        Pass()])],1291            orelse=[],1292            finalbody=[])],1293    type_ignores=[])1294```12951296#### `class ast.With(items, body, type_comment)`12971298Блок `with`. `items` – это список узлов [`withitem`](https://python-all.ru/3.11/library/ast.html#ast.withitem), представляющих менеджеры контекста, а `body` – это блок с отступом внутри контекста.12991300#### `type_comment`13011302`type_comment` – это необязательная строка с аннотацией типа в виде комментария.13031304#### `class ast.withitem(context_expr, optional_vars)`13051306Один менеджер контекста в блоке `with`. `context_expr` – это менеджер контекста, часто узел [`Call`](https://python-all.ru/3.11/library/ast.html#ast.Call). `optional_vars` – это [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name), [`Tuple`](https://python-all.ru/3.11/library/ast.html#ast.Tuple) или [`List`](https://python-all.ru/3.11/library/ast.html#ast.List) для части `as foo`, или `None`, если она не используется.13071308```pycon1309>>> print(ast.dump(ast.parse("""\1310... with a as b, c as d:1311...    something(b, d)1312... """), indent=4))1313Module(1314    body=[1315        With(1316            items=[1317                withitem(1318                    context_expr=Name(id='a', ctx=Load()),1319                    optional_vars=Name(id='b', ctx=Store())),1320                withitem(1321                    context_expr=Name(id='c', ctx=Load()),1322                    optional_vars=Name(id='d', ctx=Store()))],1323            body=[1324                Expr(1325                    value=Call(1326                        func=Name(id='something', ctx=Load()),1327                        args=[1328                            Name(id='b', ctx=Load()),1329                            Name(id='d', ctx=Load())],1330                        keywords=[]))])],1331    type_ignores=[])1332```13331334### Сопоставление с образцом13351336#### `class ast.Match(subject, cases)`13371338Оператор `match`. В `subject` хранится subject сопоставления (объект, который сравнивается с вариантами), а `cases` содержит итерируемый набор узлов [`match_case`](https://python-all.ru/3.11/library/ast.html#ast.match_case) с различными вариантами.13391340#### `class ast.match_case(pattern, guard, body)`13411342Один вариант (case) в операторе `match`. `pattern` содержит шаблон сопоставления, с которым будет сравниваться subject. Обратите внимание, что узлы [`AST`](https://python-all.ru/3.11/library/ast.html#ast.AST), создаваемые для шаблонов, отличаются от узлов, создаваемых для выражений, даже при одинаковом синтаксисе.13431344Атрибут `guard` содержит выражение, которое будет вычислено, если шаблон совпадает с subject.13451346`body` содержит список узлов, которые выполняются, если шаблон совпадает и результат вычисления guard-выражения истинен.13471348```pycon1349>>> print(ast.dump(ast.parse("""1350... match x:1351...     case [x] if x>0:1352...         ...1353...     case tuple():1354...         ...1355... """), indent=4))1356Module(1357    body=[1358        Match(1359            subject=Name(id='x', ctx=Load()),1360            cases=[1361                match_case(1362                    pattern=MatchSequence(1363                        patterns=[1364                            MatchAs(name='x')]),1365                    guard=Compare(1366                        left=Name(id='x', ctx=Load()),1367                        ops=[1368                            Gt()],1369                        comparators=[1370                            Constant(value=0)]),1371                    body=[1372                        Expr(1373                            value=Constant(value=Ellipsis))]),1374                match_case(1375                    pattern=MatchClass(1376                        cls=Name(id='tuple', ctx=Load()),1377                        patterns=[],1378                        kwd_attrs=[],1379                        kwd_patterns=[]),1380                    body=[1381                        Expr(1382                            value=Constant(value=Ellipsis))])])],1383    type_ignores=[])1384```13851386#### `class ast.MatchValue(value)`13871388Сопоставление с литералом или шаблоном значения, сравниваемым по равенству. `value` – это узел выражения. Допустимые узлы значений ограничены, как описано в документации оператора match. Этот шаблон успешно срабатывает, если subject сопоставления равен вычисленному значению.13891390```pycon1391>>> print(ast.dump(ast.parse("""1392... match x:1393...     case "Relevant":1394...         ...1395... """), indent=4))1396Module(1397    body=[1398        Match(1399            subject=Name(id='x', ctx=Load()),1400            cases=[1401                match_case(1402                    pattern=MatchValue(1403                        value=Constant(value='Relevant')),1404                    body=[1405                        Expr(1406                            value=Constant(value=Ellipsis))])])],1407    type_ignores=[])1408```14091410#### `class ast.MatchSingleton(value)`14111412Сопоставление с литералом, сравниваемым по идентичности. `value` – это синглтон, с которым производится сравнение: `None`, `True` или `False`. Этот шаблон успешно срабатывает, если subject сопоставления является заданной константой.14131414```pycon1415>>> print(ast.dump(ast.parse("""1416... match x:1417...     case None:1418...         ...1419... """), indent=4))1420Module(1421    body=[1422        Match(1423            subject=Name(id='x', ctx=Load()),1424            cases=[1425                match_case(1426                    pattern=MatchSingleton(value=None),1427                    body=[1428                        Expr(1429                            value=Constant(value=Ellipsis))])])],1430    type_ignores=[])1431```14321433#### `class ast.MatchSequence(patterns)`14341435Шаблон последовательности (sequence pattern) в match. `patterns` содержит шаблоны, которые будут сопоставляться с элементами subject, если subject является последовательностью. Сопоставляется с последовательностью переменной длины, если один из подшаблонов является узлом `MatchStar`, в противном случае сопоставляется с последовательностью фиксированной длины.14361437```pycon1438>>> print(ast.dump(ast.parse("""1439... match x:1440...     case [1, 2]:1441...         ...1442... """), indent=4))1443Module(1444    body=[1445        Match(1446            subject=Name(id='x', ctx=Load()),1447            cases=[1448                match_case(1449                    pattern=MatchSequence(1450                        patterns=[1451                            MatchValue(1452                                value=Constant(value=1)),1453                            MatchValue(1454                                value=Constant(value=2))]),1455                    body=[1456                        Expr(1457                            value=Constant(value=Ellipsis))])])],1458    type_ignores=[])1459```14601461#### `class ast.MatchStar(name)`14621463Сопоставляется с остатком последовательности в шаблоне последовательности переменной длины. Если `name` не равно `None`, то при успешном сопоставлении всего шаблона последовательности этому имени привязывается список, содержащий оставшиеся элементы последовательности.14641465```pycon1466>>> print(ast.dump(ast.parse("""1467... match x:1468...     case [1, 2, *rest]:1469...         ...1470...     case [*_]:1471...         ...1472... """), indent=4))1473Module(1474    body=[1475        Match(1476            subject=Name(id='x', ctx=Load()),1477            cases=[1478                match_case(1479                    pattern=MatchSequence(1480                        patterns=[1481                            MatchValue(1482                                value=Constant(value=1)),1483                            MatchValue(1484                                value=Constant(value=2)),1485                            MatchStar(name='rest')]),1486                    body=[1487                        Expr(1488                            value=Constant(value=Ellipsis))]),1489                match_case(1490                    pattern=MatchSequence(1491                        patterns=[1492                            MatchStar()]),1493                    body=[1494                        Expr(1495                            value=Constant(value=Ellipsis))])])],1496    type_ignores=[])1497```14981499#### `class ast.MatchMapping(keys, patterns, rest)`15001501Шаблон отображения (mapping pattern) в match. `keys` – последовательность узлов выражений. `patterns` – соответствующая последовательность узлов шаблонов. `rest` – необязательное имя, которое можно указать для захвата оставшихся элементов отображения. Допустимые ключевые выражения ограничены, как описано в документации оператора match.15021503Этот шаблон успешно срабатывает, если subject является отображением, все вычисленные ключевые выражения присутствуют в отображении, а значение, соответствующее каждому ключу, совпадает с соответствующим подшаблоном. Если `rest` не равно `None`, то при успешном сопоставлении всего шаблона отображения этому имени привязывается словарь, содержащий оставшиеся элементы отображения.15041505```pycon1506>>> print(ast.dump(ast.parse("""1507... match x:1508...     case {1: _, 2: _}:1509...         ...1510...     case {**rest}:1511...         ...1512... """), indent=4))1513Module(1514    body=[1515        Match(1516            subject=Name(id='x', ctx=Load()),1517            cases=[1518                match_case(1519                    pattern=MatchMapping(1520                        keys=[1521                            Constant(value=1),1522                            Constant(value=2)],1523                        patterns=[1524                            MatchAs(),1525                            MatchAs()]),1526                    body=[1527                        Expr(1528                            value=Constant(value=Ellipsis))]),1529                match_case(1530                    pattern=MatchMapping(keys=[], patterns=[], rest='rest'),1531                    body=[1532                        Expr(1533                            value=Constant(value=Ellipsis))])])],1534    type_ignores=[])1535```15361537#### `class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)`15381539Шаблон класса (class pattern) в match. `cls` – выражение, задающее номинальный класс для сопоставления. `patterns` – последовательность узлов шаблонов, которые будут сопоставляться с определённой классом последовательностью атрибутов для сопоставления с образцом. `kwd_attrs` – последовательность дополнительных атрибутов для сопоставления (указанных как ключевые аргументы в шаблоне класса), `kwd_patterns` – соответствующие шаблоны (указанные как значения ключевых слов в шаблоне класса).15401541Этот шаблон успешно срабатывает, если subject является экземпляром указанного класса, все позиционные шаблоны совпадают с соответствующими атрибутами, определёнными классом, и все указанные ключевые атрибуты совпадают со своими шаблонами.15421543Примечание: классы могут определять свойство, возвращающее self, чтобы сопоставлять узел шаблона с сопоставляемым экземпляром. Некоторые встроенные типы также сопоставляются таким образом, как описано в документации оператора match.15441545```pycon1546>>> print(ast.dump(ast.parse("""1547... match x:1548...     case Point2D(0, 0):1549...         ...1550...     case Point3D(x=0, y=0, z=0):1551...         ...1552... """), indent=4))1553Module(1554    body=[1555        Match(1556            subject=Name(id='x', ctx=Load()),1557            cases=[1558                match_case(1559                    pattern=MatchClass(1560                        cls=Name(id='Point2D', ctx=Load()),1561                        patterns=[1562                            MatchValue(1563                                value=Constant(value=0)),1564                            MatchValue(1565                                value=Constant(value=0))],1566                        kwd_attrs=[],1567                        kwd_patterns=[]),1568                    body=[1569                        Expr(1570                            value=Constant(value=Ellipsis))]),1571                match_case(1572                    pattern=MatchClass(1573                        cls=Name(id='Point3D', ctx=Load()),1574                        patterns=[],1575                        kwd_attrs=[1576                            'x',1577                            'y',1578                            'z'],1579                        kwd_patterns=[1580                            MatchValue(1581                                value=Constant(value=0)),1582                            MatchValue(1583                                value=Constant(value=0)),1584                            MatchValue(1585                                value=Constant(value=0))]),1586                    body=[1587                        Expr(1588                            value=Constant(value=Ellipsis))])])],1589    type_ignores=[])1590```15911592#### `class ast.MatchAs(pattern, name)`15931594Сопоставление «as-pattern», шаблон захвата (capture pattern) или шаблон-заменитель (wildcard pattern). `pattern` содержит шаблон match, с которым будет сопоставлен subject. Если шаблон равен `None`, узел представляет собой шаблон захвата (т.е. просто имя) и всегда успешно срабатывает.15951596Атрибут `name` содержит имя, которое будет привязано при успешном сопоставлении шаблона. Если `name` равно `None`, то `pattern` также должно быть `None`, и узел представляет собой шаблон-заменитель (wildcard).15971598```pycon1599>>> print(ast.dump(ast.parse("""1600... match x:1601...     case [x] as y:1602...         ...1603...     case _:1604...         ...1605... """), indent=4))1606Module(1607    body=[1608        Match(1609            subject=Name(id='x', ctx=Load()),1610            cases=[1611                match_case(1612                    pattern=MatchAs(1613                        pattern=MatchSequence(1614                            patterns=[1615                                MatchAs(name='x')]),1616                        name='y'),1617                    body=[1618                        Expr(1619                            value=Constant(value=Ellipsis))]),1620                match_case(1621                    pattern=MatchAs(),1622                    body=[1623                        Expr(1624                            value=Constant(value=Ellipsis))])])],1625    type_ignores=[])1626```16271628#### `class ast.MatchOr(patterns)`16291630Сопоставление «or-pattern» (шаблон ИЛИ). Or-pattern последовательно сопоставляет каждый из своих подшаблонов с subject, пока один из них не сработает. Тогда считается, что or-pattern сработал. Если ни один из подшаблонов не сработал, or-pattern не срабатывает. Атрибут `patterns` содержит список узлов шаблонов match, которые будут сопоставляться с subject.16311632```pycon1633>>> print(ast.dump(ast.parse("""1634... match x:1635...     case [x] | (y):1636...         ...1637... """), indent=4))1638Module(1639    body=[1640        Match(1641            subject=Name(id='x', ctx=Load()),1642            cases=[1643                match_case(1644                    pattern=MatchOr(1645                        patterns=[1646                            MatchSequence(1647                                patterns=[1648                                    MatchAs(name='x')]),1649                            MatchAs(name='y')]),1650                    body=[1651                        Expr(1652                            value=Constant(value=Ellipsis))])])],1653    type_ignores=[])1654```16551656### Определения функций и классов16571658#### `class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment)`16591660Определение функции.16611662- `name` – это необработанная строка имени функции.1663- `args` – это узел [`arguments`](https://python-all.ru/3.11/library/ast.html#ast.arguments).1664- `body` – это список узлов внутри функции.1665- `decorator_list` – это список декораторов, которые будут применены; декораторы перечислены от самого внешнего к внутреннему (т.е. первый в списке применяется последним).1666- `returns` – это аннотация возвращаемого значения.16671668#### `type_comment`16691670`type_comment` – это необязательная строка с аннотацией типа в виде комментария.16711672#### `class ast.Lambda(args, body)`16731674`lambda` – это минимальное определение функции, которое можно использовать внутри выражения. В отличие от [`FunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.FunctionDef), `body` содержит один узел.16751676```pycon1677>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))1678Module(1679    body=[1680        Expr(1681            value=Lambda(1682                args=arguments(1683                    posonlyargs=[],1684                    args=[1685                        arg(arg='x'),1686                        arg(arg='y')],1687                    kwonlyargs=[],1688                    kw_defaults=[],1689                    defaults=[]),1690                body=Constant(value=Ellipsis)))],1691    type_ignores=[])1692```16931694#### `class ast.arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)`16951696Аргументы функции.16971698- `posonlyargs`, `args` и `kwonlyargs` – это списки узлов [`arg`](https://python-all.ru/3.11/library/ast.html#ast.arg).1699- `vararg` и `kwarg` – это одиночные узлы [`arg`](https://python-all.ru/3.11/library/ast.html#ast.arg), ссылающиеся на параметры `*args, **kwargs`.1700- `kw_defaults` – это список значений по умолчанию для keyword-only аргументов. Если один из них равен `None`, соответствующий аргумент обязателен.1701- `defaults` – это список значений по умолчанию для аргументов, которые можно передавать позиционно. Если значений по умолчанию меньше, они соответствуют последним n аргументам.17021703#### `class ast.arg(arg, annotation, type_comment)`17041705Один аргумент в списке. `arg` – это сырая строка с именем аргумента; `annotation` – это его аннотация, например, узел [`Name`](https://python-all.ru/3.11/library/ast.html#ast.Name).17061707#### `type_comment`17081709`type_comment` – это необязательная строка с аннотацией типа в виде комментария17101711```pycon1712>>> print(ast.dump(ast.parse("""\1713... @decorator11714... @decorator21715... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':1716...     pass1717... """), indent=4))1718Module(1719    body=[1720        FunctionDef(1721            name='f',1722            args=arguments(1723                posonlyargs=[],1724                args=[1725                    arg(1726                        arg='a',1727                        annotation=Constant(value='annotation')),1728                    arg(arg='b'),1729                    arg(arg='c')],1730                vararg=arg(arg='d'),1731                kwonlyargs=[1732                    arg(arg='e'),1733                    arg(arg='f')],1734                kw_defaults=[1735                    None,1736                    Constant(value=3)],1737                kwarg=arg(arg='g'),1738                defaults=[1739                    Constant(value=1),1740                    Constant(value=2)]),1741            body=[1742                Pass()],1743            decorator_list=[1744                Name(id='decorator1', ctx=Load()),1745                Name(id='decorator2', ctx=Load())],1746            returns=Constant(value='return annotation'))],1747    type_ignores=[])1748```17491750#### `class ast.Return(value)`17511752Инструкция `return`.17531754```pycon1755>>> print(ast.dump(ast.parse('return 4'), indent=4))1756Module(1757    body=[1758        Return(1759            value=Constant(value=4))],1760    type_ignores=[])1761```17621763#### `class ast.Yield(value)`17641765#### `class ast.YieldFrom(value)`17661767Выражение `yield` или `yield from`. Поскольку это выражения, их необходимо обернуть в узел [`Expr`](https://python-all.ru/3.11/library/ast.html#ast.Expr), если возвращаемое значение не используется.17681769```pycon1770>>> print(ast.dump(ast.parse('yield x'), indent=4))1771Module(1772    body=[1773        Expr(1774            value=Yield(1775                value=Name(id='x', ctx=Load())))],1776    type_ignores=[])17771778>>> print(ast.dump(ast.parse('yield from x'), indent=4))1779Module(1780    body=[1781        Expr(1782            value=YieldFrom(1783                value=Name(id='x', ctx=Load())))],1784    type_ignores=[])1785```17861787#### `class ast.Global(names)`17881789#### `class ast.Nonlocal(names)`17901791Инструкции `global` и `nonlocal`. `names` – это список сырых строк.17921793```pycon1794>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))1795Module(1796    body=[1797        Global(1798            names=[1799                'x',1800                'y',1801                'z'])],1802    type_ignores=[])18031804>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))1805Module(1806    body=[1807        Nonlocal(1808            names=[1809                'x',1810                'y',1811                'z'])],1812    type_ignores=[])1813```18141815#### `class ast.ClassDef(name, bases, keywords, body, decorator_list)`18161817Определение класса.18181819- `name` – это сырая строка с именем класса.1820- `bases` – это список узлов для явно указанных базовых классов.1821- `keywords` – это список узлов [`keyword`](https://python-all.ru/3.11/library/ast.html#ast.keyword), в основном для «metaclass». Остальные ключевые слова будут переданы метаклассу в соответствии с [PEP-3115](https://python-all.ru/3.11/library/ast.html).1822- `body` – это список узлов, представляющих код внутри определения класса.1823- `decorator_list` – это список узлов, как и в [`FunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.FunctionDef).18241825```pycon1826>>> print(ast.dump(ast.parse("""\1827... @decorator11828... @decorator21829... class Foo(base1, base2, metaclass=meta):1830...     pass1831... """), indent=4))1832Module(1833    body=[1834        ClassDef(1835            name='Foo',1836            bases=[1837                Name(id='base1', ctx=Load()),1838                Name(id='base2', ctx=Load())],1839            keywords=[1840                keyword(1841                    arg='metaclass',1842                    value=Name(id='meta', ctx=Load()))],1843            body=[1844                Pass()],1845            decorator_list=[1846                Name(id='decorator1', ctx=Load()),1847                Name(id='decorator2', ctx=Load())])],1848    type_ignores=[])1849```18501851### async и await18521853#### `class ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment)`18541855Определение функции `async def`. Имеет те же поля, что и [`FunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.FunctionDef).18561857#### `class ast.Await(value)`18581859Выражение `await`. `value` – это то, чего оно ожидает. Допустимо только в теле [`AsyncFunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.AsyncFunctionDef).18601861```pycon1862>>> print(ast.dump(ast.parse("""\1863... async def f():1864...     await other_func()1865... """), indent=4))1866Module(1867    body=[1868        AsyncFunctionDef(1869            name='f',1870            args=arguments(1871                posonlyargs=[],1872                args=[],1873                kwonlyargs=[],1874                kw_defaults=[],1875                defaults=[]),1876            body=[1877                Expr(1878                    value=Await(1879                        value=Call(1880                            func=Name(id='other_func', ctx=Load()),1881                            args=[],1882                            keywords=[])))],1883            decorator_list=[])],1884    type_ignores=[])1885```18861887#### `class ast.AsyncFor(target, iter, body, orelse, type_comment)`18881889#### `class ast.AsyncWith(items, body, type_comment)`18901891`async for` циклы и `async with` менеджеры контекста. Они имеют те же поля, что [`For`](https://python-all.ru/3.11/library/ast.html#ast.For) и [`With`](https://python-all.ru/3.11/library/ast.html#ast.With), соответственно. Допустимы только в теле [`AsyncFunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.AsyncFunctionDef).18921893> **Примечание**1894>1895> Когда строка разбирается парсером [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse), узлы операторов (подклассы `ast.operator`, `ast.unaryop`, `ast.cmpop`, `ast.boolop` и `ast.expr_context`) на возвращаемом дереве являются синглтонами. Изменения в одном будут отражены во всех других вхождениях того же значения (например, [`ast.Add`](https://python-all.ru/3.11/library/ast.html#ast.Add)).18961897## [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast) Вспомогательные функции18981899Помимо классов узлов, модуль [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast) определяет следующие служебные функции и классы для обхода абстрактных синтаксических деревьев:19001901#### `ast.parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None)`19021903Разбирает исходный код в узел AST. Эквивалентно `compile(source, filename, mode, ast.PyCF_ONLY_AST)`.19041905Если задан `type_comments=True`, парсер изменяется, чтобы проверять и возвращать комментарии типов, как указано в [**PEP 484**](https://python-all.ru/3.11/library/ast.html) и [**PEP 526**](https://python-all.ru/3.11/library/ast.html). Это эквивалентно добавлению [`ast.PyCF_TYPE_COMMENTS`](https://python-all.ru/3.11/library/ast.html#ast.PyCF_TYPE_COMMENTS) к флагам, передаваемым в [`compile()`](https://python-all.ru/3.11/library/functions.html#compile). Это приведёт к сообщению об ошибках синтаксиса для неправильно расположенных комментариев типов. Без этого флага комментарии типов будут игнорироваться, и поле `type_comment` в выбранных узлах AST всегда будет `None`. Кроме того, расположение комментариев `# type: ignore` будет возвращаться как атрибут `type_ignores` объекта [`Module`](https://python-all.ru/3.11/library/ast.html#ast.Module) (иначе это всегда пустой список).19061907Кроме того, если `mode` равно `'func_type'`, синтаксис входных данных изменяется в соответствии с [**PEP 484**](https://python-all.ru/3.11/library/ast.html) «сигнатурными комментариями типов», например `(str, int) -> List[str]`.19081909Установка `feature_version` в кортеж `(major, minor)` приведёт к «наилучшей попытке» разбора с использованием грамматики этой версии Python. Например, установка `feature_version=(3, 9)` будет пытаться запретить разбор инструкций [`match`](https://python-all.ru/3.11/reference/compound_stmts.html#match). В настоящее время `major` должно быть равно `3`. Самая низкая поддерживаемая версия – `(3, 4)` (и это может увеличиться в будущих версиях Python); самая высокая – `sys.version_info[0:2]`. «Наилучшая попытка» означает, что нет гарантии, что разбор (или успех разбора) будет таким же, как при запуске на версии Python, соответствующей `feature_version`.19101911Если исходный код содержит нулевой символ (`\0`), возбуждается [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError).19121913> **Предупреждение**1914>1915> Обратите внимание, что успешный разбор исходного кода в объект AST не гарантирует, что предоставленный исходный код является корректным кодом Python, который можно выполнить, поскольку этап компиляции может вызывать дополнительные исключения [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError). Например, исходный код `return 42` генерирует корректный узел AST для инструкции return, но его нельзя скомпилировать отдельно (он должен находиться внутри узла функции).1916>1917> В частности, [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) не выполняет никаких проверок областей видимости, которые выполняет этап компиляции.19181919> **Предупреждение**1920>1921> Можно вызвать сбой интерпретатора Python с помощью достаточно большой/сложной строки из-за ограничений глубины стека в компиляторе AST Python.19221923Изменено в версии 3.8: Добавлены `type_comments`, `mode='func_type'` и `feature_version`.19241925#### `ast.unparse(ast_obj)`19261927Выполняет обратный разбор объекта [`ast.AST`](https://python-all.ru/3.11/library/ast.html#ast.AST) и генерирует строку с кодом, который при обратном разборе с помощью [`ast.parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse) даст эквивалентный объект [`ast.AST`](https://python-all.ru/3.11/library/ast.html#ast.AST).19281929> **Предупреждение**1930>1931> Полученная строка кода не обязательно будет равна исходному коду, который породил объект [`ast.AST`](https://python-all.ru/3.11/library/ast.html#ast.AST) (без каких-либо оптимизаций компилятора, таких как константные кортежи/frozensets).19321933> **Предупреждение**1934>1935> Попытка выполнить обратный разбор очень сложного выражения приведёт к [`RecursionError`](https://python-all.ru/3.11/library/exceptions.html#RecursionError).19361937Новое в версии 3.9.19381939#### `ast.literal_eval(node_or_string)`19401941Вычисляет узел выражения или строку, содержащую только литерал Python или отображение контейнера. Предоставленная строка или узел могут состоять только из следующих структур литералов Python: строки, байты, числа, кортежи, списки, словари, множества, булевы значения, `None` и `Ellipsis`.19421943Это можно использовать для вычисления строк, содержащих значения Python, без необходимости разбирать значения самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с операторами или индексацией.19441945Раньше эта функция документировалась как «безопасная» без определения, что это значит. Это вводило в заблуждение. Она специально разработана так, чтобы не выполнять код Python, в отличие от более общей [`eval()`](https://python-all.ru/3.11/library/functions.html#eval). Нет пространства имён, поиска имён или возможности внешних вызовов. Но она не свободна от атак: относительно небольшой ввод может привести к истощению памяти или истощению стека C, что вызовет сбой процесса. Также существует возможность отказа в обслуживании из-за чрезмерного потребления ЦП на некоторых входных данных. Поэтому вызывать её на недоверенных данных не рекомендуется.19461947> **Предупреждение**1948>1949> Можно вызвать сбой интерпретатора Python из-за ограничений глубины стека в компиляторе AST Python.1950>1951> Она может возбуждать [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), [`TypeError`](https://python-all.ru/3.11/library/exceptions.html#TypeError), [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError), [`MemoryError`](https://python-all.ru/3.11/library/exceptions.html#MemoryError) и [`RecursionError`](https://python-all.ru/3.11/library/exceptions.html#RecursionError) в зависимости от некорректного ввода.19521953Изменено в версии 3.2: Теперь допускает литералы байтов и множеств.19541955Изменено в версии 3.9: Теперь поддерживает создание пустых множеств с помощью `'set()'`.19561957Изменено в версии 3.10: Для строковых входных данных начальные пробелы и табуляции теперь удаляются.19581959#### `ast.get_docstring(node, clean=True)`19601961Возвращает строку документации для данного *узла* (который должен быть узлом [`FunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.FunctionDef), [`AsyncFunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.AsyncFunctionDef), [`ClassDef`](https://python-all.ru/3.11/library/ast.html#ast.ClassDef) или [`Module`](https://python-all.ru/3.11/library/ast.html#ast.Module)) или `None`, если у него нет строки документации. Если *clean* истинно, очищает отступы строки документации с помощью [`inspect.cleandoc()`](https://python-all.ru/3.11/library/inspect.html#inspect.cleandoc).19621963Изменено в версии 3.5: Теперь поддерживается [`AsyncFunctionDef`](https://python-all.ru/3.11/library/ast.html#ast.AsyncFunctionDef).19641965#### `ast.get_source_segment(source, node, *, padded=False)`19661967Возвращает фрагмент исходного кода из *source*, который породил узел *node*. Если не хватает информации о местоположении ([`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno), [`end_lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_lineno), [`col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.col_offset) или [`end_col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_col_offset)), возвращает `None`.19681969Если *padded* равно `True`, первая строка многострочного оператора будет дополнена пробелами, чтобы соответствовать исходной позиции.19701971Новое в версии 3.8.19721973#### `ast.fix_missing_locations(node)`19741975При компиляции дерева узлов с помощью [`compile()`](https://python-all.ru/3.11/library/functions.html#compile) компилятор ожидает атрибуты [`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno) и [`col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.col_offset) для каждого узла, который их поддерживает. Заполнять их вручную для сгенерированных узлов довольно утомительно, поэтому эта вспомогательная функция рекурсивно добавляет эти атрибуты, если их ещё нет, устанавливая их равными значениям родительского узла. Работает рекурсивно, начиная с *node*.19761977#### `ast.increment_lineno(node, n=1)`19781979Увеличивает номер строки и номер конечной строки каждого узла в дереве, начиная с *node*, на *n*. Это полезно для «перемещения кода» в другое место в файле.19801981#### `ast.copy_location(new_node, old_node)`19821983Копирует информацию о местоположении в исходном коде ([`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno), [`col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.col_offset), [`end_lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_lineno) и [`end_col_offset`](https://python-all.ru/3.11/library/ast.html#ast.AST.end_col_offset)) из *old\_node* в *new\_node*, если это возможно, и возвращает *new\_node*.19841985#### `ast.iter_fields(node)`19861987Генерирует кортеж из `(fieldname, value)` для каждого поля в `node._fields`, которое присутствует в *node*.19881989#### `ast.iter_child_nodes(node)`19901991Генерирует все непосредственные дочерние узлы *node*, то есть все поля, являющиеся узлами, и все элементы полей, являющихся списками узлов.19921993#### `ast.walk(node)`19941995Рекурсивно генерирует все узлы-потомки в дереве, начиная с *node* (включая сам *node*), в произвольном порядке. Это полезно, если требуется только изменить узлы на месте, а контекст не важен.19961997#### `class ast.NodeVisitor`19981999Базовый класс для обхода узлов, который обходит абстрактное синтаксическое дерево и вызывает функцию-посетитель для каждого найденного узла. Эта функция может вернуть значение, которое передаётся методом [`visit()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.visit).20002001Этот класс предназначен для наследования; в подклассе добавляются методы-посетители.20022003#### `visit(node)`20042005Посещает узел. Реализация по умолчанию вызывает метод `self.visit_classname`, где *classname* – имя класса узла, или [`generic_visit()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.generic_visit), если такой метод отсутствует.20062007#### `generic_visit(node)`20082009Этот посетитель вызывает [`visit()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.visit) для всех дочерних узлов.20102011Обратите внимание, что дочерние узлы тех узлов, для которых определён собственный метод-посетитель, не будут посещены, если посетитель сам не вызовет [`generic_visit()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.generic_visit) или не обойдёт их самостоятельно.20122013#### `visit_Constant(node)`20142015Обрабатывает все константные узлы.20162017Не используйте [`NodeVisitor`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor), если требуется вносить изменения в узлы во время обхода. Для этого существует специальный посетитель ([`NodeTransformer`](https://python-all.ru/3.11/library/ast.html#ast.NodeTransformer)), который допускает модификации.20182019Устарело с версии 3.8: Методы `visit_Num()`, `visit_Str()`, `visit_Bytes()`, `visit_NameConstant()` и `visit_Ellipsis()` теперь устарели и не будут вызываться в будущих версиях Python. Добавьте метод [`visit_Constant()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.visit_Constant) для обработки всех узлов-констант.20202021#### `class ast.NodeTransformer`20222023Подкласс [`NodeVisitor`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor), который обходит абстрактное синтаксическое дерево и позволяет изменять узлы.20242025Метод [`NodeTransformer`](https://python-all.ru/3.11/library/ast.html#ast.NodeTransformer) обходит AST и использует возвращаемое значение методов-посетителей для замены или удаления старого узла. Если возвращаемое значение метода-посетителя равно `None`, узел будет удалён из своего местоположения; в противном случае он заменяется возвращённым значением. Возвращённое значение может быть исходным узлом – в этом случае замена не происходит.20262027Вот пример преобразователя, который переписывает все обращения к именам (`foo`) в `data['foo']`:20282029```python2030class RewriteName(NodeTransformer):20312032    def visit_Name(self, node):2033        return Subscript(2034            value=Name(id='data', ctx=Load()),2035            slice=Constant(value=node.id),2036            ctx=node.ctx2037        )2038```20392040Имейте в виду: если у узла, с которым вы работаете, есть дочерние узлы, необходимо либо преобразовать дочерние узлы самостоятельно, либо сначала вызвать для узла метод [`generic_visit()`](https://python-all.ru/3.11/library/ast.html#ast.NodeVisitor.generic_visit).20412042Для узлов, входящих в состав набора инструкций (это относится ко всем узлам инструкций), посетитель может также возвращать список узлов, а не один узел.20432044Если [`NodeTransformer`](https://python-all.ru/3.11/library/ast.html#ast.NodeTransformer) вводит новые узлы (не входившие в исходное дерево) без указания информации о расположении (например, [`lineno`](https://python-all.ru/3.11/library/ast.html#ast.AST.lineno)), следует вызвать [`fix_missing_locations()`](https://python-all.ru/3.11/library/ast.html#ast.fix_missing_locations) для нового поддерева, чтобы пересчитать информацию о расположении:20452046```python2047tree = ast.parse('foo', mode='eval')2048new_tree = fix_missing_locations(RewriteName().visit(tree))2049```20502051Обычно преобразователь используется следующим образом:20522053```python2054node = YourTransformer().visit(node)2055```20562057#### `ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None)`20582059Возвращает форматированный дамп дерева из *node*. Это в основном полезно для отладки. Если *annotate\_fields* равно true (по умолчанию), возвращаемая строка будет показывать имена и значения полей. Если *annotate\_fields* равно false, результирующая строка будет более компактной за счёт опускания однозначных имён полей. Атрибуты, такие как номера строк и смещения столбцов, по умолчанию не выводятся. Если это нужно, *include\_attributes* можно установить в true.20602061Если *indent* – неотрицательное целое число или строка, дерево будет выведено с отступами указанного уровня. Уровень отступа 0, отрицательное значение или `""` вставляет только переводы строк. `None` (по умолчанию) выбирает однострочное представление. Положительный целочисленный отступ добавляет соответствующее количество пробелов на уровень. Если *indent* – строка (например, `"\t"`), эта строка используется для отступа каждого уровня.20622063Изменено в версии 3.9: Добавлена опция *indent*.20642065## Флаги компилятора20662067Следующие флаги могут быть переданы в [`compile()`](https://python-all.ru/3.11/library/functions.html#compile) для изменения эффектов компиляции программы:20682069#### `ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`20702071Включает поддержку `await`, `async for`, `async with` и асинхронных включений верхнего уровня.20722073Новое в версии 3.8.20742075#### `ast.PyCF_ONLY_AST`20762077Генерирует и возвращает абстрактное синтаксическое дерево вместо скомпилированного объекта кода.20782079#### `ast.PyCF_TYPE_COMMENTS`20802081Включает поддержку комментариев типов в стиле [**PEP 484**](https://python-all.ru/3.11/library/ast.html) и [**PEP 526**](https://python-all.ru/3.11/library/ast.html) (`# type: <type>`, `# type: ignore <stuff>`).20822083Новое в версии 3.8.20842085## Использование командной строки20862087Новое в версии 3.9.20882089Модуль [`ast`](https://python-all.ru/3.11/library/ast.html#module-ast) может быть выполнен как скрипт из командной строки. Это просто:20902091```sh2092python -m ast [-m <mode>] [-a] [infile]2093```20942095Принимаются следующие опции:20962097#### `-h, --help`20982099Показать справку и выйти.21002101#### `-m <mode>`21022103#### `--mode <mode>`21042105Определяет, какой вид кода должен быть скомпилирован, как аргумент *mode* в [`parse()`](https://python-all.ru/3.11/library/ast.html#ast.parse).21062107#### `--no-type-comments`21082109Не обрабатывать комментарии типов.21102111#### `-a, --include-attributes`21122113Включать атрибуты, такие как номера строк и смещения столбцов.21142115#### `-i <indent>`21162117#### `--indent <indent>`21182119Отступ узлов в AST (количество пробелов).21202121Если указан `infile`, его содержимое разбирается в AST и выводится в stdout. В противном случае содержимое читается из stdin.21222123> **См. также**2124>2125> [Green Tree Snakes](https://python-all.ru/3.11/library/ast.html) – внешний документационный ресурс, содержащий подробности работы с AST Python.2126>2127> [ASTTokens](https://python-all.ru/3.11/library/ast.html) дополняет AST Python позициями токенов и текста в исходном коде, который их породил. Это полезно для инструментов, выполняющих преобразования исходного кода.2128>2129> [leoAst.py](https://python-all.ru/3.11/library/ast.html) объединяет представления программ на Python на основе токенов и синтаксических деревьев, вставляя двусторонние связи между токенами и узлами AST.2130>2131> [LibCST](https://python-all.ru/3.11/library/ast.html) разбирает код как конкретное синтаксическое дерево, похожее на AST, и сохраняет все детали форматирования. Это полезно для создания приложений автоматического рефакторинга (codemod) и линтеров.2132>2133> [Parso](https://python-all.ru/3.11/library/ast.html) – это синтаксический анализатор Python, поддерживающий восстановление после ошибок и сквозной разбор для разных версий Python (на нескольких версиях Python). Parso также может перечислять несколько синтаксических ошибок в файле Python.2134