mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			2252 lines
		
	
	
	
		
			76 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			2252 lines
		
	
	
	
		
			76 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
:mod:`ast` --- Abstract Syntax Trees
 | 
						|
====================================
 | 
						|
 | 
						|
.. module:: ast
 | 
						|
   :synopsis: Abstract Syntax Tree classes and manipulation.
 | 
						|
 | 
						|
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
 | 
						|
.. sectionauthor:: Georg Brandl <georg@python.org>
 | 
						|
 | 
						|
.. testsetup::
 | 
						|
 | 
						|
    import ast
 | 
						|
 | 
						|
**Source code:** :source:`Lib/ast.py`
 | 
						|
 | 
						|
--------------
 | 
						|
 | 
						|
The :mod:`ast` module helps Python applications to process trees of the Python
 | 
						|
abstract syntax grammar.  The abstract syntax itself might change with each
 | 
						|
Python release; this module helps to find out programmatically what the current
 | 
						|
grammar looks like.
 | 
						|
 | 
						|
An abstract syntax tree can be generated by passing :data:`ast.PyCF_ONLY_AST` as
 | 
						|
a flag to the :func:`compile` built-in function, or using the :func:`parse`
 | 
						|
helper provided in this module.  The result will be a tree of objects whose
 | 
						|
classes all inherit from :class:`ast.AST`.  An abstract syntax tree can be
 | 
						|
compiled into a Python code object using the built-in :func:`compile` function.
 | 
						|
 | 
						|
 | 
						|
.. _abstract-grammar:
 | 
						|
 | 
						|
Abstract Grammar
 | 
						|
----------------
 | 
						|
 | 
						|
The abstract grammar is currently defined as follows:
 | 
						|
 | 
						|
.. literalinclude:: ../../Parser/Python.asdl
 | 
						|
   :language: asdl
 | 
						|
 | 
						|
 | 
						|
Node classes
 | 
						|
------------
 | 
						|
 | 
						|
.. class:: AST
 | 
						|
 | 
						|
   This is the base of all AST node classes.  The actual node classes are
 | 
						|
   derived from the :file:`Parser/Python.asdl` file, which is reproduced
 | 
						|
   :ref:`below <abstract-grammar>`.  They are defined in the :mod:`_ast` C
 | 
						|
   module and re-exported in :mod:`ast`.
 | 
						|
 | 
						|
   There is one class defined for each left-hand side symbol in the abstract
 | 
						|
   grammar (for example, :class:`ast.stmt` or :class:`ast.expr`).  In addition,
 | 
						|
   there is one class defined for each constructor on the right-hand side; these
 | 
						|
   classes inherit from the classes for the left-hand side trees.  For example,
 | 
						|
   :class:`ast.BinOp` inherits from :class:`ast.expr`.  For production rules
 | 
						|
   with alternatives (aka "sums"), the left-hand side class is abstract: only
 | 
						|
   instances of specific constructor nodes are ever created.
 | 
						|
 | 
						|
   .. index:: single: ? (question mark); in AST grammar
 | 
						|
   .. index:: single: * (asterisk); in AST grammar
 | 
						|
 | 
						|
   .. attribute:: _fields
 | 
						|
 | 
						|
      Each concrete class has an attribute :attr:`_fields` which gives the names
 | 
						|
      of all child nodes.
 | 
						|
 | 
						|
      Each instance of a concrete class has one attribute for each child node,
 | 
						|
      of the type as defined in the grammar.  For example, :class:`ast.BinOp`
 | 
						|
      instances have an attribute :attr:`left` of type :class:`ast.expr`.
 | 
						|
 | 
						|
      If these attributes are marked as optional in the grammar (using a
 | 
						|
      question mark), the value might be ``None``.  If the attributes can have
 | 
						|
      zero-or-more values (marked with an asterisk), the values are represented
 | 
						|
      as Python lists.  All possible attributes must be present and have valid
 | 
						|
      values when compiling an AST with :func:`compile`.
 | 
						|
 | 
						|
   .. attribute:: lineno
 | 
						|
                  col_offset
 | 
						|
                  end_lineno
 | 
						|
                  end_col_offset
 | 
						|
 | 
						|
      Instances of :class:`ast.expr` and :class:`ast.stmt` subclasses have
 | 
						|
      :attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`, and
 | 
						|
      :attr:`end_col_offset` attributes.  The :attr:`lineno` and :attr:`end_lineno`
 | 
						|
      are the first and last line numbers of source text span (1-indexed so the
 | 
						|
      first line is line 1) and the :attr:`col_offset` and :attr:`end_col_offset`
 | 
						|
      are the corresponding UTF-8 byte offsets of the first and last tokens that
 | 
						|
      generated the node. The UTF-8 offset is recorded because the parser uses
 | 
						|
      UTF-8 internally.
 | 
						|
 | 
						|
      Note that the end positions are not required by the compiler and are
 | 
						|
      therefore optional. The end offset is *after* the last symbol, for example
 | 
						|
      one can get the source segment of a one-line expression node using
 | 
						|
      ``source_line[node.col_offset : node.end_col_offset]``.
 | 
						|
 | 
						|
   The constructor of a class :class:`ast.T` parses its arguments as follows:
 | 
						|
 | 
						|
   * If there are positional arguments, there must be as many as there are items
 | 
						|
     in :attr:`T._fields`; they will be assigned as attributes of these names.
 | 
						|
   * If there are keyword arguments, they will set the attributes of the same
 | 
						|
     names to the given values.
 | 
						|
 | 
						|
   For example, to create and populate an :class:`ast.UnaryOp` node, you could
 | 
						|
   use ::
 | 
						|
 | 
						|
      node = ast.UnaryOp()
 | 
						|
      node.op = ast.USub()
 | 
						|
      node.operand = ast.Constant()
 | 
						|
      node.operand.value = 5
 | 
						|
      node.operand.lineno = 0
 | 
						|
      node.operand.col_offset = 0
 | 
						|
      node.lineno = 0
 | 
						|
      node.col_offset = 0
 | 
						|
 | 
						|
   or the more compact ::
 | 
						|
 | 
						|
      node = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0),
 | 
						|
                         lineno=0, col_offset=0)
 | 
						|
 | 
						|
.. versionchanged:: 3.8
 | 
						|
 | 
						|
   Class :class:`ast.Constant` is now used for all constants.
 | 
						|
 | 
						|
.. versionchanged:: 3.9
 | 
						|
 | 
						|
   Simple indices are represented by their value, extended slices are
 | 
						|
   represented as tuples.
 | 
						|
 | 
						|
.. deprecated:: 3.8
 | 
						|
 | 
						|
   Old classes :class:`ast.Num`, :class:`ast.Str`, :class:`ast.Bytes`,
 | 
						|
   :class:`ast.NameConstant` and :class:`ast.Ellipsis` are still available,
 | 
						|
   but they will be removed in future Python releases.  In the meantime,
 | 
						|
   instantiating them will return an instance of a different class.
 | 
						|
 | 
						|
.. deprecated:: 3.9
 | 
						|
 | 
						|
   Old classes :class:`ast.Index` and :class:`ast.ExtSlice` are still
 | 
						|
   available, but they will be removed in future Python releases.
 | 
						|
   In the meantime, instantiating them will return an instance of
 | 
						|
   a different class.
 | 
						|
 | 
						|
.. note::
 | 
						|
    The descriptions of the specific node classes displayed here
 | 
						|
    were initially adapted from the fantastic `Green Tree
 | 
						|
    Snakes <https://greentreesnakes.readthedocs.io/en/latest/>`__ project and
 | 
						|
    all its contributors.
 | 
						|
 | 
						|
