Spec-Zone.ru › Python 3.14

ast — Абстрактные синтаксические деревья

Исходный код: Lib/ast.py

Модуль ast помогает приложениям Python обрабатывать деревья абстрактной синтаксической грамматики Python. Сама абстрактная грамматика может меняться с каждым выпуском Python; этот модуль позволяет программно определить, как выглядит текущая грамматика.

Абстрактное синтаксическое дерево можно создать, передав ast.PyCF_ONLY_AST в качестве флага встроенной функции compile() или воспользовавшись вспомогательной функцией parse(), предоставляемой этим модулем. Результатом будет дерево объектов, классы которых наследуются от ast.AST. Абстрактное синтаксическое дерево можно скомпилировать в объект кода Python с помощью встроенной функции compile().

Абстрактная грамматика

В настоящее время абстрактная грамматика определена следующим образом:

-- ASDL's 4 builtin types are:
-- identifier, int, string, constant

module Python
{
    mod = Module(stmt* body, type_ignore* type_ignores)
        | Interactive(stmt* body)
        | Expression(expr body)
        | FunctionType(expr* argtypes, expr returns)

    stmt = FunctionDef(identifier name, arguments args,
                       stmt* body, expr* decorator_list, expr? returns,
                       string? type_comment, type_param* type_params)
          | AsyncFunctionDef(identifier name, arguments args,
                             stmt* body, expr* decorator_list, expr? returns,
                             string? type_comment, type_param* type_params)

          | ClassDef(identifier name,
             expr* bases,
             keyword* keywords,
             stmt* body,
             expr* decorator_list,
             type_param* type_params)
          | Return(expr? value)

          | Delete(expr* targets)
          | Assign(expr* targets, expr value, string? type_comment)
          | TypeAlias(expr name, type_param* type_params, expr value)
          | AugAssign(expr target, operator op, expr value)
          -- 'simple' indicates that we annotate simple name without parens
          | AnnAssign(expr target, expr annotation, expr? value, int simple)

          -- use 'orelse' because else is a keyword in target languages
          | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
          | While(expr test, stmt* body, stmt* orelse)
          | If(expr test, stmt* body, stmt* orelse)
          | With(withitem* items, stmt* body, string? type_comment)
          | AsyncWith(withitem* items, stmt* body, string? type_comment)

          | Match(expr subject, match_case* cases)

          | Raise(expr? exc, expr? cause)
          | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
          | Assert(expr test, expr? msg)

          | Import(alias* names)
          | ImportFrom(identifier? module, alias* names, int? level)

          | Global(identifier* names)
          | Nonlocal(identifier* names)
          | Expr(expr value)
          | Pass | Break | Continue

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

          -- BoolOp() can use left & right?
    expr = BoolOp(boolop op, expr* values)
         | NamedExpr(expr target, expr value)
         | BinOp(expr left, operator op, expr right)
         | UnaryOp(unaryop op, expr operand)
         | Lambda(arguments args, expr body)
         | IfExp(expr test, expr body, expr orelse)
         | Dict(expr?* keys, expr* values)
         | Set(expr* elts)
         | ListComp(expr elt, comprehension* generators)
         | SetComp(expr elt, comprehension* generators)
         | DictComp(expr key, expr value, comprehension* generators)
         | GeneratorExp(expr elt, comprehension* generators)
         -- the grammar constrains where yield expressions can occur
         | Await(expr value)
         | Yield(expr? value)
         | YieldFrom(expr value)
         -- need sequences for compare to distinguish between
         -- x < 4 < 3 and (x < 4) < 3
         | Compare(expr left, cmpop* ops, expr* comparators)
         | Call(expr func, expr* args, keyword* keywords)
         | FormattedValue(expr value, int conversion, expr? format_spec)
         | Interpolation(expr value, constant str, int conversion, expr? format_spec)
         | JoinedStr(expr* values)
         | TemplateStr(expr* values)
         | Constant(constant value, string? kind)

         -- the following expression can appear in assignment context
         | Attribute(expr value, identifier attr, expr_context ctx)
         | Subscript(expr value, expr slice, expr_context ctx)
         | Starred(expr value, expr_context ctx)
         | Name(identifier id, expr_context ctx)
         | List(expr* elts, expr_context ctx)
         | Tuple(expr* elts, expr_context ctx)

         -- can appear only in Subscript
         | Slice(expr? lower, expr? upper, expr? step)

          -- col_offset is the byte offset in the utf8 string the parser uses
          attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    expr_context = Load | Store | Del

    boolop = And | Or

    operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift
                 | RShift | BitOr | BitXor | BitAnd | FloorDiv

    unaryop = Invert | Not | UAdd | USub

    cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn

    comprehension = (expr target, expr iter, expr* ifs, int is_async)

    excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
                    attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,
                 expr?* kw_defaults, arg? kwarg, expr* defaults)

    arg = (identifier arg, expr? annotation, string? type_comment)
           attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- keyword arguments supplied to call (NULL identifier for **kwargs)
    keyword = (identifier? arg, expr value)
               attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    -- import name with optional 'as' alias.
    alias = (identifier name, identifier? asname)
             attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

    withitem = (expr context_expr, expr? optional_vars)

    match_case = (pattern pattern, expr? guard, stmt* body)

    pattern = MatchValue(expr value)
            | MatchSingleton(constant value)
            | MatchSequence(pattern* patterns)
            | MatchMapping(expr* keys, pattern* patterns, identifier? rest)
            | MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)

            | MatchStar(identifier? name)
            -- The optional "rest" MatchMapping parameter handles capturing extra mapping keys

            | MatchAs(pattern? pattern, identifier? name)
            | MatchOr(pattern* patterns)

             attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)

    type_ignore = TypeIgnore(int lineno, string tag)

    type_param = TypeVar(identifier name, expr? bound, expr? default_value)
               | ParamSpec(identifier name, expr? default_value)
               | TypeVarTuple(identifier name, expr? default_value)
               attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
}

Классы узлов

class ast.AST

Это базовый класс всех классов узлов AST. Фактические классы узлов являются производными от файла Parser/Python.asdl, который воспроизведён выше. Они определены в модуле C _ast и повторно экспортированы в ast.

Для каждого символа в левой части абстрактной грамматики определён отдельный класс (например, ast.stmt или ast.expr). Кроме того, для каждой конструкции в правой части определён отдельный класс; эти классы наследуются от классов деревьев в левой части. Например, ast.BinOp наследуется от ast.expr. Для правил продукции с альтернативами (так называемых «сумм») класс левой части является абстрактным: создаются только экземпляры конкретных узлов-конструкторов.

_fields

У каждого конкретного класса есть атрибут _fields, содержащий имена всех дочерних узлов.

У каждого экземпляра конкретного класса есть по одному атрибуту для каждого дочернего узла, тип которого определён в грамматике. Например, у экземпляров ast.BinOp есть атрибут left типа ast.expr.

Если эти атрибуты помечены в грамматике как необязательные (с помощью вопросительного знака), их значение может быть None. Если атрибуты могут содержать ноль или более значений (помечены звёздочкой), значения представляются в виде списков Python. При компиляции AST с помощью compile() должны присутствовать все возможные атрибуты и иметь допустимые значения.

_field_types

Атрибут _field_types каждого конкретного класса — это словарь, сопоставляющий имена полей (перечисленные также в _fields) с их типами.

>>> ast.TypeVar._field_types
{'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None}

Добавлено в версии 3.13.

lineno
col_offset
end_lineno
end_col_offset

Экземпляры подклассов ast.expr и ast.stmt имеют атрибуты lineno, col_offset, end_lineno и end_col_offset. Атрибуты lineno и end_lineno — это номера первой и последней строк фрагмента исходного текста (нумерация начинается с 1), а col_offset и end_col_offset — соответствующие смещения в байтах UTF-8 для первого и последнего токенов, из которых был создан узел. Смещение UTF-8 записывается потому, что синтаксический анализатор использует UTF-8 внутри.

Обратите внимание, что компилятору не требуются конечные позиции, поэтому они необязательны. Конечное смещение указывает на позицию после последнего символа; например, с помощью source_line[node.col_offset : node.end_col_offset] можно получить исходный фрагмент для узла однострочного выражения.

Конструктор класса ast.T обрабатывает свои аргументы следующим образом:

  • Если переданы позиционные аргументы, их число должно совпадать с числом элементов в T._fields; они будут присвоены в качестве атрибутов с соответствующими именами.
  • Если переданы именованные аргументы, они установят атрибуты с такими же именами в указанные значения.

Например, чтобы создать и заполнить узел ast.UnaryOp, можно использовать

node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),
                   lineno=0, col_offset=0)

