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 + bargtypes— это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— целое число: -
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')): преобразование!aASCII - 114 (
ord('r')): преобразование!rrepr() - 115 (
ord('s')): преобразование!sstring
Он имеет тот же смысл, что и
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.
Использование командной строки
Добавлено в версии 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