Literals
 | 
						|
^^^^^^^^
 | 
						|
 | 
						|
.. class:: Constant(value)
 | 
						|
 | 
						|
   A constant value. The ``value`` attribute of the ``Constant`` literal contains the
 | 
						|
   Python object it represents. The values represented can be simple types
 | 
						|
   such as a number, string or ``None``, but also immutable container types
 | 
						|
   (tuples and frozensets) if all of their elements are constant.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('123', mode='eval'), indent=4))
 | 
						|
        Expression(
 | 
						|
            body=Constant(value=123))
 | 
						|
 | 
						|
 | 
						|
.. class:: FormattedValue(value, conversion, format_spec)
 | 
						|
 | 
						|
   Node representing a single formatting field in an f-string. If the string
 | 
						|
   contains a single formatting field and nothing else the node can be
 | 
						|
   isolated otherwise it appears in :class:`JoinedStr`.
 | 
						|
 | 
						|
   * ``value`` is any expression node (such as a literal, a variable, or a
 | 
						|
     function call).
 | 
						|
   * ``conversion`` is an integer:
 | 
						|
 | 
						|
     * -1: no formatting
 | 
						|
     * 115: ``!s`` string formatting
 | 
						|
     * 114: ``!r`` repr formatting
 | 
						|
     * 97: ``!a`` ascii formatting
 | 
						|
 | 
						|
   * ``format_spec`` is a :class:`JoinedStr` node representing the formatting
 | 
						|
     of the value, or ``None`` if no format was specified. Both
 | 
						|
     ``conversion`` and ``format_spec`` can be set at the same time.
 | 
						|
 | 
						|
 | 
						|
.. class:: JoinedStr(values)
 | 
						|
 | 
						|
   An f-string, comprising a series of :class:`FormattedValue` and :class:`Constant`
 | 
						|
   nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())],
 | 
						|
                            keywords=[]),
 | 
						|
                        conversion=-1,
 | 
						|
                        format_spec=JoinedStr(
 | 
						|
                            values=[
 | 
						|
                                Constant(value='.3')]))]))
 | 
						|
 | 
						|
 | 
						|
.. class:: List(elts, ctx)
 | 
						|
           Tuple(elts, ctx)
 | 
						|
 | 
						|
   A list or tuple. ``elts`` holds a list of nodes representing the elements.
 | 
						|
   ``ctx`` is :class:`Store` if the container is an assignment target (i.e.
 | 
						|
   ``(x,y)=something``), and :class:`Load` otherwise.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Set(elts)
 | 
						|
 | 
						|
   A set. ``elts`` holds a list of nodes representing the set's elements.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Dict(keys, values)
 | 
						|
 | 
						|
   A dictionary. ``keys`` and ``values`` hold lists of nodes representing the
 | 
						|
   keys and the values respectively, in matching order (what would be returned
 | 
						|
   when calling :code:`dictionary.keys()` and :code:`dictionary.values()`).
 | 
						|
 | 
						|
   When doing dictionary unpacking using dictionary literals the expression to be
 | 
						|
   expanded goes in the ``values`` list, with a ``None`` at the corresponding
 | 
						|
   position in ``keys``.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())]))
 | 
						|
 | 
						|
 | 
						|
Variables
 | 
						|
^^^^^^^^^
 | 
						|
 | 
						|
.. class:: Name(id, ctx)
 | 
						|
 | 
						|
   A variable name. ``id`` holds the name as a string, and ``ctx`` is one of
 | 
						|
   the following types.
 | 
						|
 | 
						|
 | 
						|