Если при создании опущено поле, являющееся необязательным в грамматике, по умолчанию ему присваивается None. Если опущено поле-список, по умолчанию ему присваивается пустой список. Если опущено поле типа ast.expr_context, по умолчанию ему присваивается Load(). Если опущено любое другое поле, возбуждается исключение DeprecationWarning, и у узла AST не будет этого поля. В Python 3.15 это условие приведёт к ошибке.

Изменено в версии 3.8: Теперь для всех констант используется класс ast.Constant.

Изменено в версии 3.9: Простые индексы представлены своими значениями, расширенные срезы — кортежами.

Изменено в версии 3.13: Конструкторы узлов AST были изменены: для опущенных полей теперь задаются разумные значения по умолчанию. Для необязательных полей значением по умолчанию теперь является None, для полей-списков — пустой список, а для полей типа ast.expr_context — Load(). Ранее опущенные атрибуты не существовали у созданных узлов (при обращении к ним возбуждалось исключение AttributeError).

Изменено в версии 3.14: В выводе __repr__() для узлов AST теперь отображаются значения полей узла.

Устарело с версии 3.8, удалено в версии 3.14: В предыдущих версиях Python предоставлялись классы AST ast.Num, ast.Str, ast.Bytes, ast.NameConstant и ast.Ellipsis, объявленные устаревшими в Python 3.8. Эти классы удалены в Python 3.14, а их функциональность заменена классом ast.Constant.

Устарело с версии 3.9: Старые классы ast.Index и ast.ExtSlice по-прежнему доступны, но будут удалены в будущих выпусках Python. Пока что создание их экземпляров возвращает экземпляр другого класса.

Устарело с версии 3.13, будет удалено в версии 3.15: В предыдущих версиях Python разрешалось создавать узлы AST без обязательных полей. Аналогично, конструкторы узлов AST принимали произвольные именованные аргументы, которые задавались как атрибуты узла AST, даже если они не соответствовали ни одному из его полей. Такое поведение объявлено устаревшим и будет удалено в Python 3.15.

Примечание

Описания конкретных классов узлов, представленные здесь, изначально были адаптированы из замечательного проекта Green Tree Snakes и материалов всех его участников.

Корневые узлы

class ast.Module(body, type_ignores)

Модуль Python, соответствующий вводу из файла. Тип узла, создаваемый функцией ast.parse() в режиме "exec" по умолчанию.

body — это list операторов модуля (Statements).

type_ignores — это list комментариев модуля, игнорирующих типы; подробности см. в описании ast.parse().

>>> print(ast.dump(ast.parse('x = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))])
class ast.Expression(body)

Одно входное выражение Python. Тип узла, создаваемый функцией ast.parse(), если mode равен "eval".

body — это отдельный узел одного из типов выражений.

>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
class ast.Interactive(body)

Один интерактивный ввод, как в интерактивном режиме. Тип узла, создаваемый функцией ast.parse(), если mode равен "single".

body — это list узлов операторов.

>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4))
Interactive(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1)),
        Assign(
            targets=[
                Name(id='y', ctx=Store())],
            value=Constant(value=2))])
class ast.FunctionType(argtypes, returns)

Представление комментариев старого формата с типами для функций, поскольку версии Python до 3.5 не поддерживали аннотации PEP 484. Тип узла, создаваемый функцией ast.parse(), если mode равен "func_type".

Такие комментарии с типами выглядели бы следующим образом:

def sum_two_number(a, b):
    # type: (int, int) -> int
    return a + b

argtypes — это list узлов выражений.

returns — это отдельный узел выражения.

>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))
FunctionType(
    argtypes=[
        Name(id='int', ctx=Load()),
        Name(id='str', ctx=Load())],
    returns=Subscript(
        value=Name(id='List', ctx=Load()),
        slice=Name(id='int', ctx=Load()),
        ctx=Load()))

Добавлено в версии 3.8.

Литералы

class ast.Constant(value, kind)

Постоянное значение. Атрибут value литерала Constant содержит представляемый им объект Python. Представленными значениями могут быть экземпляры str, bytes, int, float, complex и bool, а также константы None и Ellipsis.

Атрибут kind — необязательная строка. Для строковых литералов с префиксом u атрибуту kind присваивается значение 'u'. Для всех остальных констант kind имеет значение None.

>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
Expression(
    body=Constant(value=123))
>>> print(ast.dump(ast.parse("u'hello'", mode='eval'), indent=4))
Expression(
    body=Constant(value='hello', kind='u'))
class ast.FormattedValue(value, conversion, format_spec)

Узел, представляющий отдельное поле форматирования в f-строке. Если строка содержит только одно поле форматирования, узел может быть отдельным; в противном случае он входит в JoinedStr.

  • value — это любой узел выражения (например, литерал, переменная или вызов функции).
  • conversion — целое число:

    • -1: без форматирования
    • 97 (ord('a')): форматирование !a ASCII
    • 114 (ord('r')): форматирование !r repr()
    • 115 (ord('s')): форматирование !s string
  • format_spec — это узел JoinedStr, представляющий форматирование значения, или None, если формат не указан. conversion и format_spec могут быть заданы одновременно.
class ast.JoinedStr(values)

f-строка, состоящая из последовательности узлов FormattedValue и Constant.

>>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4))
Expression(
    body=JoinedStr(
        values=[
            Constant(value='sin('),
            FormattedValue(
                value=Name(id='a', ctx=Load()),
                conversion=-1),
            Constant(value=') is '),
            FormattedValue(
                value=Call(
                    func=Name(id='sin', ctx=Load()),
                    args=[
                        Name(id='a', ctx=Load())]),
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='.3')]))]))
class ast.TemplateStr(values, /)

Добавлено в версии 3.14.

Узел, представляющий строковый литерал-шаблон, состоящий из последовательности узлов Interpolation и Constant. Эти узлы могут располагаться в любом порядке и не обязательно должны чередоваться.

>>> expr = ast.parse('t"{name} finished {place:ordinal}"', mode='eval')
>>> print(ast.dump(expr, indent=4))
Expression(
    body=TemplateStr(
        values=[
            Interpolation(
                value=Name(id='name', ctx=Load()),
                str='name',
                conversion=-1),
            Constant(value=' finished '),
            Interpolation(
                value=Name(id='place', ctx=Load()),
                str='place',
                conversion=-1,
                format_spec=JoinedStr(
                    values=[
                        Constant(value='ordinal')]))]))
class ast.Interpolation(value, str, conversion, format_spec=None)

Добавлено в версии 3.14.

Узел, представляющий отдельное поле интерполяции в строковом литерале-шаблоне.

  • value — это любой узел выражения (например, литерал, переменная или вызов функции). Он имеет тот же смысл, что и FormattedValue.value.
  • str — это константа, содержащая текст выражения интерполяции.

    Если str имеет значение None, при вызове ast.unparse() для создания кода используется value. В этом случае больше не гарантируется, что сгенерированный код будет идентичен исходному; эта возможность предназначена для генерации кода.

  • conversion — целое число:

    • -1: без преобразования
    • 97 (ord('a')): преобразование !a ASCII
    • 114 (ord('r')): преобразование !r repr()
    • 115 (ord('s')): преобразование !s string

    Он имеет тот же смысл, что и FormattedValue.conversion.

  • format_spec — это узел JoinedStr, представляющий форматирование значения, или None, если формат не указан. conversion и format_spec могут быть заданы одновременно. Этот атрибут имеет тот же смысл, что и FormattedValue.format_spec.
class ast.List(elts, ctx)
class ast.Tuple(elts, ctx)

Список или кортеж. elts содержит список узлов, представляющих элементы. ctx имеет значение Store, если контейнер является целью присваивания (то есть (x,y)=something), и Load в противном случае.

>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4))
Expression(
    body=List(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))
Expression(
    body=Tuple(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)],
        ctx=Load()))
class ast.Set(elts)

Множество. elts содержит список узлов, представляющих элементы множества.

>>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4))
Expression(
    body=Set(
        elts=[
            Constant(value=1),
            Constant(value=2),
            Constant(value=3)]))
class ast.Dict(keys, values)