.. class:: Load()
 | 
						|
           Store()
 | 
						|
           Del()
 | 
						|
 | 
						|
   Variable references can be used to load the value of a variable, to assign
 | 
						|
   a new value to it, or to delete it. Variable references are given a context
 | 
						|
   to distinguish these cases.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('a'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Expr(
 | 
						|
                    value=Name(id='a', ctx=Load()))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('a = 1'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Assign(
 | 
						|
                    targets=[
 | 
						|
                        Name(id='a', ctx=Store())],
 | 
						|
                    value=Constant(value=1))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('del a'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Delete(
 | 
						|
                    targets=[
 | 
						|
                        Name(id='a', ctx=Del())])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Starred(value, ctx)
 | 
						|
 | 
						|
   A ``*var`` variable reference. ``value`` holds the variable, typically a
 | 
						|
   :class:`Name` node. This type must be used when building a :class:`Call`
 | 
						|
   node with ``*args``.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
Expressions
 | 
						|
^^^^^^^^^^^
 | 
						|
 | 
						|
.. class:: Expr(value)
 | 
						|
 | 
						|
   When an expression, such as a function call, appears as a statement by itself
 | 
						|
   with its return value not used or stored, it is wrapped in this container.
 | 
						|
   ``value`` holds one of the other nodes in this section, a :class:`Constant`, a
 | 
						|
   :class:`Name`, a :class:`Lambda`, a :class:`Yield` or :class:`YieldFrom` node.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('-a'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Expr(
 | 
						|
                    value=UnaryOp(
 | 
						|
                        op=USub(),
 | 
						|
                        operand=Name(id='a', ctx=Load())))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: UnaryOp(op, operand)
 | 
						|
 | 
						|
   A unary operation. ``op`` is the operator, and ``operand`` any expression
 | 
						|
   node.
 | 
						|
 | 
						|
 | 
						|
.. class:: UAdd
 | 
						|
           USub
 | 
						|
           Not
 | 
						|
           Invert
 | 
						|
 | 
						|
   Unary operator tokens. :class:`Not` is the ``not`` keyword, :class:`Invert`
 | 
						|
   is the ``~`` operator.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4))
 | 
						|
        Expression(
 | 
						|
            body=UnaryOp(
 | 
						|
                op=Not(),
 | 
						|
                operand=Name(id='x', ctx=Load())))
 | 
						|
 | 
						|
 | 
						|
.. class:: BinOp(left, op, right)
 | 
						|
 | 
						|
   A binary operation (like addition or division). ``op`` is the operator, and
 | 
						|
   ``left`` and ``right`` are any expression nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Add
 | 
						|
           Sub
 | 
						|
           Mult
 | 
						|
           Div
 | 
						|
           FloorDiv
 | 
						|
           Mod
 | 
						|
           Pow
 | 
						|
           LShift
 | 
						|
           RShift
 | 
						|
           BitOr
 | 
						|
           BitXor
 | 
						|
           BitAnd
 | 
						|
           MatMult
 | 
						|
 | 
						|
   Binary operator tokens.
 | 
						|
 | 
						|
 | 
						|
.. class:: BoolOp(op, values)
 | 
						|
 | 
						|
   A boolean operation, 'or' or 'and'. ``op`` is :class:`Or` or :class:`And`.
 | 
						|
   ``values`` are the values involved. Consecutive operations with the same
 | 
						|
   operator, such as ``a or b or c``, are collapsed into one node with several
 | 
						|
   values.
 | 
						|
 | 
						|
   This doesn't include ``not``, which is a :class:`UnaryOp`.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: And
 | 
						|
           Or
 | 
						|
 | 
						|
   Boolean operator tokens.
 | 
						|
 | 
						|
 | 
						|
.. class:: Compare(left, ops, comparators)
 | 
						|
 | 
						|
   A comparison of two or more values. ``left`` is the first value in the
 | 
						|
   comparison, ``ops`` the list of operators, and ``comparators`` the list
 | 
						|
   of values after the first element in the comparison.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Eq
 | 
						|
           NotEq
 | 
						|
           Lt
 | 
						|
           LtE
 | 
						|
           Gt
 | 
						|
           GtE
 | 
						|
           Is
 | 
						|
           IsNot
 | 
						|
           In
 | 
						|
           NotIn
 | 
						|
 | 
						|
   Comparison operator tokens.
 | 
						|
 | 
						|
 | 
						|
.. class:: Call(func, args, keywords, starargs, kwargs)
 | 
						|
 | 
						|
   A function call. ``func`` is the function, which will often be a
 | 
						|
   :class:`Name` or :class:`Attribute` object. Of the arguments:
 | 
						|
 | 
						|
   * ``args`` holds a list of the arguments passed by position.
 | 
						|
   * ``keywords`` holds a list of :class:`keyword` objects representing
 | 
						|
     arguments passed by keyword.
 | 
						|
 | 
						|
   When creating a ``Call`` node, ``args`` and ``keywords`` are required, but
 | 
						|
   they can be empty lists. ``starargs`` and ``kwargs`` are optional.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: keyword(arg, value)
 | 
						|
 | 
						|
   A keyword argument to a function call or class definition. ``arg`` is a raw
 | 
						|
   string of the parameter name, ``value`` is a node to pass in.
 | 
						|
 | 
						|
 | 
						|
.. class:: IfExp(test, body, orelse)
 | 
						|
 | 
						|
   An expression such as ``a if b else c``. Each field holds a single node, so
 | 
						|
   in the following example, all three are :class:`Name` nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Attribute(value, attr, ctx)
 | 
						|
 | 
						|
   Attribute access, e.g. ``d.keys``. ``value`` is a node, typically a
 | 
						|
   :class:`Name`. ``attr`` is a bare string giving the name of the attribute,
 | 
						|
   and ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del` according to how
 | 
						|
   the attribute is acted on.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: NamedExpr(target, value)
 | 
						|
 | 
						|
    A named expression. This AST node is produced by the assignment expressions
 | 
						|
    operator (also known as the walrus operator). As opposed to the :class:`Assign`
 | 
						|
    node in which the first argument can be multiple nodes, in this case both
 | 
						|
    ``target`` and ``value`` must be single nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4))
 | 
						|
        Expression(
 | 
						|
            body=NamedExpr(
 | 
						|
                target=Name(id='x', ctx=Store()),
 | 
						|
                value=Constant(value=4)))
 | 
						|
 | 
						|
 | 
						|
Subscripting
 | 
						|
~~~~~~~~~~~~
 | 
						|
 | 
						|
.. class:: Subscript(value, slice, ctx)
 | 
						|
 | 
						|
   A subscript, such as ``l[1]``. ``value`` is the subscripted object
 | 
						|
   (usually sequence or mapping). ``slice`` is an index, slice or key.
 | 
						|
   It can be a :class:`Tuple` and contain a :class:`Slice`.
 | 
						|
   ``ctx`` is :class:`Load`, :class:`Store` or :class:`Del`
 | 
						|
   according to the action performed with the subscript.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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:: Slice(lower, upper, step)
 | 
						|
 | 
						|
   Regular slicing (on the form ``lower:upper`` or ``lower:upper:step``).
 | 
						|
   Can occur only inside the *slice* field of :class:`Subscript`, either
 | 
						|
   directly or as an element of :class:`Tuple`.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()))
 | 
						|
 | 
						|
 | 
						|
Comprehensions
 | 
						|
~~~~~~~~~~~~~~
 | 
						|
 | 
						|
.. class:: ListComp(elt, generators)
 | 
						|
           SetComp(elt, generators)
 | 
						|
           GeneratorExp(elt, generators)
 | 
						|
           DictComp(key, value, generators)
 | 
						|
 | 
						|
   List and set comprehensions, generator expressions, and dictionary
 | 
						|
   comprehensions. ``elt`` (or ``key`` and ``value``) is a single node
 | 
						|
   representing the part that will be evaluated for each item.
 | 
						|
 | 
						|
   ``generators`` is a list of :class:`comprehension` nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()),
 | 
						|
                        ifs=[],
 | 
						|
                        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()),
 | 
						|
                        ifs=[],
 | 
						|
                        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()),
 | 
						|
                        ifs=[],
 | 
						|
                        is_async=0)]))
 | 
						|
 | 
						|
 | 
						|
.. class:: comprehension(target, iter, ifs, is_async)
 | 
						|
 | 
						|
   One ``for`` clause in a comprehension. ``target`` is the reference to use for
 | 
						|
   each element - typically a :class:`Name` or :class:`Tuple` node. ``iter``
 | 
						|
   is the object to iterate over. ``ifs`` is a list of test expressions: each
 | 
						|
   ``for`` clause can have multiple ``ifs``.
 | 
						|
 | 
						|
   ``is_async`` indicates a comprehension is asynchronous (using an
 | 
						|
   ``async for`` instead of ``for``). The value is an integer (0 or 1).
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())],
 | 
						|
                    keywords=[]),
 | 
						|
                generators=[
 | 
						|
                    comprehension(
 | 
						|
                        target=Name(id='line', ctx=Store()),
 | 
						|
                        iter=Name(id='file', ctx=Load()),
 | 
						|
                        ifs=[],
 | 
						|
                        is_async=0),
 | 
						|
                    comprehension(
 | 
						|
                        target=Name(id='c', ctx=Store()),
 | 
						|
                        iter=Name(id='line', ctx=Load()),
 | 
						|
                        ifs=[],
 | 
						|
                        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()),
 | 
						|
                        ifs=[],
 | 
						|
                        is_async=1)]))
 | 
						|
 | 
						|
Statements
 | 
						|
^^^^^^^^^^
 | 
						|
 | 
						|
.. class:: Assign(targets, value, type_comment)
 | 
						|
 | 
						|
   An assignment. ``targets`` is a list of nodes, and ``value`` is a single node.
 | 
						|
 | 
						|
   Multiple nodes in ``targets`` represents assigning the same value to each.
 | 
						|
   Unpacking is represented by putting a :class:`Tuple` or :class:`List`
 | 
						|
   within ``targets``.
 | 
						|
 | 
						|
   .. attribute:: type_comment
 | 
						|
 | 
						|
       ``type_comment`` is an optional string with the type annotation as a comment.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> 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()))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: AnnAssign(target, annotation, value, simple)
 | 
						|
 | 
						|
   An assignment with a type annotation. ``target`` is a single node and can
 | 
						|
   be a :class:`Name`, a :class:`Attribute` or a :class:`Subscript`.
 | 
						|
   ``annotation`` is the annotation, such as a :class:`Constant` or :class:`Name`
 | 
						|
   node. ``value`` is a single optional node. ``simple`` is a boolean integer
 | 
						|
   set to True for a :class:`Name` node in ``target`` that do not appear in
 | 
						|
   between parenthesis and are hence pure names and not expressions.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: AugAssign(target, op, value)
 | 
						|
 | 
						|
   Augmented assignment, such as ``a += 1``. In the following example,
 | 
						|
   ``target`` is a :class:`Name` node for ``x`` (with the :class:`Store`
 | 
						|
   context), ``op`` is :class:`Add`, and ``value`` is a :class:`Constant` with
 | 
						|
   value for 1.
 | 
						|
 | 
						|
   The ``target`` attribute cannot be of class :class:`Tuple` or :class:`List`,
 | 
						|
   unlike the targets of :class:`Assign`.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('x += 2'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                AugAssign(
 | 
						|
                    target=Name(id='x', ctx=Store()),
 | 
						|
                    op=Add(),
 | 
						|
                    value=Constant(value=2))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Raise(exc, cause)
 | 
						|
 | 
						|
   A ``raise`` statement. ``exc`` is the exception object to be raised, normally a
 | 
						|
   :class:`Call` or :class:`Name`, or ``None`` for a standalone ``raise``.
 | 
						|
   ``cause`` is the optional part for ``y`` in ``raise x from y``.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Assert(test, msg)
 | 
						|
 | 
						|
   An assertion. ``test`` holds the condition, such as a :class:`Compare` node.
 | 
						|
   ``msg`` holds the failure message.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Delete(targets)
 | 
						|
 | 
						|
   Represents a ``del`` statement. ``targets`` is a list of nodes, such as
 | 
						|
   :class:`Name`, :class:`Attribute` or :class:`Subscript` nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Pass()
 | 
						|
 | 
						|
   A ``pass`` statement.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('pass'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Pass()],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
Other statements which are only applicable inside functions or loops are
 | 
						|
described in other sections.
 | 
						|
 | 
						|
Imports
 | 
						|
~~~~~~~
 | 
						|
 | 
						|
.. class:: Import(names)
 | 
						|
 | 
						|
   An import statement. ``names`` is a list of :class:`alias` nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('import x,y,z'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Import(
 | 
						|
                    names=[
 | 
						|
                        alias(name='x'),
 | 
						|
                        alias(name='y'),
 | 
						|
                        alias(name='z')])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: ImportFrom(module, names, level)
 | 
						|
 | 
						|
   Represents ``from x import y``. ``module`` is a raw string of the 'from' name,
 | 
						|
   without any leading dots, or ``None`` for statements such as ``from . import foo``.
 | 
						|
   ``level`` is an integer holding the level of the relative import (0 means
 | 
						|
   absolute import).
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: alias(name, asname)
 | 
						|
 | 
						|
   Both parameters are raw strings of the names. ``asname`` can be ``None`` if
 | 
						|
   the regular name is to be used.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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)],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
Control flow
 | 
						|
^^^^^^^^^^^^
 | 
						|
 | 
						|
.. note::
 | 
						|
   Optional clauses such as ``else`` are stored as an empty list if they're
 | 
						|
   not present.
 | 
						|
 | 
						|
.. class:: If(test, body, orelse)
 | 
						|
 | 
						|
   An ``if`` statement. ``test`` holds a single node, such as a :class:`Compare`
 | 
						|
   node. ``body`` and ``orelse`` each hold a list of nodes.
 | 
						|
 | 
						|
   ``elif`` clauses don't have a special representation in the AST, but rather
 | 
						|
   appear as extra :class:`If` nodes within the ``orelse`` section of the
 | 
						|
   previous one.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: For(target, iter, body, orelse, type_comment)
 | 
						|
 | 
						|
   A ``for`` loop. ``target`` holds the variable(s) the loop assigns to, as a
 | 
						|
   single :class:`Name`, :class:`Tuple` or :class:`List` node. ``iter`` holds
 | 
						|
   the item to be looped over, again as a single node. ``body`` and ``orelse``
 | 
						|
   contain lists of nodes to execute. Those in ``orelse`` are executed if the
 | 
						|
   loop finishes normally, rather than via a ``break`` statement.
 | 
						|
 | 
						|
   .. attribute:: type_comment
 | 
						|
 | 
						|
       ``type_comment`` is an optional string with the type annotation as a comment.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: While(test, body, orelse)
 | 
						|
 | 
						|
   A ``while`` loop. ``test`` holds the condition, such as a :class:`Compare`
 | 
						|
   node.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >> 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))])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Break
 | 
						|
           Continue
 | 
						|
 | 
						|
   The ``break`` and ``continue`` statements.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()])],
 | 
						|
                    orelse=[])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Try(body, handlers, orelse, finalbody)
 | 
						|
 | 
						|
   ``try`` blocks. All attributes are list of nodes to execute, except for
 | 
						|
   ``handlers``, which is a list of :class:`ExceptHandler` nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: ExceptHandler(type, name, body)
 | 
						|
 | 
						|
   A single ``except`` clause. ``type`` is the exception type it will match,
 | 
						|
   typically a :class:`Name` node (or ``None`` for a catch-all ``except:`` clause).
 | 
						|
   ``name`` is a raw string for the name to hold the exception, or ``None`` if
 | 
						|
   the clause doesn't have ``as foo``. ``body`` is a list of nodes.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()])],
 | 
						|
                    orelse=[],
 | 
						|
                    finalbody=[])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: With(items, body, type_comment)
 | 
						|
 | 
						|
   A ``with`` block. ``items`` is a list of :class:`withitem` nodes representing
 | 
						|
   the context managers, and ``body`` is the indented block inside the context.
 | 
						|
 | 
						|
   .. attribute:: type_comment
 | 
						|
 | 
						|
       ``type_comment`` is an optional string with the type annotation as a comment.
 | 
						|
 | 
						|
 | 
						|
.. class:: withitem(context_expr, optional_vars)
 | 
						|
 | 
						|
   A single context manager in a ``with`` block. ``context_expr`` is the context
 | 
						|
   manager, often a :class:`Call` node. ``optional_vars`` is a :class:`Name`,
 | 
						|
   :class:`Tuple` or :class:`List` for the ``as foo`` part, or ``None`` if that
 | 
						|
   isn't used.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())],
 | 
						|
                                keywords=[]))])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
Pattern matching
 | 
						|
^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
 | 
						|
.. class:: Match(subject, cases)
 | 
						|
 | 
						|
   A ``match`` statement. ``subject`` holds the subject of the match (the object
 | 
						|
   that is being matched against the cases) and ``cases`` contains an iterable of
 | 
						|
   :class:`match_case` nodes with the different cases.
 | 
						|
 | 
						|
.. class:: match_case(pattern, guard, body)
 | 
						|
 | 
						|
   A single case pattern in a ``match`` statement. ``pattern`` contains the
 | 
						|
   match pattern that the subject will be matched against. Note that the
 | 
						|
   :class:`AST` nodes produced for patterns differ from those produced for
 | 
						|
   expressions, even when they share the same syntax.
 | 
						|
 | 
						|
   The ``guard`` attribute contains an expression that will be evaluated if
 | 
						|
   the pattern matches the subject.
 | 
						|
 | 
						|
   ``body`` contains a list of nodes to execute if the pattern matches and
 | 
						|
   the result of evaluating the guard expression is truthy.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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()),
 | 
						|
                                patterns=[],
 | 
						|
                                kwd_attrs=[],
 | 
						|
                                kwd_patterns=[]),
 | 
						|
                            body=[
 | 
						|
                                Expr(
 | 
						|
                                    value=Constant(value=Ellipsis))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchValue(value)
 | 
						|
 | 
						|
   A match literal or value pattern that compares by equality. ``value`` is
 | 
						|
   an expression node. Permitted value nodes are restricted as described in
 | 
						|
   the match statement documentation. This pattern succeeds if the match
 | 
						|
   subject is equal to the evaluated value.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchSingleton(value)
 | 
						|
 | 
						|
   A match literal pattern that compares by identity. ``value`` is the
 | 
						|
   singleton to be compared against: ``None``, ``True``, or ``False``. This
 | 
						|
   pattern succeeds if the match subject is the given constant.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchSequence(patterns)
 | 
						|
 | 
						|
   A match sequence pattern. ``patterns`` contains the patterns to be matched
 | 
						|
   against the subject elements if the subject is a sequence. Matches a variable
 | 
						|
   length sequence if one of the subpatterns is a ``MatchStar`` node, otherwise
 | 
						|
   matches a fixed length sequence.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchStar(name)
 | 
						|
 | 
						|
   Matches the rest of the sequence in a variable length match sequence pattern.
 | 
						|
   If ``name`` is not ``None``, a list containing the remaining sequence
 | 
						|
   elements is bound to that name if the overall sequence pattern is successful.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchMapping(keys, patterns, rest)
 | 
						|
 | 
						|
   A match mapping pattern. ``keys`` is a sequence of expression nodes.
 | 
						|
   ``patterns`` is a corresponding sequence of pattern nodes. ``rest`` is an
 | 
						|
   optional name that can be specified to capture the remaining mapping elements.
 | 
						|
   Permitted key expressions are restricted as described in the match statement
 | 
						|
   documentation.
 | 
						|
 | 
						|
   This pattern succeeds if the subject is a mapping, all evaluated key
 | 
						|
   expressions are present in the mapping, and the value corresponding to each
 | 
						|
   key matches the corresponding subpattern. If ``rest`` is not ``None``, a dict
 | 
						|
   containing the remaining mapping elements is bound to that name if the overall
 | 
						|
   mapping pattern is successful.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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(keys=[], patterns=[], rest='rest'),
 | 
						|
                            body=[
 | 
						|
                                Expr(
 | 
						|
                                    value=Constant(value=Ellipsis))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchClass(cls, patterns, kwd_attrs, kwd_patterns)
 | 
						|
 | 
						|
   A match class pattern. ``cls`` is an expression giving the nominal class to
 | 
						|
   be matched. ``patterns`` is a sequence of pattern nodes to be matched against
 | 
						|
   the class defined sequence of pattern matching attributes. ``kwd_attrs`` is a
 | 
						|
   sequence of additional attributes to be matched (specified as keyword arguments
 | 
						|
   in the class pattern), ``kwd_patterns`` are the corresponding patterns
 | 
						|
   (specified as keyword values in the class pattern).
 | 
						|
 | 
						|
   This pattern succeeds if the subject is an instance of the nominated class,
 | 
						|
   all positional patterns match the corresponding class-defined attributes, and
 | 
						|
   any specified keyword attributes match their corresponding pattern.
 | 
						|
 | 
						|
   Note: classes may define a property that returns self in order to match a
 | 
						|
   pattern node against the instance being matched. Several builtin types are
 | 
						|
   also matched that way, as described in the match statement documentation.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))],
 | 
						|
                                kwd_attrs=[],
 | 
						|
                                kwd_patterns=[]),
 | 
						|
                            body=[
 | 
						|
                                Expr(
 | 
						|
                                    value=Constant(value=Ellipsis))]),
 | 
						|
                        match_case(
 | 
						|
                            pattern=MatchClass(
 | 
						|
                                cls=Name(id='Point3D', ctx=Load()),
 | 
						|
                                patterns=[],
 | 
						|
                                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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchAs(pattern, name)
 | 
						|
 | 
						|
   A match "as-pattern", capture pattern or wildcard pattern. ``pattern``
 | 
						|
   contains the match pattern that the subject will be matched against.
 | 
						|
   If the pattern is ``None``, the node represents a capture pattern (i.e a
 | 
						|
   bare name) and will always succeed.
 | 
						|
 | 
						|
   The ``name`` attribute contains the name that will be bound if the pattern
 | 
						|
   is successful. If ``name`` is ``None``, ``pattern`` must also be ``None``
 | 
						|
   and the node represents the wildcard pattern.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
.. class:: MatchOr(patterns)
 | 
						|
 | 
						|
   A match "or-pattern". An or-pattern matches each of its subpatterns in turn
 | 
						|
   to the subject, until one succeeds. The or-pattern is then deemed to
 | 
						|
   succeed. If none of the subpatterns succeed the or-pattern fails. The
 | 
						|
   ``patterns`` attribute contains a list of match pattern nodes that will be
 | 
						|
   matched against the subject.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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))])])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
Function and class definitions
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
.. class:: FunctionDef(name, args, body, decorator_list, returns, type_comment)
 | 
						|
 | 
						|
   A function definition.
 | 
						|
 | 
						|
   * ``name`` is a raw string of the function name.
 | 
						|
   * ``args`` is an :class:`arguments` node.
 | 
						|
   * ``body`` is the list of nodes inside the function.
 | 
						|
   * ``decorator_list`` is the list of decorators to be applied, stored outermost
 | 
						|
     first (i.e. the first in the list will be applied last).
 | 
						|
   * ``returns`` is the return annotation.
 | 
						|
 | 
						|
   .. attribute:: type_comment
 | 
						|
 | 
						|
       ``type_comment`` is an optional string with the type annotation as a comment.
 | 
						|
 | 
						|
 | 
						|
.. class:: Lambda(args, body)
 | 
						|
 | 
						|
   ``lambda`` is a minimal function definition that can be used inside an
 | 
						|
   expression. Unlike :class:`FunctionDef`, ``body`` holds a single node.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Expr(
 | 
						|
                    value=Lambda(
 | 
						|
                        args=arguments(
 | 
						|
                            posonlyargs=[],
 | 
						|
                            args=[
 | 
						|
                                arg(arg='x'),
 | 
						|
                                arg(arg='y')],
 | 
						|
                            kwonlyargs=[],
 | 
						|
                            kw_defaults=[],
 | 
						|
                            defaults=[]),
 | 
						|
                        body=Constant(value=Ellipsis)))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)
 | 
						|
 | 
						|
   The arguments for a function.
 | 
						|
 | 
						|
   * ``posonlyargs``, ``args`` and ``kwonlyargs`` are lists of :class:`arg` nodes.
 | 
						|
   * ``vararg`` and ``kwarg`` are single :class:`arg` nodes, referring to the
 | 
						|
     ``*args, **kwargs`` parameters.
 | 
						|
   * ``kw_defaults`` is a list of default values for keyword-only arguments. If
 | 
						|
     one is ``None``, the corresponding argument is required.
 | 
						|
   * ``defaults`` is a list of default values for arguments that can be passed
 | 
						|
     positionally. If there are fewer defaults, they correspond to the last n
 | 
						|
     arguments.
 | 
						|
 | 
						|
 | 
						|
.. class:: arg(arg, annotation, type_comment)
 | 
						|
 | 
						|
   A single argument in a list. ``arg`` is a raw string of the argument
 | 
						|
   name, ``annotation`` is its annotation, such as a :class:`Str` or
 | 
						|
   :class:`Name` node.
 | 
						|
 | 
						|
   .. attribute:: type_comment
 | 
						|
 | 
						|
       ``type_comment`` is an optional string with the type annotation as a comment
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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(
 | 
						|
                        posonlyargs=[],
 | 
						|
                        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'))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Return(value)
 | 
						|
 | 
						|
   A ``return`` statement.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('return 4'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Return(
 | 
						|
                    value=Constant(value=4))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Yield(value)
 | 
						|
           YieldFrom(value)
 | 
						|
 | 
						|
   A ``yield`` or ``yield from`` expression. Because these are expressions, they
 | 
						|
   must be wrapped in a :class:`Expr` node if the value sent back is not used.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('yield x'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Expr(
 | 
						|
                    value=Yield(
 | 
						|
                        value=Name(id='x', ctx=Load())))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('yield from x'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Expr(
 | 
						|
                    value=YieldFrom(
 | 
						|
                        value=Name(id='x', ctx=Load())))],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: Global(names)
 | 
						|
           Nonlocal(names)
 | 
						|
 | 
						|
   ``global`` and ``nonlocal`` statements. ``names`` is a list of raw strings.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('global x,y,z'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Global(
 | 
						|
                    names=[
 | 
						|
                        'x',
 | 
						|
                        'y',
 | 
						|
                        'z'])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
        >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4))
 | 
						|
        Module(
 | 
						|
            body=[
 | 
						|
                Nonlocal(
 | 
						|
                    names=[
 | 
						|
                        'x',
 | 
						|
                        'y',
 | 
						|
                        'z'])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: ClassDef(name, bases, keywords, starargs, kwargs, body, decorator_list)
 | 
						|
 | 
						|
   A class definition.
 | 
						|
 | 
						|
   * ``name`` is a raw string for the class name
 | 
						|
   * ``bases`` is a list of nodes for explicitly specified base classes.
 | 
						|
   * ``keywords`` is a list of :class:`keyword` nodes, principally for 'metaclass'.
 | 
						|
     Other keywords will be passed to the metaclass, as per `PEP-3115
 | 
						|
     <https://www.python.org/dev/peps/pep-3115/>`_.
 | 
						|
   * ``starargs`` and ``kwargs`` are each a single node, as in a function call.
 | 
						|
     starargs will be expanded to join the list of base classes, and kwargs will
 | 
						|
     be passed to the metaclass.
 | 
						|
   * ``body`` is a list of nodes representing the code within the class
 | 
						|
     definition.
 | 
						|
   * ``decorator_list`` is a list of nodes, as in :class:`FunctionDef`.
 | 
						|
 | 
						|
   .. doctest::
 | 
						|
 | 
						|
        >>> 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())])],
 | 
						|
            type_ignores=[])
 | 
						|
 | 
						|
Async and await
 | 
						|
^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
.. class:: AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment)
 | 
						|
 | 
						|
   An ``async def`` function definition. Has the same fields as
 | 
						|
   :class:`FunctionDef`.
 | 
						|
 | 
						|
 | 
						|
.. class:: Await(value)
 | 
						|
 | 
						|
   An ``await`` expression. ``value`` is what it waits for.
 | 
						|
   Only valid in the body of an :class:`AsyncFunctionDef`.
 | 
						|
 | 
						|
.. doctest::
 | 
						|
 | 
						|
    >>> print(ast.dump(ast.parse("""\
 | 
						|
    ... async def f():
 | 
						|
    ...     await other_func()
 | 
						|
    ... """), indent=4))
 | 
						|
    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_ignores=[])
 | 
						|
 | 
						|
 | 
						|
.. class:: AsyncFor(target, iter, body, orelse, type_comment)
 | 
						|
           AsyncWith(items, body, type_comment)
 | 
						|
 | 
						|
   ``async for`` loops and ``async with`` context managers. They have the same
 | 
						|
   fields as :class:`For` and :class:`With`, respectively. Only valid in the
 | 
						|
   body of an :class:`AsyncFunctionDef`.
 | 
						|
 | 
						|
.. note::
 | 
						|
   When a string is parsed by :func:`ast.parse`, operator nodes (subclasses
 | 
						|
   of :class:`ast.operator`, :class:`ast.unaryop`, :class:`ast.cmpop`,
 | 
						|
   :class:`ast.boolop` and :class:`ast.expr_context`) on the returned tree
 | 
						|
   will be singletons. Changes to one will be reflected in all other
 | 
						|
   occurrences of the same value (e.g. :class:`ast.Add`).
 | 
						|
 | 
						|
 | 
						|