Словарь. keys и values содержат списки узлов, представляющих ключи и значения соответственно, в соответствующем друг другу порядке (как и при вызове dictionary.keys() и dictionary.values()).

При распаковке словаря с помощью литералов словарей выражение для распаковки помещается в список values, а в соответствующей позиции списка keys указывается None.

>>> print(ast.dump(ast.parse('{"a":1, **d}', mode='eval'), indent=4))
Expression(
    body=Dict(
        keys=[
            Constant(value='a'),
            None],
        values=[
            Constant(value=1),
            Name(id='d', ctx=Load())]))

Переменные

class ast.Name(id, ctx)

Имя переменной. id содержит имя в виде строки, а ctx имеет один из следующих типов.

class ast.Load
class ast.Store
class ast.Del

Ссылки на переменные могут использоваться для получения значения переменной, присваивания ей нового значения или удаления её. Чтобы различать эти случаи, ссылкам на переменные задаётся контекст.

>>> print(ast.dump(ast.parse('a'), indent=4))
Module(
    body=[
        Expr(
            value=Name(id='a', ctx=Load()))])

>>> print(ast.dump(ast.parse('a = 1'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('del a'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='a', ctx=Del())])])
class ast.Starred(value, ctx)

Ссылка на переменную *var. value содержит переменную, обычно узел Name. Этот тип необходимо использовать при создании узла Call с *args.

>>> print(ast.dump(ast.parse('a, *b = it'), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Starred(
                            value=Name(id='b', ctx=Store()),
                            ctx=Store())],
                    ctx=Store())],
            value=Name(id='it', ctx=Load()))])

Выражения

class ast.Expr(value)

Если выражение, например вызов функции, появляется как отдельная инструкция, а его возвращаемое значение не используется и не сохраняется, оно оборачивается в этот контейнер. value содержит один из других узлов этого раздела: Constant, Name, Lambda, Yield или YieldFrom.

>>> print(ast.dump(ast.parse('-a'), indent=4))
Module(
    body=[
        Expr(
            value=UnaryOp(
                op=USub(),
                operand=Name(id='a', ctx=Load())))])
class ast.UnaryOp(op, operand)

Унарная операция. op — оператор, а operand — любой узел выражения.

class ast.UAdd
class ast.USub
class ast.Not
class ast.Invert

Токены унарных операторов. Not — ключевое слово not, Invert — оператор ~.

>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))
Expression(
    body=UnaryOp(
        op=Not(),
        operand=Name(id='x', ctx=Load())))
class ast.BinOp(left, op, right)

Бинарная операция (например, сложение или деление). op — оператор, а left и right — любые узлы выражения.

>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))
Expression(
    body=BinOp(
        left=Name(id='x', ctx=Load()),
        op=Add(),
        right=Name(id='y', ctx=Load())))
class ast.Add
class ast.Sub
class ast.Mult
class ast.Div
class ast.FloorDiv
class ast.Mod
class ast.Pow
class ast.LShift
class ast.RShift
class ast.BitOr
class ast.BitXor
class ast.BitAnd
class ast.MatMult

Токены бинарных операторов.

class ast.BoolOp(op, values)

Логическая операция «or» или «and». op — это Or или And. values — участвующие в операции значения. Последовательные операции с одним и тем же оператором, например a or b or c, объединяются в один узел с несколькими значениями.

Сюда не входит not, который является UnaryOp.

>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4))
Expression(
    body=BoolOp(
        op=Or(),
        values=[
            Name(id='x', ctx=Load()),
            Name(id='y', ctx=Load())]))
class ast.And
class ast.Or

Токены логических операторов.

class ast.Compare(left, ops, comparators)

Сравнение двух или более значений. left — первое значение в сравнении, ops — список операторов, а comparators — список значений после первого элемента сравнения.

>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4))
Expression(
    body=Compare(
        left=Constant(value=1),
        ops=[
            LtE(),
            Lt()],
        comparators=[
            Name(id='a', ctx=Load()),
            Constant(value=10)]))
class ast.Eq
class ast.NotEq
class ast.Lt
class ast.LtE
class ast.Gt
class ast.GtE
class ast.Is
class ast.IsNot
class ast.In
class ast.NotIn

Токены операторов сравнения.

class ast.Call(func, args, keywords)

Вызов функции. func — функция, которой часто является объект Name или Attribute. Аргументы:

  • args содержит список аргументов, переданных позиционно.
  • keywords содержит список объектов keyword, представляющих аргументы, переданные по ключевому слову.

Аргументы args и keywords необязательны и по умолчанию являются пустыми списками.

>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))
Expression(
    body=Call(
        func=Name(id='func', ctx=Load()),
        args=[
            Name(id='a', ctx=Load()),
            Starred(
                value=Name(id='d', ctx=Load()),
                ctx=Load())],
        keywords=[
            keyword(
                arg='b',
                value=Name(id='c', ctx=Load())),
            keyword(
                value=Name(id='e', ctx=Load()))]))
class ast.keyword(arg, value)

Аргумент, переданный по ключевому слову, при вызове функции или определении класса. arg — исходная строка с именем параметра, value — узел, передаваемый в качестве значения.

class ast.IfExp(test, body, orelse)

Выражение, например a if b else c. Каждое поле содержит один узел, поэтому в следующем примере все три узла являются узлами Name.

>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))
Expression(
    body=IfExp(
        test=Name(id='b', ctx=Load()),
        body=Name(id='a', ctx=Load()),
        orelse=Name(id='c', ctx=Load())))
class ast.Attribute(value, attr, ctx)

Доступ к атрибуту, например d.keys. value — узел, обычно Name. attr — обычная строка с именем атрибута, а ctx — Load, Store или Del в зависимости от того, как используется атрибут.

>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))
Expression(
    body=Attribute(
        value=Name(id='snake', ctx=Load()),
        attr='colour',
        ctx=Load()))
class ast.NamedExpr(target, value)

Именованное выражение. Этот узел AST создаётся оператором выражений присваивания (также известным как оператор-морж). В отличие от узла Assign, у которого первый аргумент может содержать несколько узлов, здесь и target, и value должны быть одиночными узлами.

>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))
Expression(
    body=NamedExpr(
        target=Name(id='x', ctx=Store()),
        value=Constant(value=4)))

Добавлено в версии 3.8.

Индексация

class ast.Subscript(value, slice, ctx)

Индексация, например l[1]. value — индексируемый объект (обычно последовательность или отображение). slice — индекс, срез или ключ. Это может быть Tuple, содержащий Slice. ctx — Load, Store или Del в зависимости от действия, выполняемого с индексом.

>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Tuple(
            elts=[
                Slice(
                    lower=Constant(value=1),
                    upper=Constant(value=2)),
                Constant(value=3)],
            ctx=Load()),
        ctx=Load()))
class ast.Slice(lower, upper, step)

Обычный срез (в форме lower:upper или lower:upper:step). Может встречаться только в поле slice узла Subscript — напрямую или как элемент Tuple.

>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))
Expression(
    body=Subscript(
        value=Name(id='l', ctx=Load()),
        slice=Slice(
            lower=Constant(value=1),
            upper=Constant(value=2)),
        ctx=Load()))

Генераторы коллекций

class ast.ListComp(elt, generators)
class ast.SetComp(elt, generators)
class ast.GeneratorExp(elt, generators)
class ast.DictComp(key, value, generators)

Генераторы списков и множеств, генераторные выражения и генераторы словарей. elt (или key и value) — одиночный узел, представляющий часть, вычисляемую для каждого элемента.

generators — список узлов comprehension.

>>> print(ast.dump(
...     ast.parse('[x for x in numbers]', mode='eval'),
...     indent=4,
... ))
Expression(
    body=ListComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('{x: x**2 for x in numbers}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=DictComp(
        key=Name(id='x', ctx=Load()),
        value=BinOp(
            left=Name(id='x', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
>>> print(ast.dump(
...     ast.parse('{x for x in numbers}', mode='eval'),
...     indent=4,
... ))
Expression(
    body=SetComp(
        elt=Name(id='x', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='x', ctx=Store()),
                iter=Name(id='numbers', ctx=Load()),
                is_async=0)]))
class ast.comprehension(target, iter, ifs, is_async)

Одно предложение for в генераторе коллекции. target — ссылка, используемая для каждого элемента, обычно узел Name или Tuple. iter — объект для перебора. ifs — список выражений проверки: каждое предложение for может содержать несколько ifs.

is_async указывает, что генератор коллекции является асинхронным (использует async for вместо for). Значение — целое число (0 или 1).

>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'),
...                indent=4)) # Multiple comprehensions in one.
Expression(
    body=ListComp(
        elt=Call(
            func=Name(id='ord', ctx=Load()),
            args=[
                Name(id='c', ctx=Load())]),
        generators=[
            comprehension(
                target=Name(id='line', ctx=Store()),
                iter=Name(id='file', ctx=Load()),
                is_async=0),
            comprehension(
                target=Name(id='c', ctx=Store()),
                iter=Name(id='line', ctx=Load()),
                is_async=0)]))