:mod:`ast` Helpers
 | 
						|
------------------
 | 
						|
 | 
						|
Apart from the node classes, the :mod:`ast` module defines these utility functions
 | 
						|
and classes for traversing abstract syntax trees:
 | 
						|
 | 
						|
.. function:: parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None)
 | 
						|
 | 
						|
   Parse the source into an AST node.  Equivalent to ``compile(source,
 | 
						|
   filename, mode, ast.PyCF_ONLY_AST)``.
 | 
						|
 | 
						|
   If ``type_comments=True`` is given, the parser is modified to check
 | 
						|
   and return type comments as specified by :pep:`484` and :pep:`526`.
 | 
						|
   This is equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the
 | 
						|
   flags passed to :func:`compile()`.  This will report syntax errors
 | 
						|
   for misplaced type comments.  Without this flag, type comments will
 | 
						|
   be ignored, and the ``type_comment`` field on selected AST nodes
 | 
						|
   will always be ``None``.  In addition, the locations of ``# type:
 | 
						|
   ignore`` comments will be returned as the ``type_ignores``
 | 
						|
   attribute of :class:`Module` (otherwise it is always an empty list).
 | 
						|
 | 
						|
   In addition, if ``mode`` is ``'func_type'``, the input syntax is
 | 
						|
   modified to correspond to :pep:`484` "signature type comments",
 | 
						|
   e.g. ``(str, int) -> List[str]``.
 | 
						|
 | 
						|
   Also, setting ``feature_version`` to a tuple ``(major, minor)``
 | 
						|
   will attempt to parse using that Python version's grammar.
 | 
						|
   Currently ``major`` must equal to ``3``.  For example, setting
 | 
						|
   ``feature_version=(3, 4)`` will allow the use of ``async`` and
 | 
						|
   ``await`` as variable names.  The lowest supported version is
 | 
						|
   ``(3, 4)``; the highest is ``sys.version_info[0:2]``.
 | 
						|
 | 
						|
   If source contains a null character ('\0'), :exc:`ValueError` is raised.
 | 
						|
 | 
						|
    .. warning::
 | 
						|
      Note that succesfully parsing souce code into an AST object doesn't
 | 
						|
      guarantee that the source code provided is valid Python code that can
 | 
						|
      be executed as the compilation step can raise further :exc:`SyntaxError`
 | 
						|
      exceptions. For instance, the source ``return 42`` generates a valid
 | 
						|
      AST node for a return statement, but it cannot be compiled alone (it needs
 | 
						|
      to be inside a function node).
 | 
						|
 | 
						|
      In particular, :func:`ast.parse` won't do any scoping checks, which the
 | 
						|
      compilation step does.
 | 
						|
 | 
						|
   .. warning::
 | 
						|
      It is possible to crash the Python interpreter with a
 | 
						|
      sufficiently large/complex string due to stack depth limitations
 | 
						|
      in Python's AST compiler.
 | 
						|
 | 
						|
   .. versionchanged:: 3.8
 | 
						|
      Added ``type_comments``, ``mode='func_type'`` and ``feature_version``.
 | 
						|
 | 
						|
 | 
						|
.. function:: unparse(ast_obj)
 | 
						|
 | 
						|
   Unparse an :class:`ast.AST` object and generate a string with code
 | 
						|
   that would produce an equivalent :class:`ast.AST` object if parsed
 | 
						|
   back with :func:`ast.parse`.
 | 
						|
 | 
						|
   .. warning::
 | 
						|
      The produced code string will not necessarily be equal to the original
 | 
						|
      code that generated the :class:`ast.AST` object (without any compiler
 | 
						|
      optimizations, such as constant tuples/frozensets).
 | 
						|
 | 
						|
   .. warning::
 | 
						|
      Trying to unparse a highly complex expression would result with
 | 
						|
      :exc:`RecursionError`.
 | 
						|
 | 
						|
   .. versionadded:: 3.9
 | 
						|
 | 
						|
 | 
						|
.. function:: literal_eval(node_or_string)
 | 
						|
 | 
						|
   Safely evaluate an expression node or a string containing a Python literal or
 | 
						|
   container display.  The string or node provided may only consist of the
 | 
						|
   following Python literal structures: strings, bytes, numbers, tuples, lists,
 | 
						|
   dicts, sets, booleans, ``None`` and ``Ellipsis``.
 | 
						|
 | 
						|
   This can be used for safely evaluating strings containing Python values from
 | 
						|
   untrusted sources without the need to parse the values oneself.  It is not
 | 
						|
   capable of evaluating arbitrarily complex expressions, for example involving
 | 
						|
   operators or indexing.
 | 
						|
 | 
						|
   .. warning::
 | 
						|
      It is possible to crash the Python interpreter with a
 | 
						|
      sufficiently large/complex string due to stack depth limitations
 | 
						|
      in Python's AST compiler.
 | 
						|
 | 
						|
      It can raise :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`,
 | 
						|
      :exc:`MemoryError` and :exc:`RecursionError` depending on the malformed
 | 
						|
      input.
 | 
						|
 | 
						|
   .. versionchanged:: 3.2
 | 
						|
      Now allows bytes and set literals.
 | 
						|
 | 
						|
   .. versionchanged:: 3.9
 | 
						|
      Now supports creating empty sets with ``'set()'``.
 | 
						|
 | 
						|
   .. versionchanged:: 3.10
 | 
						|
      For string inputs, leading spaces and tabs are now stripped.
 | 
						|
 | 
						|
 | 
						|
.. function:: get_docstring(node, clean=True)
 | 
						|
 | 
						|
   Return the docstring of the given *node* (which must be a
 | 
						|
   :class:`FunctionDef`, :class:`AsyncFunctionDef`, :class:`ClassDef`,
 | 
						|
   or :class:`Module` node), or ``None`` if it has no docstring.
 | 
						|
   If *clean* is true, clean up the docstring's indentation with
 | 
						|
   :func:`inspect.cleandoc`.
 | 
						|
 | 
						|
   .. versionchanged:: 3.5
 | 
						|
      :class:`AsyncFunctionDef` is now supported.
 | 
						|
 | 
						|
 | 
						|
.. function:: get_source_segment(source, node, *, padded=False)
 | 
						|
 | 
						|
   Get source code segment of the *source* that generated *node*.
 | 
						|
   If some location information (:attr:`lineno`, :attr:`end_lineno`,
 | 
						|
   :attr:`col_offset`, or :attr:`end_col_offset`) is missing, return ``None``.
 | 
						|
 | 
						|
   If *padded* is ``True``, the first line of a multi-line statement will
 | 
						|
   be padded with spaces to match its original position.
 | 
						|
 | 
						|
   .. versionadded:: 3.8
 | 
						|
 | 
						|
 | 
						|
.. function:: fix_missing_locations(node)
 | 
						|
 | 
						|
   When you compile a node tree with :func:`compile`, the compiler expects
 | 
						|
   :attr:`lineno` and :attr:`col_offset` attributes for every node that supports
 | 
						|
   them.  This is rather tedious to fill in for generated nodes, so this helper
 | 
						|
   adds these attributes recursively where not already set, by setting them to
 | 
						|
   the values of the parent node.  It works recursively starting at *node*.
 | 
						|
 | 
						|
 | 
						|
.. function:: increment_lineno(node, n=1)
 | 
						|
 | 
						|
   Increment the line number and end line number of each node in the tree
 | 
						|
   starting at *node* by *n*. This is useful to "move code" to a different
 | 
						|
   location in a file.
 | 
						|
 | 
						|
 | 
						|
.. function:: copy_location(new_node, old_node)
 | 
						|
 | 
						|
   Copy source location (:attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`,
 | 
						|
   and :attr:`end_col_offset`) from *old_node* to *new_node* if possible,
 | 
						|
   and return *new_node*.
 | 
						|
 | 
						|
 | 
						|