>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),
...                indent=4)) # generator comprehension
Expression(
    body=GeneratorExp(
        elt=BinOp(
            left=Name(id='n', ctx=Load()),
            op=Pow(),
            right=Constant(value=2)),
        generators=[
            comprehension(
                target=Name(id='n', ctx=Store()),
                iter=Name(id='it', ctx=Load()),
                ifs=[
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    Compare(
                        left=Name(id='n', ctx=Load()),
                        ops=[
                            Lt()],
                        comparators=[
                            Constant(value=10)])],
                is_async=0)]))

>>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'),
...                indent=4)) # Async comprehension
Expression(
    body=ListComp(
        elt=Name(id='i', ctx=Load()),
        generators=[
            comprehension(
                target=Name(id='i', ctx=Store()),
                iter=Name(id='soc', ctx=Load()),
                is_async=1)]))

Инструкции

class ast.Assign(targets, value, type_comment)

Присваивание. targets — список узлов, а value — одиночный узел.

Несколько узлов в targets означают присваивание одного и того же значения каждому из них. Распаковка представляется помещением Tuple или List в targets.

type_comment

type_comment — необязательная строка с аннотацией типа в виде комментария.

>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment
Module(
    body=[
        Assign(
            targets=[
                Name(id='a', ctx=Store()),
                Name(id='b', ctx=Store())],
            value=Constant(value=1))])

>>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking
Module(
    body=[
        Assign(
            targets=[
                Tuple(
                    elts=[
                        Name(id='a', ctx=Store()),
                        Name(id='b', ctx=Store())],
                    ctx=Store())],
            value=Name(id='c', ctx=Load()))])
class ast.AnnAssign(target, annotation, value, simple)

Присваивание с аннотацией типа. target — одиночный узел: это может быть Name, Attribute или Subscript. annotation — аннотация, например Constant или узел Name. value — один необязательный узел.

simple всегда равно 0 (что указывает на «сложную» цель) или 1 (что указывает на «простую» цель). «Простая» цель состоит только из узла Name, не заключённого в скобки; все остальные цели считаются сложными. Только простые цели появляются в словаре __annotations__ модулей и классов.

>>> print(ast.dump(ast.parse('c: int'), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='c', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=1)])

>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis
Module(
    body=[
        AnnAssign(
            target=Name(id='a', ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            value=Constant(value=1),
            simple=0)])

>>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation
Module(
    body=[
        AnnAssign(
            target=Attribute(
                value=Name(id='a', ctx=Load()),
                attr='b',
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])

>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation
Module(
    body=[
        AnnAssign(
            target=Subscript(
                value=Name(id='a', ctx=Load()),
                slice=Constant(value=1),
                ctx=Store()),
            annotation=Name(id='int', ctx=Load()),
            simple=0)])
class ast.AugAssign(target, op, value)

Расширенное присваивание, например a += 1. В следующем примере target — узел Name для x (с контекстом Store), op — Add, а value — Constant со значением 1.

Атрибут target не может быть узлом класса Tuple или List, в отличие от целей Assign.

>>> print(ast.dump(ast.parse('x += 2'), indent=4))
Module(
    body=[
        AugAssign(
            target=Name(id='x', ctx=Store()),
            op=Add(),
            value=Constant(value=2))])
class ast.Raise(exc, cause)

Инструкция raise. exc — объект исключения, которое нужно вызвать, обычно Call или Name, либо None для отдельной инструкции raise. cause — необязательная часть для y в raise x from y.

>>> print(ast.dump(ast.parse('raise x from y'), indent=4))
Module(
    body=[
        Raise(
            exc=Name(id='x', ctx=Load()),
            cause=Name(id='y', ctx=Load()))])
class ast.Assert(test, msg)

Утверждение. test содержит условие, например узел Compare. msg содержит сообщение об ошибке.

>>> print(ast.dump(ast.parse('assert x,y'), indent=4))
Module(
    body=[
        Assert(
            test=Name(id='x', ctx=Load()),
            msg=Name(id='y', ctx=Load()))])
class ast.Delete(targets)

Представляет инструкцию del. targets — список узлов, например Name, Attribute или Subscript.

>>> print(ast.dump(ast.parse('del x,y,z'), indent=4))
Module(
    body=[
        Delete(
            targets=[
                Name(id='x', ctx=Del()),
                Name(id='y', ctx=Del()),
                Name(id='z', ctx=Del())])])
class ast.Pass

Инструкция pass.

>>> print(ast.dump(ast.parse('pass'), indent=4))
Module(
    body=[
        Pass()])
class ast.TypeAlias(name, type_params, value)

Псевдоним типа, созданный с помощью инструкции type. name — имя псевдонима, type_params — список параметров типа, а value — значение псевдонима типа.

>>> print(ast.dump(ast.parse('type Alias = int'), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            value=Name(id='int', ctx=Load()))])

Добавлено в версии 3.12.

Другие инструкции, применимые только внутри функций или циклов, описаны в других разделах.

Импорт

class ast.Import(names)

Инструкция импорта. names — список узлов alias.

>>> print(ast.dump(ast.parse('import x,y,z'), indent=4))
Module(
    body=[
        Import(
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')])])
class ast.ImportFrom(module, names, level)

Представляет from x import y. module — исходная строка с именем после «from» без начальных точек либо None для таких инструкций, как from . import foo. level — целое число, задающее уровень относительного импорта (0 означает абсолютный импорт).

>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4))
Module(
    body=[
        ImportFrom(
            module='y',
            names=[
                alias(name='x'),
                alias(name='y'),
                alias(name='z')],
            level=0)])
class ast.alias(name, asname)

Оба параметра — исходные строки с именами. asname может быть равен None, если следует использовать обычное имя.

>>> print(ast.dump(ast.parse('from ..foo.bar import a as b, c'), indent=4))
Module(
    body=[
        ImportFrom(
            module='foo.bar',
            names=[
                alias(name='a', asname='b'),
                alias(name='c')],
            level=2)])

Поток управления

Примечание

Необязательные блоки, например else, представлены пустым списком, если они отсутствуют.

class ast.If(test, body, orelse)

Инструкция if. test содержит один узел, например узел Compare. body и orelse содержат списки узлов.

Блоки elif не имеют в AST специального представления, а представлены дополнительными узлами If в разделе orelse предыдущего блока.

>>> print(ast.dump(ast.parse("""
... if x:
...    ...
... elif y:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        If(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                If(
                    test=Name(id='y', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))],
                    orelse=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])
class ast.For(target, iter, body, orelse, type_comment)

Цикл for. target содержит переменные, которым цикл присваивает значения, в виде одного узла Name, Tuple, List, Attribute или Subscript. iter содержит перебираемый элемент, также в виде одного узла. body и orelse содержат списки узлов для выполнения. Узлы в orelse выполняются, если цикл завершается обычным образом, а не с помощью инструкции break.

type_comment

type_comment — необязательная строка с аннотацией типа в виде комментария.

>>> print(ast.dump(ast.parse("""
... for x in y:
...     ...
... else:
...     ...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='x', ctx=Store()),
            iter=Name(id='y', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
class ast.While(test, body, orelse)

Цикл while. test содержит условие, например узел Compare.

>>> print(ast.dump(ast.parse("""
... while x:
...    ...
... else:
...    ...
... """), indent=4))
Module(
    body=[
        While(
            test=Name(id='x', ctx=Load()),
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))])])
class ast.Break
class ast.Continue

Инструкции break и continue.

>>> print(ast.dump(ast.parse("""\
... for a in b:
...     if a > 5:
...         break
...     else:
...         continue
...
... """), indent=4))
Module(
    body=[
        For(
            target=Name(id='a', ctx=Store()),
            iter=Name(id='b', ctx=Load()),
            body=[
                If(
                    test=Compare(
                        left=Name(id='a', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=5)]),
                    body=[
                        Break()],
                    orelse=[
                        Continue()])])])
class ast.Try(body, handlers, orelse, finalbody)

Блоки try. Все атрибуты содержат списки узлов для выполнения, за исключением handlers, который является списком узлов ExceptHandler.

>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except Exception:
...    ...
... except OtherException as e:
...    ...
... else:
...    ...
... finally:
...    ...
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                ExceptHandler(
                    type=Name(id='OtherException', ctx=Load()),
                    name='e',
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])],
            orelse=[
                Expr(
                    value=Constant(value=Ellipsis))],
            finalbody=[
                Expr(
                    value=Constant(value=Ellipsis))])])