.. function:: iter_fields(node)
 | 
						|
 | 
						|
   Yield a tuple of ``(fieldname, value)`` for each field in ``node._fields``
 | 
						|
   that is present on *node*.
 | 
						|
 | 
						|
 | 
						|
.. function:: iter_child_nodes(node)
 | 
						|
 | 
						|
   Yield all direct child nodes of *node*, that is, all fields that are nodes
 | 
						|
   and all items of fields that are lists of nodes.
 | 
						|
 | 
						|
 | 
						|
.. function:: walk(node)
 | 
						|
 | 
						|
   Recursively yield all descendant nodes in the tree starting at *node*
 | 
						|
   (including *node* itself), in no specified order.  This is useful if you only
 | 
						|
   want to modify nodes in place and don't care about the context.
 | 
						|
 | 
						|
 | 
						|
.. class:: NodeVisitor()
 | 
						|
 | 
						|
   A node visitor base class that walks the abstract syntax tree and calls a
 | 
						|
   visitor function for every node found.  This function may return a value
 | 
						|
   which is forwarded by the :meth:`visit` method.
 | 
						|
 | 
						|
   This class is meant to be subclassed, with the subclass adding visitor
 | 
						|
   methods.
 | 
						|
 | 
						|
   .. method:: visit(node)
 | 
						|
 | 
						|
      Visit a node.  The default implementation calls the method called
 | 
						|
      :samp:`self.visit_{classname}` where *classname* is the name of the node
 | 
						|
      class, or :meth:`generic_visit` if that method doesn't exist.
 | 
						|
 | 
						|
   .. method:: generic_visit(node)
 | 
						|
 | 
						|
      This visitor calls :meth:`visit` on all children of the node.
 | 
						|
 | 
						|
      Note that child nodes of nodes that have a custom visitor method won't be
 | 
						|
      visited unless the visitor calls :meth:`generic_visit` or visits them
 | 
						|
      itself.
 | 
						|
 | 
						|
   Don't use the :class:`NodeVisitor` if you want to apply changes to nodes
 | 
						|
   during traversal.  For this a special visitor exists
 | 
						|
   (:class:`NodeTransformer`) that allows modifications.
 | 
						|
 | 
						|
   .. deprecated:: 3.8
 | 
						|
 | 
						|
      Methods :meth:`visit_Num`, :meth:`visit_Str`, :meth:`visit_Bytes`,
 | 
						|
      :meth:`visit_NameConstant` and :meth:`visit_Ellipsis` are deprecated
 | 
						|
      now and will not be called in future Python versions.  Add the
 | 
						|
      :meth:`visit_Constant` method to handle all constant nodes.
 | 
						|
 | 
						|
 | 
						|
.. class:: NodeTransformer()
 | 
						|
 | 
						|
   A :class:`NodeVisitor` subclass that walks the abstract syntax tree and
 | 
						|
   allows modification of nodes.
 | 
						|
 | 
						|
   The :class:`NodeTransformer` will walk the AST and use the return value of
 | 
						|
   the visitor methods to replace or remove the old node.  If the return value
 | 
						|
   of the visitor method is ``None``, the node will be removed from its
 | 
						|
   location, otherwise it is replaced with the return value.  The return value
 | 
						|
   may be the original node in which case no replacement takes place.
 | 
						|
 | 
						|
   Here is an example transformer that rewrites all occurrences of name lookups
 | 
						|
   (``foo``) to ``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
 | 
						|
              )
 | 
						|
 | 
						|
   Keep in mind that if the node you're operating on has child nodes you must
 | 
						|
   either transform the child nodes yourself or call the :meth:`generic_visit`
 | 
						|
   method for the node first.
 | 
						|
 | 
						|
   For nodes that were part of a collection of statements (that applies to all
 | 
						|
   statement nodes), the visitor may also return a list of nodes rather than
 | 
						|
   just a single node.
 | 
						|
 | 
						|
   If :class:`NodeTransformer` introduces new nodes (that weren't part of
 | 
						|
   original tree) without giving them location information (such as
 | 
						|
   :attr:`lineno`), :func:`fix_missing_locations` should be called with
 | 
						|
   the new sub-tree to recalculate the location information::
 | 
						|
 | 
						|
      tree = ast.parse('foo', mode='eval')
 | 
						|
      new_tree = fix_missing_locations(RewriteName().visit(tree))
 | 
						|
 | 
						|
   Usually you use the transformer like this::
 | 
						|
 | 
						|
      node = YourTransformer().visit(node)
 | 
						|
 | 
						|
 | 
						|
.. function:: dump(node, annotate_fields=True, include_attributes=False, *, indent=None)
 | 
						|
 | 
						|
   Return a formatted dump of the tree in *node*.  This is mainly useful for
 | 
						|
   debugging purposes.  If *annotate_fields* is true (by default),
 | 
						|
   the returned string will show the names and the values for fields.
 | 
						|
   If *annotate_fields* is false, the result string will be more compact by
 | 
						|
   omitting unambiguous field names.  Attributes such as line
 | 
						|
   numbers and column offsets are not dumped by default.  If this is wanted,
 | 
						|
   *include_attributes* can be set to true.
 | 
						|
 | 
						|
   If *indent* is a non-negative integer or string, then the tree will be
 | 
						|
   pretty-printed with that indent level.  An indent level
 | 
						|
   of 0, negative, or ``""`` will only insert newlines.  ``None`` (the default)
 | 
						|
   selects the single line representation. Using a positive integer indent
 | 
						|
   indents that many spaces per level.  If *indent* is a string (such as ``"\t"``),
 | 
						|
   that string is used to indent each level.
 | 
						|
 | 
						|
   .. versionchanged:: 3.9
 | 
						|
      Added the *indent* option.
 | 
						|
 | 
						|
 | 
						|
.. _ast-compiler-flags:
 | 
						|
 | 
						|
Compiler Flags
 | 
						|
--------------
 | 
						|
 | 
						|
The following flags may be passed to :func:`compile` in order to change
 | 
						|
effects on the compilation of a program:
 | 
						|
 | 
						|
.. data:: PyCF_ALLOW_TOP_LEVEL_AWAIT
 | 
						|
 | 
						|
   Enables support for top-level ``await``, ``async for``, ``async with``
 | 
						|
   and async comprehensions.
 | 
						|
 | 
						|
   .. versionadded:: 3.8
 | 
						|
 | 
						|
.. data:: PyCF_ONLY_AST
 | 
						|
 | 
						|
   Generates and returns an abstract syntax tree instead of returning a
 | 
						|
   compiled code object.
 | 
						|
 | 
						|
.. data:: PyCF_TYPE_COMMENTS
 | 
						|
 | 
						|
   Enables support for :pep:`484` and :pep:`526` style type comments
 | 
						|
   (``# type: <type>``, ``# type: ignore <stuff>``).
 | 
						|
 | 
						|
   .. versionadded:: 3.8
 | 
						|
 | 
						|
 | 
						|
.. _ast-cli:
 | 
						|
 | 
						|
Command-Line Usage
 | 
						|
------------------
 | 
						|
 | 
						|
.. versionadded:: 3.9
 | 
						|
 | 
						|
The :mod:`ast` module can be executed as a script from the command line.
 | 
						|
It is as simple as:
 | 
						|
 | 
						|
.. code-block:: sh
 | 
						|
 | 
						|
   python -m ast [-m <mode>] [-a] [infile]
 | 
						|
 | 
						|
The following options are accepted:
 | 
						|
 | 
						|
.. program:: ast
 | 
						|
 | 
						|
.. cmdoption:: -h, --help
 | 
						|
 | 
						|
   Show the help message and exit.
 | 
						|
 | 
						|
.. cmdoption:: -m <mode>
 | 
						|
               --mode <mode>
 | 
						|
 | 
						|
   Specify what kind of code must be compiled, like the *mode* argument
 | 
						|
   in :func:`parse`.
 | 
						|
 | 
						|
.. cmdoption:: --no-type-comments
 | 
						|
 | 
						|
   Don't parse type comments.
 | 
						|
 | 
						|
.. cmdoption:: -a, --include-attributes
 | 
						|
 | 
						|
   Include attributes such as line numbers and column offsets.
 | 
						|
 | 
						|
.. cmdoption:: -i <indent>
 | 
						|
               --indent <indent>
 | 
						|
 | 
						|
   Indentation of nodes in AST (number of spaces).
 | 
						|
 | 
						|
If :file:`infile` is specified its contents are parsed to AST and dumped
 | 
						|
to stdout.  Otherwise, the content is read from stdin.
 | 
						|
 | 
						|
 | 
						|
.. seealso::
 | 
						|
 | 
						|
    `Green Tree Snakes <https://greentreesnakes.readthedocs.io/>`_, an external
 | 
						|
    documentation resource, has good details on working with Python ASTs.
 | 
						|
 | 
						|
    `ASTTokens <https://asttokens.readthedocs.io/en/latest/user-guide.html>`_
 | 
						|
    annotates Python ASTs with the positions of tokens and text in the source
 | 
						|
    code that generated them. This is helpful for tools that make source code
 | 
						|
    transformations.
 | 
						|
 | 
						|
    `leoAst.py <http://leoeditor.com/appendices.html#leoast-py>`_ unifies the
 | 
						|
    token-based and parse-tree-based views of python programs by inserting
 | 
						|
    two-way links between tokens and ast nodes.
 | 
						|
 | 
						|
    `LibCST <https://libcst.readthedocs.io/>`_ parses code as a Concrete Syntax
 | 
						|
    Tree that looks like an ast tree and keeps all formatting details. It's
 | 
						|
    useful for building automated refactoring (codemod) applications and
 | 
						|
    linters.
 | 
						|
 | 
						|
    `Parso <https://parso.readthedocs.io>`_ is a Python parser that supports
 | 
						|
    error recovery and round-trip parsing for different Python versions (in
 | 
						|
    multiple Python versions). Parso is also able to list multiple syntax errors
 | 
						|
    in your python file.
 |