class ast.TryStar(body, handlers, orelse, finalbody)

Блоки try, за которыми следуют блоки except*. Атрибуты такие же, как у Try, но узлы ExceptHandler в handlers интерпретируются как блоки except*, а не как except.

>>> print(ast.dump(ast.parse("""
... try:
...    ...
... except* Exception:
...    ...
... """), indent=4))
Module(
    body=[
        TryStar(
            body=[
                Expr(
                    value=Constant(value=Ellipsis))],
            handlers=[
                ExceptHandler(
                    type=Name(id='Exception', ctx=Load()),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.11.

class ast.ExceptHandler(type, name, body)

Одно предложение except. type — тип перехватываемого исключения, обычно узел Name (или None для универсального предложения except:). name — исходная строка для имени, в которое будет помещено исключение, либо None, если в предложении отсутствует as foo. body — список узлов.

>>> print(ast.dump(ast.parse("""\
... try:
...     a + 1
... except TypeError:
...     pass
... """), indent=4))
Module(
    body=[
        Try(
            body=[
                Expr(
                    value=BinOp(
                        left=Name(id='a', ctx=Load()),
                        op=Add(),
                        right=Constant(value=1)))],
            handlers=[
                ExceptHandler(
                    type=Name(id='TypeError', ctx=Load()),
                    body=[
                        Pass()])])])
class ast.With(items, body, type_comment)

Блок with. items — список узлов withitem, представляющих менеджеры контекста, а body — блок с отступом внутри контекста.

type_comment

type_comment — необязательная строка с аннотацией типа в виде комментария.

class ast.withitem(context_expr, optional_vars)

Один менеджер контекста в блоке with. context_expr — менеджер контекста, часто узел Call. optional_vars — Name, Tuple или List для части as foo либо None, если она не используется.

>>> print(ast.dump(ast.parse("""\
... with a as b, c as d:
...    something(b, d)
... """), indent=4))
Module(
    body=[
        With(
            items=[
                withitem(
                    context_expr=Name(id='a', ctx=Load()),
                    optional_vars=Name(id='b', ctx=Store())),
                withitem(
                    context_expr=Name(id='c', ctx=Load()),
                    optional_vars=Name(id='d', ctx=Store()))],
            body=[
                Expr(
                    value=Call(
                        func=Name(id='something', ctx=Load()),
                        args=[
                            Name(id='b', ctx=Load()),
                            Name(id='d', ctx=Load())]))])])

Сопоставление с образцом

class ast.Match(subject, cases)

Инструкция match. subject содержит объект сопоставления (объект, с которым сопоставляются варианты), а cases содержит итерируемый объект с узлами match_case для разных вариантов.

Добавлено в версии 3.10.

class ast.match_case(pattern, guard, body)

Отдельный вариант сопоставления с образцом в инструкции match. pattern содержит шаблон сопоставления, с которым будет сопоставляться объект. Обратите внимание, что узлы AST, создаваемые для шаблонов, отличаются от узлов, создаваемых для выражений, даже если у них одинаковый синтаксис.

Атрибут guard содержит выражение, которое будет вычислено, если шаблон соответствует объекту.

body содержит список узлов, которые нужно выполнить, если шаблон соответствует объекту, а результат вычисления выражения-охранника равен True.

>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] if x>0:
...         ...
...     case tuple():
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchAs(name='x')]),
                    guard=Compare(
                        left=Name(id='x', ctx=Load()),
                        ops=[
                            Gt()],
                        comparators=[
                            Constant(value=0)]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='tuple', ctx=Load())),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchValue(value)

Шаблон сопоставления с литералом или значением, сравниваемым на равенство. value — это узел выражения. Допустимые узлы значений ограничены, как описано в документации по инструкции сопоставления. Этот шаблон срабатывает, если объект сопоставления равен вычисленному значению.

>>> print(ast.dump(ast.parse("""
... match x:
...     case "Relevant":
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchValue(
                        value=Constant(value='Relevant')),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchSingleton(value)

Шаблон сопоставления с литералом, сравниваемым по идентичности. value — это одиночный объект, с которым выполняется сравнение: None, True или False. Этот шаблон срабатывает, если объект сопоставления является указанной константой.

>>> print(ast.dump(ast.parse("""
... match x:
...     case None:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSingleton(value=None),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchSequence(patterns)

Шаблон сопоставления с последовательностью. patterns содержит шаблоны для сопоставления с элементами объекта, если объект является последовательностью. Сопоставляется с последовательностью переменной длины, если один из вложенных шаблонов является узлом MatchStar, в противном случае — с последовательностью фиксированной длины.

>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchStar(name)

Сопоставляет остаток последовательности в шаблоне сопоставления с последовательностью переменной длины. Если name не является None, имя связывается со списком оставшихся элементов последовательности, если шаблон последовательности в целом успешно сопоставлен.

>>> print(ast.dump(ast.parse("""
... match x:
...     case [1, 2, *rest]:
...         ...
...     case [*_]:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchValue(
                                value=Constant(value=1)),
                            MatchValue(
                                value=Constant(value=2)),
                            MatchStar(name='rest')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchSequence(
                        patterns=[
                            MatchStar()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchMapping(keys, patterns, rest)

Шаблон сопоставления со словарём. keys — это последовательность узлов выражений. patterns — соответствующая последовательность узлов шаблонов. rest — необязательное имя, которое можно указать для захвата оставшихся элементов словаря. Допустимые ключевые выражения ограничены, как описано в документации по инструкции сопоставления.

Этот шаблон срабатывает, если объект является словарём, все вычисленные ключевые выражения присутствуют в словаре, а значение, соответствующее каждому ключу, совпадает с соответствующим вложенным шаблоном. Если rest не является None, имя связывается со словарём, содержащим оставшиеся элементы, если шаблон словаря в целом успешно сопоставлен.

>>> print(ast.dump(ast.parse("""
... match x:
...     case {1: _, 2: _}:
...         ...
...     case {**rest}:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchMapping(
                        keys=[
                            Constant(value=1),
                            Constant(value=2)],
                        patterns=[
                            MatchAs(),
                            MatchAs()]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchMapping(rest='rest'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)

Шаблон сопоставления с классом. cls — это выражение, задающее класс, с которым выполняется сопоставление. patterns — последовательность узлов шаблонов для сопоставления с атрибутами, определёнными в классе, в соответствии с последовательностью сопоставления с образцом. kwd_attrs — последовательность дополнительных атрибутов для сопоставления (задаваемых как ключевые аргументы в шаблоне класса), а kwd_patterns — соответствующие шаблоны (задаваемые как значения ключевых аргументов в шаблоне класса).

Этот шаблон срабатывает, если объект является экземпляром указанного класса, все позиционные шаблоны соответствуют соответствующим атрибутам, определённым в классе, а все заданные именованные атрибуты соответствуют своим шаблонам.

Примечание: классы могут определять свойство, возвращающее self, чтобы сопоставить узел шаблона с проверяемым экземпляром. Так же сопоставляются и некоторые встроенные типы, как описано в документации по инструкции сопоставления.

>>> print(ast.dump(ast.parse("""
... match x:
...     case Point2D(0, 0):
...         ...
...     case Point3D(x=0, y=0, z=0):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point2D', ctx=Load()),
                        patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchClass(
                        cls=Name(id='Point3D', ctx=Load()),
                        kwd_attrs=[
                            'x',
                            'y',
                            'z'],
                        kwd_patterns=[
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0)),
                            MatchValue(
                                value=Constant(value=0))]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchAs(pattern, name)

Шаблон сопоставления «as», шаблон захвата или шаблон-заполнитель. pattern содержит шаблон сопоставления, с которым будет сопоставляться объект. Если шаблон — None, узел представляет шаблон захвата (то есть имя без дополнительных элементов) и всегда срабатывает.

Атрибут name содержит имя, которое будет связано, если шаблон успешно сопоставлен. Если name — None, то pattern также должно быть None, и узел представляет шаблон-заполнитель.

>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] as y:
...         ...
...     case _:
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchAs(
                        pattern=MatchSequence(
                            patterns=[
                                MatchAs(name='x')]),
                        name='y'),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))]),
                match_case(
                    pattern=MatchAs(),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

class ast.MatchOr(patterns)

Шаблон сопоставления «или». Шаблон «или» по очереди сопоставляет каждый из своих вложенных шаблонов с объектом, пока один из них не сработает. После этого шаблон «или» считается успешно сопоставленным. Если ни один из вложенных шаблонов не сработает, шаблон «или» не срабатывает. Атрибут patterns содержит список узлов шаблонов сопоставления, которые будут сопоставляться с объектом.

>>> print(ast.dump(ast.parse("""
... match x:
...     case [x] | (y):
...         ...
... """), indent=4))
Module(
    body=[
        Match(
            subject=Name(id='x', ctx=Load()),
            cases=[
                match_case(
                    pattern=MatchOr(
                        patterns=[
                            MatchSequence(
                                patterns=[
                                    MatchAs(name='x')]),
                            MatchAs(name='y')]),
                    body=[
                        Expr(
                            value=Constant(value=Ellipsis))])])])

Добавлено в версии 3.10.

Аннотации типов

class ast.TypeIgnore(lineno, tag)

Комментарий # type: ignore, расположенный на строке lineno. tag — необязательная метка, указанная в форме # type: ignore <tag>.

>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4))
Module(
    body=[
        Assign(
            targets=[
                Name(id='x', ctx=Store())],
            value=Constant(value=1))],
    type_ignores=[
        TypeIgnore(lineno=1, tag='')])
>>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4))
Module(
    body=[
        AnnAssign(
            target=Name(id='x', ctx=Store()),
            annotation=Name(id='bool', ctx=Load()),
            value=Constant(value=1),
            simple=1)],
    type_ignores=[
        TypeIgnore(lineno=1, tag='[assignment]')])

Примечание

Узлы TypeIgnore не создаются, если параметр type_comments установлен в False (значение по умолчанию). Дополнительные сведения см. в разделе ast.parse().

Добавлено в версии 3.8.

Параметры типов

Параметры типов могут использоваться в классах, функциях и псевдонимах типов.

class ast.TypeVar(name, bound, default_value)

Объект typing.TypeVar. name — имя переменной типа. bound — ограничение или ограничения, если они есть. Если bound является Tuple, он представляет ограничения; в противном случае он представляет ограничение. default_value — значение по умолчанию; если у TypeVar нет значения по умолчанию, этому атрибуту присваивается None.

>>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVar(
                    name='T',
                    bound=Name(id='int', ctx=Load()),
                    default_value=Name(id='bool', ctx=Load()))],
            value=Subscript(
                value=Name(id='list', ctx=Load()),
                slice=Name(id='T', ctx=Load()),
                ctx=Load()))])

Добавлено в версии 3.12.

Изменено в версии 3.13: Добавлен параметр default_value.

class ast.ParamSpec(name, default_value)

Объект typing.ParamSpec. name — имя спецификации параметров. default_value — значение по умолчанию; если у ParamSpec нет значения по умолчанию, этому атрибуту присваивается None.

>>> print(ast.dump(ast.parse("type Alias[**P = [int, str]] = Callable[P, int]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                ParamSpec(
                    name='P',
                    default_value=List(
                        elts=[
                            Name(id='int', ctx=Load()),
                            Name(id='str', ctx=Load())],
                        ctx=Load()))],
            value=Subscript(
                value=Name(id='Callable', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Name(id='P', ctx=Load()),
                        Name(id='int', ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])

Добавлено в версии 3.12.

Изменено в версии 3.13: Добавлен параметр default_value.

class ast.TypeVarTuple(name, default_value)

Объект typing.TypeVarTuple. name — имя кортежа переменных типа. default_value — значение по умолчанию; если у TypeVarTuple нет значения по умолчанию, этому атрибуту присваивается None.

>>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4))
Module(
    body=[
        TypeAlias(
            name=Name(id='Alias', ctx=Store()),
            type_params=[
                TypeVarTuple(
                    name='Ts',
                    default_value=Tuple(ctx=Load()))],
            value=Subscript(
                value=Name(id='tuple', ctx=Load()),
                slice=Tuple(
                    elts=[
                        Starred(
                            value=Name(id='Ts', ctx=Load()),
                            ctx=Load())],
                    ctx=Load()),
                ctx=Load()))])

Добавлено в версии 3.12.

Изменено в версии 3.13: Добавлен параметр default_value.

Определения функций и классов

class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)

Определение функции.

  • name — исходная строка с именем функции.
  • args — узел arguments.
  • body — список узлов внутри функции.
  • decorator_list — список применяемых декораторов, сохранённых в порядке от внешнего к внутреннему (то есть последний декоратор в списке будет применён первым).
  • returns — аннотация возвращаемого значения.
  • type_params — список параметров типов.
type_comment

type_comment — необязательная строка с аннотацией типа в виде комментария.

Изменено в версии 3.12: Добавлен type_params.

class ast.Lambda(args, body)

lambda — минимальное определение функции, которое можно использовать внутри выражения. В отличие от FunctionDef, body содержит один узел.

>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))
Module(
    body=[
        Expr(
            value=Lambda(
                args=arguments(
                    args=[
                        arg(arg='x'),
                        arg(arg='y')]),
                body=Constant(value=Ellipsis)))])
class ast.arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)

Аргументы функции.

  • posonlyargs, args и kwonlyargs — списки узлов arg.
  • vararg и kwarg — отдельные узлы arg, относящиеся к параметрам *args, **kwargs.
  • kw_defaults — список значений по умолчанию для аргументов, передаваемых только по ключевому слову. Если значение равно None, соответствующий аргумент является обязательным.
  • defaults — список значений по умолчанию для аргументов, которые можно передавать позиционно. Если значений по умолчанию меньше, они соответствуют последним n аргументам.
class ast.arg(arg, annotation, type_comment)

Отдельный аргумент в списке. arg — исходная строка с именем аргумента; annotation — его аннотация, например узел Name.

type_comment

type_comment — необязательная строка с аннотацией типа в виде комментария

>>> print(ast.dump(ast.parse("""\
... @decorator1
... @decorator2
... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation':
...     pass
... """), indent=4))
Module(
    body=[
        FunctionDef(
            name='f',
            args=arguments(
                args=[
                    arg(
                        arg='a',
                        annotation=Constant(value='annotation')),
                    arg(arg='b'),
                    arg(arg='c')],
                vararg=arg(arg='d'),
                kwonlyargs=[
                    arg(arg='e'),
                    arg(arg='f')],
                kw_defaults=[
                    None,
                    Constant(value=3)],
                kwarg=arg(arg='g'),
                defaults=[
                    Constant(value=1),
                    Constant(value=2)]),
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())],
            returns=Constant(value='return annotation'))])
class ast.Return(value)

Инструкция return.

>>> print(ast.dump(ast.parse('return 4'), indent=4))
Module(
    body=[
        Return(
            value=Constant(value=4))])
class ast.Yield(value)
class ast.YieldFrom(value)

Выражение yield или yield from. Поскольку это выражения, их необходимо обернуть в узел Expr, если возвращаемое значение не используется.

>>> print(ast.dump(ast.parse('yield x'), indent=4))
Module(
    body=[
        Expr(
            value=Yield(
                value=Name(id='x', ctx=Load())))])

>>> print(ast.dump(ast.parse('yield from x'), indent=4))
Module(
    body=[
        Expr(
            value=YieldFrom(
                value=Name(id='x', ctx=Load())))])
class ast.Global(names)
class ast.Nonlocal(names)

Инструкции global и nonlocal. names — список исходных строк.

>>> print(ast.dump(ast.parse('global x,y,z'), indent=4))
Module(
    body=[
        Global(
            names=[
                'x',
                'y',
                'z'])])

>>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))
Module(
    body=[
        Nonlocal(
            names=[
                'x',
                'y',
                'z'])])
class ast.ClassDef(name, bases, keywords, body, decorator_list, type_params)

Определение класса.

  • name — исходная строка с именем класса
  • bases — список узлов для явно указанных базовых классов.
  • keywords — список узлов keyword, в основном для «metaclass». Остальные ключевые слова будут переданы метаклассу, как указано в PEP 3115.
  • body — список узлов, представляющих код внутри определения класса.
  • decorator_list — список узлов, как и в FunctionDef.
  • type_params — список параметров типов.
>>> print(ast.dump(ast.parse("""\
... @decorator1
... @decorator2
... class Foo(base1, base2, metaclass=meta):
...     pass
... """), indent=4))
Module(
    body=[
        ClassDef(
            name='Foo',
            bases=[
                Name(id='base1', ctx=Load()),
                Name(id='base2', ctx=Load())],
            keywords=[
                keyword(
                    arg='metaclass',
                    value=Name(id='meta', ctx=Load()))],
            body=[
                Pass()],
            decorator_list=[
                Name(id='decorator1', ctx=Load()),
                Name(id='decorator2', ctx=Load())])])

Изменено в версии 3.12: Добавлен type_params.

Асинхронность и await

class ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)

Определение async def функции. Содержит те же поля, что и FunctionDef.

Изменено в версии 3.12: Добавлен type_params.

class ast.Await(value)

Выражение await. value — объект, ожидание которого выполняется. Допустимо только в теле AsyncFunctionDef.

>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()))))])])
class ast.AsyncFor(target, iter, body, orelse, type_comment)
class ast.AsyncWith(items, body, type_comment)

Циклы async for и менеджеры контекста async with. Они содержат те же поля, что и For и With соответственно. Допустимы только в теле AsyncFunctionDef.

Примечание

При разборе строки с помощью ast.parse() узлы операторов (подклассы ast.operator, ast.unaryop, ast.cmpop, ast.boolop и ast.expr_context) в возвращённом дереве будут одиночными объектами. Изменения одного такого объекта отразятся на всех остальных вхождениях того же значения (например, ast.Add).

ast вспомогательные средства

Помимо классов узлов, модуль ast определяет следующие вспомогательные функции и классы для обхода абстрактных синтаксических деревьев:

ast.parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)

Разбирает исходный код и возвращает узел AST. Эквивалентно compile(source, filename, mode, flags=FLAGS_VALUE, optimize=optimize), где FLAGS_VALUE — ast.PyCF_ONLY_AST, если задано optimize <= 0, и ast.PyCF_OPTIMIZED_AST в противном случае.

Если задано type_comments=True, анализатор изменяется так, чтобы проверять и возвращать комментарии типов согласно PEP 484 и PEP 526. Это эквивалентно добавлению ast.PyCF_TYPE_COMMENTS к флагам, передаваемым в compile(). Это приведёт к ошибкам синтаксиса при размещении комментариев типов в недопустимых местах. Без этого флага комментарии типов игнорируются, а поле type_comment у выбранных узлов AST всегда будет иметь значение None. Кроме того, расположение комментариев # type: ignore возвращается в виде атрибута type_ignores объекта Module (в противном случае это всегда пустой список).

Кроме того, если mode равно 'func_type', синтаксис входных данных изменяется в соответствии с «комментариями типов сигнатур» из PEP 484, например (str, int) -> List[str].

Если задать feature_version как кортеж (major, minor), будет предпринята попытка «наилучшим образом» выполнить разбор с использованием грамматики указанной версии Python. Например, при задании feature_version=(3, 9) будет предпринята попытка запретить разбор инструкций match. В настоящее время major должно быть равно 3. Наименьшая поддерживаемая версия — (3, 7) (в будущих версиях Python это значение может увеличиться); наибольшая — sys.version_info[0:2]. Попытка «наилучшим образом» означает, что нет гарантии, что разбор (или его успешное выполнение) будет таким же, как при запуске в версии Python, соответствующей feature_version.

Если исходный код содержит нулевой символ (\0), возбуждается исключение ValueError.

Предупреждение

Обратите внимание: успешный разбор исходного кода в объект AST не гарантирует, что переданный исходный код является допустимым кодом Python, который можно выполнить, поскольку на этапе компиляции могут возникнуть дополнительные исключения SyntaxError. Например, исходный код return 42 создаёт допустимый узел AST для инструкции return, но его нельзя скомпилировать отдельно (она должна находиться внутри узла функции).

В частности, ast.parse() не выполняет проверку областей видимости, которая выполняется на этапе компиляции.

Предупреждение

Из-за ограничений глубины стека в компиляторе AST Python достаточно большая или сложная строка может привести к аварийному завершению интерпретатора Python.

Изменено в версии 3.8: Добавлены type_comments, mode='func_type' и feature_version.

Изменено в версии 3.13: Теперь минимальная поддерживаемая версия для feature_version — (3, 7). Добавлен аргумент optimize.

ast.unparse(ast_obj)

Преобразует объект ast.AST обратно в исходный код и создаёт строку с кодом, который при повторном разборе с помощью ast.parse() создаст эквивалентный объект ast.AST.

Предупреждение

Полученная строка кода не обязательно будет совпадать с исходным кодом, на основе которого был создан объект ast.AST (без учёта оптимизаций компилятора, например для постоянных кортежей или неизменяемых множеств).

Предупреждение

Попытка преобразовать очень сложное выражение обратно в исходный код приведёт к исключению RecursionError.

Добавлено в версии 3.9.

ast.literal_eval(node_or_string)

Вычисляет узел выражения или строку, содержащую только литерал Python или представление контейнера. Переданная строка или узел могут содержать только следующие литеральные структуры Python: строки, байты, числа, кортежи, списки, словари, множества, логические значения, None и Ellipsis.

Эту функцию можно использовать для вычисления строк, содержащих значения Python, без необходимости самостоятельно разбирать эти значения. Она не предназначена для вычисления произвольных сложных выражений, например содержащих операторы или индексацию.

Ранее в документации эта функция называлась «безопасной», но значение этого термина не определялось. Это вводило в заблуждение. Функция специально разработана так, чтобы не выполнять код Python, в отличие от более универсальной функции eval(). У неё нет пространства имён, поиска имён или возможности вызывать внешние функции. Однако она не защищена от атак: сравнительно небольшой входной файл может привести к исчерпанию памяти или стека C и аварийному завершению процесса. Некоторые входные данные также могут вызвать чрезмерную загрузку ЦП и отказ в обслуживании. Поэтому не рекомендуется вызывать её для недоверенных данных.

Предупреждение

Из-за ограничений глубины стека в компиляторе AST Python может произойти аварийное завершение интерпретатора Python.

В зависимости от некорректных входных данных могут возникнуть исключения ValueError, TypeError, SyntaxError, MemoryError и RecursionError.

Изменено в версии 3.2: Добавлена поддержка байтовых строк и литералов множеств.

Изменено в версии 3.9: Добавлена поддержка создания пустых множеств с помощью 'set()'.

Изменено в версии 3.10: Для строковых входных данных теперь удаляются начальные пробелы и табуляции.

ast.get_docstring(node, clean=True)

Возвращает строку документации заданного узла node (который должен быть узлом FunctionDef, AsyncFunctionDef, ClassDef или Module) либо None, если строки документации нет. Если clean равно true, функция удаляет отступы строки документации с помощью inspect.cleandoc().

Изменено в версии 3.5: Добавлена поддержка AsyncFunctionDef.

ast.get_source_segment(source, node, *, padded=False)

Возвращает сегмент исходного кода из source, на основе которого был создан узел node. Если отсутствует какая-либо информация о расположении (lineno, end_lineno, col_offset или end_col_offset), возвращает None.

Если padded равно True, первая строка многострочной инструкции дополняется пробелами, чтобы соответствовать её исходному расположению.

Добавлено в версии 3.8.

ast.fix_missing_locations(node)

При компиляции дерева узлов с помощью compile() компилятор ожидает наличия атрибутов lineno и col_offset у каждого узла, который их поддерживает. Для сгенерированных узлов заполнять их довольно утомительно, поэтому эта вспомогательная функция рекурсивно добавляет отсутствующие атрибуты, присваивая им значения родительского узла. Обход начинается с узла node.

ast.increment_lineno(node, n=1)

Увеличивает номер строки и номер конечной строки каждого узла в дереве, начиная с узла node, на значение n. Это полезно для «перемещения кода» в другое место файла.

ast.copy_location(new_node, old_node)

По возможности копирует информацию о расположении в исходном коде (lineno, col_offset, end_lineno и end_col_offset) из old_node в new_node и возвращает new_node.

ast.iter_fields(node)

Для каждого поля в node._fields, присутствующего в узле node, возвращает кортеж (fieldname, value).

ast.iter_child_nodes(node)

Возвращает все непосредственные дочерние узлы узла node, то есть все поля, содержащие узлы, и все элементы полей, представляющих собой списки узлов.

ast.walk(node)

Рекурсивно возвращает все дочерние узлы в дереве, начиная с узла node (включая сам node), в произвольном порядке. Это полезно, если требуется изменять узлы на месте и контекст не имеет значения.

class ast.NodeVisitor

Базовый класс посетителя узлов, который обходит абстрактное синтаксическое дерево и вызывает функцию посетителя для каждого найденного узла. Эта функция может возвращать значение, которое передаётся методом visit().

Этот класс предназначен для создания подклассов, в которых добавляются методы посетителя.

visit(node)

Посещает узел. Реализация по умолчанию вызывает метод с именем self.visit_classname, где classname — имя класса узла, либо generic_visit(), если такого метода нет.

generic_visit(node)

Этот посетитель вызывает visit() для всех дочерних узлов.

Обратите внимание: дочерние узлы тех узлов, для которых определён пользовательский метод посетителя, не будут посещены, если посетитель не вызовет generic_visit() и не посетит их самостоятельно.

visit_Constant(node)

Обрабатывает все узлы констант.

Не используйте NodeVisitor, если хотите вносить изменения в узлы во время обхода. Для этого существует специальный посетитель (NodeTransformer), позволяющий изменять узлы.

Устарело с версии 3.8, удалено в версии 3.14: Методы visit_Num(), visit_Str(), visit_Bytes(), visit_NameConstant() и visit_Ellipsis() не будут вызываться в Python 3.14 и более поздних версиях. Вместо них добавьте метод visit_Constant(), чтобы обрабатывать все узлы констант.

class ast.NodeTransformer

Подкласс NodeVisitor, который обходит абстрактное синтаксическое дерево и позволяет изменять узлы.

Объект NodeTransformer обходит AST и использует возвращаемые методами посетителя значения для замены или удаления исходного узла. Если метод посетителя возвращает None, узел удаляется из своего расположения; в противном случае он заменяется возвращённым значением. Возвращаемым значением может быть исходный узел — в этом случае замена не выполняется.

Ниже приведён пример преобразователя, который заменяет все вхождения поиска имён (foo) на data['foo']:

class RewriteName(NodeTransformer):

    def visit_Name(self, node):
        return Subscript(
            value=Name(id='data', ctx=Load()),
            slice=Constant(value=node.id),
            ctx=node.ctx
        )

Помните: если у обрабатываемого узла есть дочерние узлы, необходимо либо самостоятельно преобразовать их, либо сначала вызвать для этого узла метод generic_visit().

Для узлов, входивших в коллекцию инструкций (это относится ко всем узлам инструкций), посетитель может возвращать список узлов, а не один узел.

Если NodeTransformer добавляет новые узлы (которых не было в исходном дереве), не указывая для них информацию о расположении (например, lineno), для пересчёта информации о расположении следует вызвать fix_missing_locations() для нового поддерева:

tree = ast.parse('foo', mode='eval')
new_tree = fix_missing_locations(RewriteName().visit(tree))

Обычно преобразователь используется следующим образом:

node = YourTransformer().visit(node)
ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)

Возвращает форматированный дамп дерева узла node. В основном это полезно для отладки. Если annotate_fields имеет значение true (по умолчанию), в возвращаемой строке будут указаны имена полей и их значения. Если annotate_fields имеет значение false, результат будет более компактным: однозначные имена полей будут опущены. По умолчанию такие атрибуты, как номера строк и смещения столбцов, не включаются в дамп. Чтобы включить их, можно задать значение true для include_attributes.

Если indent — неотрицательное целое число или строка, дерево будет красиво отформатировано с указанным уровнем отступа. Уровень отступа 0, отрицательное значение или "" добавляет только символы перевода строки. Значение None (по умолчанию) выбирает представление в одну строку. При положительном целочисленном значении отступ добавляет указанное количество пробелов на каждом уровне. Если indent — строка (например, "\t"), эта строка используется для отступа на каждом уровне.

Если show_empty имеет значение false (по умолчанию), необязательные пустые списки не включаются в вывод. Необязательные значения None всегда опускаются.

Изменено в версии 3.9: Добавлен параметр indent.

Изменено в версии 3.13: Добавлен параметр show_empty.

>>> print(ast.dump(ast.parse("""\
... async def f():
...     await other_func()
... """), indent=4, show_empty=True))
Module(
    body=[
        AsyncFunctionDef(
            name='f',
            args=arguments(
                posonlyargs=[],
                args=[],
                kwonlyargs=[],
                kw_defaults=[],
                defaults=[]),
            body=[
                Expr(
                    value=Await(
                        value=Call(
                            func=Name(id='other_func', ctx=Load()),
                            args=[],
                            keywords=[])))],
            decorator_list=[],
            type_params=[])],
    type_ignores=[])
ast.compare(a, b, /, *, compare_attributes=False)

Рекурсивно сравнивает два AST.

Параметр compare_attributes определяет, учитываются ли при сравнении атрибуты AST. Если compare_attributes равно False (значение по умолчанию), атрибуты игнорируются. В противном случае они должны быть одинаковыми. Этот параметр полезен для проверки структурного равенства AST при наличии различий в пробельных символах или подобных деталях. К атрибутам относятся номера строк и смещения столбцов.

Добавлено в версии 3.14.

Флаги компилятора

Чтобы изменить поведение компиляции программы, функции compile() можно передать следующие флаги:

ast.PyCF_ALLOW_TOP_LEVEL_AWAIT

Включает поддержку await верхнего уровня, async for, async with и асинхронных включений.

Добавлено в версии 3.8.

ast.PyCF_ONLY_AST

Создаёт и возвращает абстрактное синтаксическое дерево вместо скомпилированного объекта кода.

ast.PyCF_OPTIMIZED_AST

Возвращаемый AST оптимизируется в соответствии с аргументом optimize функции compile() или ast.parse().

Добавлено в версии 3.13.

ast.PyCF_TYPE_COMMENTS

Включает поддержку комментариев типов в стиле PEP 484 и PEP 526 (# type: <type>, # type: ignore <stuff>).

Добавлено в версии 3.8.

Использование командной строки

Добавлено в версии 3.9.

Модуль ast можно запустить из командной строки как скрипт. Это делается очень просто:

python -m ast [-m <mode>] [-a] [infile]

Поддерживаются следующие параметры:

-h, --help

Показать справку и завершить работу.

-m <mode>
--mode <mode>

Указывает тип кода для компиляции, подобно аргументу mode функции parse().

--no-type-comments

Не разбирать комментарии типов.

-a, --include-attributes

Включать такие атрибуты, как номера строк и смещения столбцов.

-i <indent>
--indent <indent>

Отступы узлов в AST (количество пробелов).

--feature-version <version>

Версия Python в формате 3.x (например, 3.10). По умолчанию используется текущая версия интерпретатора.

Добавлено в версии 3.14.

-O <level>
--optimize <level>

Уровень оптимизации анализатора. По умолчанию оптимизация не выполняется.

Добавлено в версии 3.14.

--show-empty

Показывать пустые списки и поля со значением None. По умолчанию пустые объекты не отображаются.

Добавлено в версии 3.14.

Если указан infile, его содержимое разбирается в AST и выводится в stdout. В противном случае содержимое считывается из stdin.

См. также

Green Tree Snakes — внешний ресурс документации с подробными сведениями о работе с AST Python.

ASTTokens добавляет к AST Python аннотации с позициями токенов и текста в исходном коде, на основе которого они были созданы. Это полезно для инструментов, преобразующих исходный код.

leoAst.py объединяет представления программ Python на основе токенов и деревьев разбора, добавляя двусторонние связи между токенами и узлами AST.

LibCST разбирает код в конкретное синтаксическое дерево, похожее на AST и сохраняющее все детали форматирования. Оно полезно для создания инструментов автоматического рефакторинга (codemod) и линтеров.

Parso — анализатор Python с поддержкой восстановления после ошибок и разбора с сохранением исходного представления для разных версий Python (в нескольких версиях Python). Parso также умеет находить несколько синтаксических ошибок в файле Python.

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/ast.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API