ast — Abstrakte Syntaxbäume¶
Quellcode: Lib/ast.py
Das Modul ast hilft Python-Anwendungen bei der Verarbeitung von Bäumen der Python-Grammatik für abstrakte Syntax. Die abstrakte Syntax selbst kann sich mit jeder Python-Version ändern; dieses Modul hilft dabei, programmatisch herauszufinden, wie die aktuelle Grammatik aussieht.
Ein abstrakter Syntaxbaum kann durch Übergabe von ast.PyCF_ONLY_AST als Flag an die eingebaute Funktion compile() oder durch Verwendung der im Modul bereitgestellten Hilfsfunktion parse() generiert werden. Das Ergebnis ist ein Baum von Objekten, deren Klassen alle von ast.AST erben. Ein abstrakter Syntaxbaum kann mit der eingebauten Funktion compile() in ein Python-Codeobjekt kompiliert werden.
Abstrakte Grammatik¶
Die abstrakte Grammatik ist derzeit wie folgt definiert
-- ASDL's 4 builtin types are:
-- identifier, int, string, constant
module Python
{
mod = Module(stmt* body, type_ignore* type_ignores)
| Interactive(stmt* body)
| Expression(expr body)
| FunctionType(expr* argtypes, expr returns)
stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns,
string? type_comment, type_param* type_params)
| AsyncFunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns,
string? type_comment, type_param* type_params)
| ClassDef(identifier name,
expr* bases,
keyword* keywords,
stmt* body,
expr* decorator_list,
type_param* type_params)
| Return(expr? value)
| Delete(expr* targets)
| Assign(expr* targets, expr value, string? type_comment)
| TypeAlias(expr name, type_param* type_params, expr value)
| AugAssign(expr target, operator op, expr value)
-- 'simple' indicates that we annotate simple name without parens
| AnnAssign(expr target, expr annotation, expr? value, int simple)
-- use 'orelse' because else is a keyword in target languages
| For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
| AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment)
| While(expr test, stmt* body, stmt* orelse)
| If(expr test, stmt* body, stmt* orelse)
| With(withitem* items, stmt* body, string? type_comment)
| AsyncWith(withitem* items, stmt* body, string? type_comment)
| Match(expr subject, match_case* cases)
| Raise(expr? exc, expr? cause)
| Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
| TryStar(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody)
| Assert(expr test, expr? msg)
| Import(alias* names)
| ImportFrom(identifier? module, alias* names, int? level)
| Global(identifier* names)
| Nonlocal(identifier* names)
| Expr(expr value)
| Pass | Break | Continue
-- col_offset is the byte offset in the utf8 string the parser uses
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
-- BoolOp() can use left & right?
expr = BoolOp(boolop op, expr* values)
| NamedExpr(expr target, expr value)
| BinOp(expr left, operator op, expr right)
| UnaryOp(unaryop op, expr operand)
| Lambda(arguments args, expr body)
| IfExp(expr test, expr body, expr orelse)
| Dict(expr?* keys, expr* values)
| Set(expr* elts)
| ListComp(expr elt, comprehension* generators)
| SetComp(expr elt, comprehension* generators)
| DictComp(expr key, expr value, comprehension* generators)
| GeneratorExp(expr elt, comprehension* generators)
-- the grammar constrains where yield expressions can occur
| Await(expr value)
| Yield(expr? value)
| YieldFrom(expr value)
-- need sequences for compare to distinguish between
-- x < 4 < 3 and (x < 4) < 3
| Compare(expr left, cmpop* ops, expr* comparators)
| Call(expr func, expr* args, keyword* keywords)
| FormattedValue(expr value, int conversion, expr? format_spec)
| Interpolation(expr value, constant str, int conversion, expr? format_spec)
| JoinedStr(expr* values)
| TemplateStr(expr* values)
| Constant(constant value, string? kind)
-- the following expression can appear in assignment context
| Attribute(expr value, identifier attr, expr_context ctx)
| Subscript(expr value, expr slice, expr_context ctx)
| Starred(expr value, expr_context ctx)
| Name(identifier id, expr_context ctx)
| List(expr* elts, expr_context ctx)
| Tuple(expr* elts, expr_context ctx)
-- can appear only in Subscript
| Slice(expr? lower, expr? upper, expr? step)
-- col_offset is the byte offset in the utf8 string the parser uses
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
expr_context = Load | Store | Del
boolop = And | Or
operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift
| RShift | BitOr | BitXor | BitAnd | FloorDiv
unaryop = Invert | Not | UAdd | USub
cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn
comprehension = (expr target, expr iter, expr* ifs, int is_async)
excepthandler = ExceptHandler(expr? type, identifier? name, stmt* body)
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
arguments = (arg* posonlyargs, arg* args, arg? vararg, arg* kwonlyargs,
expr* kw_defaults, arg? kwarg, expr* defaults)
arg = (identifier arg, expr? annotation, string? type_comment)
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
-- keyword arguments supplied to call (NULL identifier for **kwargs)
keyword = (identifier? arg, expr value)
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
-- import name with optional 'as' alias.
alias = (identifier name, identifier? asname)
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)
withitem = (expr context_expr, expr? optional_vars)
match_case = (pattern pattern, expr? guard, stmt* body)
pattern = MatchValue(expr value)
| MatchSingleton(constant value)
| MatchSequence(pattern* patterns)
| MatchMapping(expr* keys, pattern* patterns, identifier? rest)
| MatchClass(expr cls, pattern* patterns, identifier* kwd_attrs, pattern* kwd_patterns)
| MatchStar(identifier? name)
-- The optional "rest" MatchMapping parameter handles capturing extra mapping keys
| MatchAs(pattern? pattern, identifier? name)
| MatchOr(pattern* patterns)
attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
type_ignore = TypeIgnore(int lineno, string tag)
type_param = TypeVar(identifier name, expr? bound, expr? default_value)
| ParamSpec(identifier name, expr? default_value)
| TypeVarTuple(identifier name, expr? default_value)
attributes (int lineno, int col_offset, int end_lineno, int end_col_offset)
}
Klassendefinitionen für Knoten¶
- class ast.AST¶
Dies ist die Basis aller AST-Knotenklassen. Die tatsächlichen Knotenklassen leiten sich von der Datei
Parser/Python.asdlab, die oben reproduziert wird. Sie sind im C-Modul_astdefiniert und inastneu exportiert.Für jedes Symbol auf der linken Seite der abstrakten Grammatik (z. B.
ast.stmtoderast.expr) ist eine Klasse definiert. Zusätzlich ist für jeden Konstruktor auf der rechten Seite eine Klasse definiert; diese Klassen erben von den Klassen für die Bäume auf der linken Seite. Zum Beispiel erbtast.BinOpvonast.expr. Bei Produktionsregeln mit Alternativen (auch "Summen" genannt) ist die Klasse auf der linken Seite abstrakt: nur Instanzen spezifischer Konstruktorknoten werden jemals erstellt.- _fields¶
Jede konkrete Klasse hat ein Attribut
_fields, das die Namen aller Kindknoten angibt.Jede Instanz einer konkreten Klasse hat ein Attribut für jeden Kindknoten vom Typ, wie er in der Grammatik definiert ist. Zum Beispiel haben Instanzen von
ast.BinOpein Attributleftvom Typast.expr.Wenn diese Attribute in der Grammatik als optional markiert sind (mit einem Fragezeichen), kann der Wert
Nonesein. Wenn Attribute null oder mehr Werte haben können (mit einem Sternchen markiert), werden die Werte als Python-Listen dargestellt. Alle möglichen Attribute müssen vorhanden sein und gültige Werte haben, wenn ein AST mitcompile()kompiliert wird.
- _field_types¶
Das Attribut
_field_typesjeder konkreten Klasse ist ein Wörterbuch, das Feldnamen (wie sie auch in_fieldsaufgeführt sind) ihren Typen zuordnet.>>> ast.TypeVar._field_types {'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None}
Hinzugefügt in Version 3.13.
- lineno¶
- col_offset¶
- end_lineno¶
- end_col_offset¶
Instanzen von Unterklassen von
ast.exprundast.stmthaben die Attributelineno,col_offset,end_linenoundend_col_offset. Die Attributelinenoundend_linenosind die erste und letzte Zeilennummer des Quelltextbereichs (1-indiziert, also ist die erste Zeile Zeile 1) und die Attributecol_offsetundend_col_offsetsind die entsprechenden UTF-8-Byte-Offsets der ersten und letzten Token, die den Knoten erzeugt haben. Der UTF-8-Offset wird aufgezeichnet, da der Parser intern UTF-8 verwendet.Beachten Sie, dass die Endpositionen vom Compiler nicht benötigt werden und daher optional sind. Der Endoffset liegt *nach* dem letzten Symbol, zum Beispiel kann man mit
source_line[node.col_offset : node.end_col_offset]das Quelltextsegment eines einzeiligen Ausdrucksknotens erhalten.
Der Konstruktor einer Klasse
ast.Tparst seine Argumente wie folgtWenn Positionsargumente vorhanden sind, muss ihre Anzahl der Anzahl der Elemente in
T._fieldsentsprechen; sie werden den Attributen dieser Namen zugewiesen.Wenn Schlüsselwortargumente vorhanden sind, werden die Attribute mit denselben Namen auf die angegebenen Werte gesetzt.
Zum Beispiel könnten Sie einen
ast.UnaryOp-Knoten erstellen und füllen, indem Sie Folgendes verwendennode = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0), lineno=0, col_offset=0)
Wenn ein Feld, das in der Grammatik optional ist, im Konstruktor weggelassen wird, ist der Standardwert
None. Wenn ein Listenfeld weggelassen wird, ist der Standardwert die leere Liste. Wenn ein Feld vom Typast.expr_contextweggelassen wird, ist der StandardwertLoad(). Wenn ein anderes Feld weggelassen wird, wird eineDeprecationWarningausgelöst und der AST-Knoten wird dieses Feld nicht haben. In Python 3.15 wird diese Bedingung einen Fehler auslösen.
Geändert in Version 3.8: Die Klasse ast.Constant wird jetzt für alle Konstanten verwendet.
Geändert in Version 3.9: Einfache Indizes werden durch ihren Wert dargestellt, erweiterte Slices werden als Tupel dargestellt.
Geändert in Version 3.14: Die Ausgabe von __repr__() von AST-Knoten enthält die Werte der Knotenflelder.
Veraltet seit Version 3.8: Alte Klassen ast.Num, ast.Str, ast.Bytes, ast.NameConstant und ast.Ellipsis sind weiterhin verfügbar, werden aber in zukünftigen Python-Versionen entfernt. Bis dahin gibt die Instanziierung von ihnen eine Instanz einer anderen Klasse zurück.
Veraltet seit Version 3.9: Alte Klassen ast.Index und ast.ExtSlice sind weiterhin verfügbar, werden aber in zukünftigen Python-Versionen entfernt. Bis dahin gibt die Instanziierung von ihnen eine Instanz einer anderen Klasse zurück.
Veraltet seit Version 3.13, wird in Version 3.15 entfernt: Frühere Versionen von Python erlaubten die Erstellung von AST-Knoten, denen erforderliche Felder fehlten. Ebenso erlaubten AST-Knotenkonstruktoren beliebige Schlüsselwortargumente, die als Attribute des AST-Knotens gesetzt wurden, auch wenn sie keinen der Felder des AST-Knotens entsprachen. Dieses Verhalten ist veraltet und wird in Python 3.15 entfernt.
Hinweis
Die hier angezeigten Beschreibungen der spezifischen Knotentypen wurden ursprünglich aus dem fantastischen Green Tree Snakes-Projekt und all seinen Mitwirkenden übernommen.
Wurzelknoten¶
- class ast.Module(body, type_ignores)¶
Ein Python-Modul, wie bei der Dateieingabe. Knotentyp, der von
ast.parse()im Standardmodus"exec"generiert wird.bodyist eineListeder Anweisungen des Moduls.type_ignoresist eineListeder Typ-Ignor-Kommentare des Moduls; sieheast.parse()für weitere Details.>>> print(ast.dump(ast.parse('x = 1'), indent=4)) Module( body=[ Assign( targets=[ Name(id='x', ctx=Store())], value=Constant(value=1))])
- class ast.Expression(body)¶
Ein einzelner Python-Ausdruckseingabe. Knotentyp, der von
ast.parse()generiert wird, wenn der Modus"eval"ist.bodyist ein einzelner Knoten, einer der Ausdruckstypen.>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) Expression( body=Constant(value=123))
- class ast.Interactive(body)¶
Eine einzelne interaktive Eingabe, wie im Interaktiven Modus. Knotentyp, der von
ast.parse()generiert wird, wenn der Modus"single"ist.bodyist eineListevon Anweisungsknoten.>>> print(ast.dump(ast.parse('x = 1; y = 2', mode='single'), indent=4)) Interactive( body=[ Assign( targets=[ Name(id='x', ctx=Store())], value=Constant(value=1)), Assign( targets=[ Name(id='y', ctx=Store())], value=Constant(value=2))])
- class ast.FunctionType(argtypes, returns)¶
Eine Darstellung von Typkommentaren älterer Art für Funktionen, da Python-Versionen vor 3.5 keine PEP 484-Annotationen unterstützten. Knotentyp, der von
ast.parse()generiert wird, wenn der Modus"func_type"ist.Solche Typkommentare würden wie folgt aussehen
def sum_two_number(a, b): # type: (int, int) -> int return a + b
argtypesist eineListevon Ausdrucksknoten.returnsist ein einzelner Ausdrucksknoten.>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4)) FunctionType( argtypes=[ Name(id='int', ctx=Load()), Name(id='str', ctx=Load())], returns=Subscript( value=Name(id='List', ctx=Load()), slice=Name(id='int', ctx=Load()), ctx=Load()))
Hinzugefügt in Version 3.8.
Literale¶
- class ast.Constant(value)¶
Ein konstanter Wert. Das Attribut
valuedes LiteralsConstantenthält das Python-Objekt, das es repräsentiert. Die dargestellten Werte können Instanzen vonstr,bytes,int,float,complexundboolsein, sowie die KonstantenNoneundEllipsis.>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) Expression( body=Constant(value=123))
- class ast.FormattedValue(value, conversion, format_spec)¶
Knoten, der ein einzelnes Formatierungsfeld in einem f-String darstellt. Wenn der String ein einzelnes Formatierungsfeld und nichts anderes enthält, kann der Knoten isoliert werden, andernfalls erscheint er in
JoinedStr.valueist jeder Ausdrucksknoten (wie ein Literal, eine Variable oder ein Funktionsaufruf).conversionist eine Ganzzahlformat_specist ein Knoten vom TypJoinedStr, der die Formatierung des Werts darstellt, oderNone, wenn keine Formatierung angegeben wurde. Sowohlconversionals auchformat_speckönnen gleichzeitig gesetzt werden.
- class ast.JoinedStr(values)¶
Ein f-String, bestehend aus einer Reihe von Knoten vom Typ
FormattedValueundConstant.>>> print(ast.dump(ast.parse('f"sin({a}) is {sin(a):.3}"', mode='eval'), indent=4)) Expression( body=JoinedStr( values=[ Constant(value='sin('), FormattedValue( value=Name(id='a', ctx=Load()), conversion=-1), Constant(value=') is '), FormattedValue( value=Call( func=Name(id='sin', ctx=Load()), args=[ Name(id='a', ctx=Load())]), conversion=-1, format_spec=JoinedStr( values=[ Constant(value='.3')]))]))
- class ast.TemplateStr(values, /)¶
Hinzugefügt in Version 3.14.
Knoten, der ein Template-String-Literal darstellt, bestehend aus einer Reihe von Knoten vom Typ
InterpolationundConstant. Diese Knoten können in beliebiger Reihenfolge auftreten und müssen nicht verschachtelt sein.>>> expr = ast.parse('t"{name} finished {place:ordinal}"', mode='eval') >>> print(ast.dump(expr, indent=4)) Expression( body=TemplateStr( values=[ Interpolation( value=Name(id='name', ctx=Load()), str='name', conversion=-1), Constant(value=' finished '), Interpolation( value=Name(id='place', ctx=Load()), str='place', conversion=-1, format_spec=JoinedStr( values=[ Constant(value='ordinal')]))]))
- class ast.Interpolation(value, str, conversion, format_spec=None)¶
Hinzugefügt in Version 3.14.
Knoten, der ein einzelnes Interpolationsfeld in einem Template-String-Literal darstellt.
valueist jeder Ausdrucksknoten (wie ein Literal, eine Variable oder ein Funktionsaufruf). Dies hat die gleiche Bedeutung wieFormattedValue.value.strist eine Konstante, die den Text des Interpolationsausdrucks enthält.conversionist eine Ganzzahl-1: keine Konvertierung
97 (
ord('a')):!aASCII-Konvertierung114 (
ord('r')):!rrepr()-Konvertierung115 (
ord('s')):!sString-Konvertierung
Dies hat die gleiche Bedeutung wie
FormattedValue.conversion.format_specist ein Knoten vom TypJoinedStr, der die Formatierung des Werts darstellt, oderNone, wenn keine Formatierung angegeben wurde. Sowohlconversionals auchformat_speckönnen gleichzeitig gesetzt werden. Dies hat die gleiche Bedeutung wieFormattedValue.format_spec.
- class ast.List(elts, ctx)¶
- class ast.Tuple(elts, ctx)¶
Eine Liste oder ein Tupel.
eltsenthält eine Liste von Knoten, die die Elemente darstellen.ctxistStore, wenn der Container ein Zuweisungsziel ist (d. h.(x,y)=something), und andernfallsLoad.>>> print(ast.dump(ast.parse('[1, 2, 3]', mode='eval'), indent=4)) Expression( body=List( elts=[ Constant(value=1), Constant(value=2), Constant(value=3)], ctx=Load())) >>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4)) Expression( body=Tuple( elts=[ Constant(value=1), Constant(value=2), Constant(value=3)], ctx=Load()))
- class ast.Set(elts)¶
Eine Menge.
eltsenthält eine Liste von Knoten, die die Elemente der Menge darstellen.>>> print(ast.dump(ast.parse('{1, 2, 3}', mode='eval'), indent=4)) Expression( body=Set( elts=[ Constant(value=1), Constant(value=2), Constant(value=3)]))
- class ast.Dict(keys, values)¶
Ein Wörterbuch.
keysundvaluesenthalten Listen von Knoten, die die Schlüssel bzw. die Werte in übereinstimmender Reihenfolge darstellen (was bei Aufruf vondictionary.keys()unddictionary.values()zurückgegeben würde).Beim Erweitern von Wörterbüchern mithilfe von Wörterbuchliteralen wird der zu erweiternde Ausdruck in die Liste
valueseingefügt, wobei eineNonean der entsprechenden Position inkeyssteht.>>> 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())]))
Variablen¶
- class ast.Name(id, ctx)¶
Ein Variablenname.
identhält den Namen als Zeichenkette, undctxist einer der folgenden Typen.
- class ast.Load¶
- class ast.Store¶
- class ast.Del¶
Variablenreferenzen können verwendet werden, um den Wert einer Variable zu laden, ihr einen neuen Wert zuzuweisen oder sie zu löschen. Variablenreferenzen erhalten einen Kontext, um diese Fälle zu unterscheiden.
>>> print(ast.dump(ast.parse('a'), indent=4)) Module( body=[ Expr( value=Name(id='a', ctx=Load()))]) >>> print(ast.dump(ast.parse('a = 1'), indent=4)) Module( body=[ Assign( targets=[ Name(id='a', ctx=Store())], value=Constant(value=1))]) >>> print(ast.dump(ast.parse('del a'), indent=4)) Module( body=[ Delete( targets=[ Name(id='a', ctx=Del())])])
- class ast.Starred(value, ctx)¶
Eine
*var-Variablenreferenz.valueenthält die Variable, typischerweise ein Knoten vom TypName. Dieser Typ muss verwendet werden, wenn ein Knoten vom TypCallmit*argsaufgebaut wird.>>> 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()))])
Ausdrücke¶
- class ast.Expr(value)¶
Wenn ein Ausdruck, wie z. B. ein Funktionsaufruf, als eigenständige Anweisung erscheint und sein Rückgabewert nicht verwendet oder gespeichert wird, wird er in diesen Container verpackt.
valueenthält einen der anderen Knoten in diesem Abschnitt, einen Knoten vom TypConstant,Name,Lambda,YieldoderYieldFrom.>>> print(ast.dump(ast.parse('-a'), indent=4)) Module( body=[ Expr( value=UnaryOp( op=USub(), operand=Name(id='a', ctx=Load())))])
- class ast.UnaryOp(op, operand)¶
Eine unäre Operation.
opist der Operator undoperandein beliebiger Ausdrucksknoten.
- class ast.UAdd¶
- class ast.USub¶
- class ast.Not¶
- class ast.Invert¶
Uunäre Operator-Token.
Notist das Schlüsselwortnot,Invertist der Operator~.>>> print(ast.dump(ast.parse('not x', mode='eval'), indent=4)) Expression( body=UnaryOp( op=Not(), operand=Name(id='x', ctx=Load())))
- class ast.BinOp(left, op, right)¶
Eine binäre Operation (wie Addition oder Division).
opist der Operator undleftundrightsind beliebige Ausdrucksknoten.>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4)) Expression( body=BinOp( left=Name(id='x', ctx=Load()), op=Add(), right=Name(id='y', ctx=Load())))
- class ast.Add¶
- class ast.Sub¶
- class ast.Mult¶
- class ast.Div¶
- class ast.FloorDiv¶
- class ast.Mod¶
- class ast.Pow¶
- class ast.LShift¶
- class ast.RShift¶
- class ast.BitOr¶
- class ast.BitXor¶
- class ast.BitAnd¶
- class ast.MatMult¶
Token für binäre Operatoren.
- class ast.BoolOp(op, values)¶
Eine boolesche Operation, "oder" oder "und".
opistOroderAnd.valuessind die beteiligten Werte. Aufeinanderfolgende Operationen mit demselben Operator, wie z.B.a or b or c, werden zu einem Knoten mit mehreren Werten zusammengefasst.Dies beinhaltet nicht
not, welches einUnaryOpist.>>> print(ast.dump(ast.parse('x or y', mode='eval'), indent=4)) Expression( body=BoolOp( op=Or(), values=[ Name(id='x', ctx=Load()), Name(id='y', ctx=Load())]))
- class ast.Compare(left, ops, comparators)¶
Ein Vergleich von zwei oder mehr Werten.
leftist der erste Wert im Vergleich,opsdie Liste der Operatoren undcomparatorsdie Liste der Werte nach dem ersten Element im Vergleich.>>> print(ast.dump(ast.parse('1 <= a < 10', mode='eval'), indent=4)) Expression( body=Compare( left=Constant(value=1), ops=[ LtE(), Lt()], comparators=[ Name(id='a', ctx=Load()), Constant(value=10)]))
- class ast.Eq¶
- class ast.NotEq¶
- class ast.Lt¶
- class ast.LtE¶
- class ast.Gt¶
- class ast.GtE¶
- class ast.Is¶
- class ast.IsNot¶
- class ast.In¶
- class ast.NotIn¶
Token für Vergleichsoperatoren.
- class ast.Call(func, args, keywords)¶
Ein Funktionsaufruf.
funcist die Funktion, die oft einName- oderAttribute-Objekt ist. Von den Argumentenargsenthält eine Liste der positionsweise übergebenen Argumente.keywordsenthält eine Liste vonkeyword-Objekten, die per Schlüsselwort übergebene Argumente darstellen.
Die Argumente
argsundkeywordssind optional und standardmäßig leere Listen.>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4)) Expression( body=Call( func=Name(id='func', ctx=Load()), args=[ Name(id='a', ctx=Load()), Starred( value=Name(id='d', ctx=Load()), ctx=Load())], keywords=[ keyword( arg='b', value=Name(id='c', ctx=Load())), keyword( value=Name(id='e', ctx=Load()))]))
- class ast.keyword(arg, value)¶
Ein Schlüsselwortargument für einen Funktionsaufruf oder eine Klassendefinition.
argist ein Rohstring des Parameternamens,valueist ein zu übergebender Knoten.
- class ast.IfExp(test, body, orelse)¶
Ein Ausdruck wie
a if b else c. Jedes Feld enthält einen einzelnen Knoten, sodass im folgenden Beispiel alle dreiName-Knoten sind.>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4)) Expression( body=IfExp( test=Name(id='b', ctx=Load()), body=Name(id='a', ctx=Load()), orelse=Name(id='c', ctx=Load())))
- class ast.Attribute(value, attr, ctx)¶
Attributzugriff, z.B.
d.keys.valueist ein Knoten, typischerweise einName.attrist ein reiner String, der den Namen des Attributs angibt, undctxistLoad,StoreoderDel, je nachdem, wie auf das Attribut zugegriffen wird.>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4)) Expression( body=Attribute( value=Name(id='snake', ctx=Load()), attr='colour', ctx=Load()))
- class ast.NamedExpr(target, value)¶
Ein benannter Ausdruck. Dieser AST-Knoten wird durch den Zuweisungsoperator (auch bekannt als Walrus-Operator) erzeugt. Im Gegensatz zum
Assign-Knoten, bei dem das erste Argument mehrere Knoten sein kann, müssen in diesem Fall sowohltargetals auchvalueeinzelne Knoten sein.>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4)) Expression( body=NamedExpr( target=Name(id='x', ctx=Store()), value=Constant(value=4)))
Hinzugefügt in Version 3.8.
Subscripting¶
- class ast.Subscript(value, slice, ctx)¶
Ein Subscript, z.B.
l[1].valueist das Objekt, auf das zugegriffen wird (normalerweise Sequenz oder Mapping).sliceist ein Index, Slice oder Schlüssel. Es kann einTuplesein und einenSliceenthalten.ctxistLoad,StoreoderDel, je nach der mit dem Subscript ausgeführten Aktion.>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4)) Expression( body=Subscript( value=Name(id='l', ctx=Load()), slice=Tuple( elts=[ Slice( lower=Constant(value=1), upper=Constant(value=2)), Constant(value=3)], ctx=Load()), ctx=Load()))
- class ast.Slice(lower, upper, step)¶
Reguläres Slicing (in der Form
lower:upperoderlower:upper:step). Kann nur innerhalb des Feldes *slice* vonSubscriptauftreten, entweder direkt oder als Element einesTuple.>>> 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 ast.ListComp(elt, generators)¶
- class ast.SetComp(elt, generators)¶
- class ast.GeneratorExp(elt, generators)¶
- class ast.DictComp(key, value, generators)¶
Listen- und Set-Comprehensions, Generatorausdrücke und Dictionary-Comprehensions.
elt(oderkeyundvalue) ist ein einzelner Knoten, der den Teil darstellt, der für jedes Element ausgewertet wird.generatorsist eine Liste voncomprehension-Knoten.>>> print(ast.dump( ... ast.parse('[x for x in numbers]', mode='eval'), ... indent=4, ... )) Expression( body=ListComp( elt=Name(id='x', ctx=Load()), generators=[ comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), is_async=0)])) >>> print(ast.dump( ... ast.parse('{x: x**2 for x in numbers}', mode='eval'), ... indent=4, ... )) Expression( body=DictComp( key=Name(id='x', ctx=Load()), value=BinOp( left=Name(id='x', ctx=Load()), op=Pow(), right=Constant(value=2)), generators=[ comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), is_async=0)])) >>> print(ast.dump( ... ast.parse('{x for x in numbers}', mode='eval'), ... indent=4, ... )) Expression( body=SetComp( elt=Name(id='x', ctx=Load()), generators=[ comprehension( target=Name(id='x', ctx=Store()), iter=Name(id='numbers', ctx=Load()), is_async=0)]))
- class ast.comprehension(target, iter, ifs, is_async)¶
Eine
for-Klausel in einer Comprehension.targetist die zu verwendende Referenz für jedes Element - typischerweise einName- oderTuple-Knoten.iterist das zu iterierende Objekt.ifsist eine Liste von Testausdrücken: jedefor-Klausel kann mehrereifshaben.is_asyncgibt an, dass die Comprehension asynchron ist (wobeiasync foranstelle vonforverwendet wird). Der Wert ist eine Ganzzahl (0 oder 1).>>> print(ast.dump(ast.parse('[ord(c) for line in file for c in line]', mode='eval'), ... indent=4)) # Multiple comprehensions in one. Expression( body=ListComp( elt=Call( func=Name(id='ord', ctx=Load()), args=[ Name(id='c', ctx=Load())]), generators=[ comprehension( target=Name(id='line', ctx=Store()), iter=Name(id='file', ctx=Load()), is_async=0), comprehension( target=Name(id='c', ctx=Store()), iter=Name(id='line', ctx=Load()), is_async=0)])) >>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'), ... indent=4)) # generator comprehension Expression( body=GeneratorExp( elt=BinOp( left=Name(id='n', ctx=Load()), op=Pow(), right=Constant(value=2)), generators=[ comprehension( target=Name(id='n', ctx=Store()), iter=Name(id='it', ctx=Load()), ifs=[ Compare( left=Name(id='n', ctx=Load()), ops=[ Gt()], comparators=[ Constant(value=5)]), Compare( left=Name(id='n', ctx=Load()), ops=[ Lt()], comparators=[ Constant(value=10)])], is_async=0)])) >>> print(ast.dump(ast.parse('[i async for i in soc]', mode='eval'), ... indent=4)) # Async comprehension Expression( body=ListComp( elt=Name(id='i', ctx=Load()), generators=[ comprehension( target=Name(id='i', ctx=Store()), iter=Name(id='soc', ctx=Load()), is_async=1)]))
Statements¶
- class ast.Assign(targets, value, type_comment)¶
Eine Zuweisung.
targetsist eine Liste von Knoten undvalueist ein einzelner Knoten.Mehrere Knoten in
targetsrepräsentieren die Zuweisung desselben Werts an jeden. Entpacken wird durch Platzieren einesTupleoder einerListinnerhalb vontargetsdargestellt.- type_comment¶
type_commentist ein optionaler String mit der Typen-Annotation als Kommentar.
>>> print(ast.dump(ast.parse('a = b = 1'), indent=4)) # Multiple assignment Module( body=[ Assign( targets=[ Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], value=Constant(value=1))]) >>> print(ast.dump(ast.parse('a,b = c'), indent=4)) # Unpacking Module( body=[ Assign( targets=[ Tuple( elts=[ Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], value=Name(id='c', ctx=Load()))])
- class ast.AnnAssign(target, annotation, value, simple)¶
Eine Zuweisung mit Typen-Annotation.
targetist ein einzelner Knoten und kann einName, einAttributeoder einSubscriptsein.annotationist die Annotation, z.B. einConstant- oderName-Knoten.valueist ein einzelner optionaler Knoten.simpleist immer entweder 0 (was auf ein "komplexes" Ziel hinweist) oder 1 (was auf ein "einfaches" Ziel hinweist). Ein "einfaches" Ziel besteht ausschließlich aus einemName-Knoten, der nicht in Klammern steht; alle anderen Ziele gelten als komplex. Nur einfache Ziele erscheinen im__annotations__-Dictionary von Modulen und Klassen.>>> print(ast.dump(ast.parse('c: int'), indent=4)) Module( body=[ AnnAssign( target=Name(id='c', ctx=Store()), annotation=Name(id='int', ctx=Load()), simple=1)]) >>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis Module( body=[ AnnAssign( target=Name(id='a', ctx=Store()), annotation=Name(id='int', ctx=Load()), value=Constant(value=1), simple=0)]) >>> print(ast.dump(ast.parse('a.b: int'), indent=4)) # Attribute annotation Module( body=[ AnnAssign( target=Attribute( value=Name(id='a', ctx=Load()), attr='b', ctx=Store()), annotation=Name(id='int', ctx=Load()), simple=0)]) >>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation Module( body=[ AnnAssign( target=Subscript( value=Name(id='a', ctx=Load()), slice=Constant(value=1), ctx=Store()), annotation=Name(id='int', ctx=Load()), simple=0)])
- class ast.AugAssign(target, op, value)¶
Erweiterte Zuweisung, z.B.
a += 1. Im folgenden Beispiel isttargeteinName-Knoten fürx(mit demStore-Kontext),opistAddundvalueist einConstantmit dem Wert 1.Das Attribut
targetkann nicht von der KlasseTupleoderListsein, im Gegensatz zu den Zielen vonAssign.>>> print(ast.dump(ast.parse('x += 2'), indent=4)) Module( body=[ AugAssign( target=Name(id='x', ctx=Store()), op=Add(), value=Constant(value=2))])
- class ast.Raise(exc, cause)¶
Eine
raise-Anweisung.excist das zu auslösende Ausnahmeobjekt, normalerweise einCall- oderName-Knoten oderNonefür ein eigenständigesraise.causeist der optionale Teil füryinraise x from y.>>> print(ast.dump(ast.parse('raise x from y'), indent=4)) Module( body=[ Raise( exc=Name(id='x', ctx=Load()), cause=Name(id='y', ctx=Load()))])
- class ast.Assert(test, msg)¶
Eine Assertion.
testenthält die Bedingung, z.B. einenCompare-Knoten.msgenthält die Fehlermeldung.>>> print(ast.dump(ast.parse('assert x,y'), indent=4)) Module( body=[ Assert( test=Name(id='x', ctx=Load()), msg=Name(id='y', ctx=Load()))])
- class ast.Delete(targets)¶
Repräsentiert eine
delAnweisung.targetsist eine Liste von Nodes, wie z.B.Name,AttributeoderSubscriptNodes.>>> print(ast.dump(ast.parse('del x,y,z'), indent=4)) Module( body=[ Delete( targets=[ Name(id='x', ctx=Del()), Name(id='y', ctx=Del()), Name(id='z', ctx=Del())])])
- class ast.Pass¶
Eine
passAnweisung.>>> print(ast.dump(ast.parse('pass'), indent=4)) Module( body=[ Pass()])
- class ast.TypeAlias(name, type_params, value)¶
Ein Typalias, der durch die
typeAnweisung erstellt wurde.nameist der Name des Alias,type_paramsist eine Liste von Typparametern undvalueist der Wert des Typalias.>>> print(ast.dump(ast.parse('type Alias = int'), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), value=Name(id='int', ctx=Load()))])
Hinzugefügt in Version 3.12.
Andere Anweisungen, die nur innerhalb von Funktionen oder Schleifen anwendbar sind, werden in anderen Abschnitten beschrieben.
Imports¶
- class ast.Import(names)¶
Eine Importanweisung.
namesist eine Liste vonaliasNodes.>>> print(ast.dump(ast.parse('import x,y,z'), indent=4)) Module( body=[ Import( names=[ alias(name='x'), alias(name='y'), alias(name='z')])])
- class ast.ImportFrom(module, names, level)¶
Repräsentiert
from x import y.moduleist ein Rohstring des 'from'-Namens, ohne führende Punkte, oderNonefür Anweisungen wiefrom . import foo.levelist eine ganze Zahl, die die Ebene des relativen Imports angibt (0 bedeutet absoluter Import).>>> print(ast.dump(ast.parse('from y import x,y,z'), indent=4)) Module( body=[ ImportFrom( module='y', names=[ alias(name='x'), alias(name='y'), alias(name='z')], level=0)])
- class ast.alias(name, asname)¶
Beide Parameter sind Rohstrings der Namen.
asnamekannNonesein, wenn der reguläre Name verwendet werden soll.>>> 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)])
Kontrollfluss¶
Hinweis
Optionale Klauseln wie else werden als leere Liste gespeichert, wenn sie nicht vorhanden sind.
- class ast.If(test, body, orelse)¶
Eine
ifAnweisung.testenthält einen einzelnen Node, wie z.B. einenCompareNode.bodyundorelseenthalten jeweils eine Liste von Nodes.elifKlauseln haben keine spezielle Darstellung im AST, sondern erscheinen als zusätzlicheIfNodes innerhalb desorelseAbschnitts des vorherigen.>>> print(ast.dump(ast.parse(""" ... if x: ... ... ... elif y: ... ... ... else: ... ... ... """), indent=4)) Module( body=[ If( test=Name(id='x', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))], orelse=[ If( test=Name(id='y', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))], orelse=[ Expr( value=Constant(value=Ellipsis))])])])
- class ast.For(target, iter, body, orelse, type_comment)¶
Eine
forSchleife.targetenthält die Variable(n), an die die Schleife zuweist, als einzelnenName,Tuple,List,AttributeoderSubscriptNode.iterenthält das Element, über das iteriert wird, ebenfalls als einzelnen Node.bodyundorelseenthalten Listen von Nodes, die ausgeführt werden. Die inorelseenthaltenen werden ausgeführt, wenn die Schleife normal beendet wird, anstatt über einebreakAnweisung.- type_comment¶
type_commentist ein optionaler String mit der Typen-Annotation als Kommentar.
>>> print(ast.dump(ast.parse(""" ... for x in y: ... ... ... else: ... ... ... """), indent=4)) Module( body=[ For( target=Name(id='x', ctx=Store()), iter=Name(id='y', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))], orelse=[ Expr( value=Constant(value=Ellipsis))])])
- class ast.While(test, body, orelse)¶
Eine
whileSchleife.testenthält die Bedingung, wie z.B. einenCompareNode.>>> print(ast.dump(ast.parse(""" ... while x: ... ... ... else: ... ... ... """), indent=4)) Module( body=[ While( test=Name(id='x', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))], orelse=[ Expr( value=Constant(value=Ellipsis))])])
- class ast.Break¶
- class ast.Continue¶
Die
breakundcontinueAnweisungen.>>> print(ast.dump(ast.parse("""\ ... for a in b: ... if a > 5: ... break ... else: ... continue ... ... """), indent=4)) Module( body=[ For( target=Name(id='a', ctx=Store()), iter=Name(id='b', ctx=Load()), body=[ If( test=Compare( left=Name(id='a', ctx=Load()), ops=[ Gt()], comparators=[ Constant(value=5)]), body=[ Break()], orelse=[ Continue()])])])
- class ast.Try(body, handlers, orelse, finalbody)¶
tryBlöcke. Alle Attribute sind Listen von auszuführenden Nodes, außerhandlers, was eine Liste vonExceptHandlerNodes ist.>>> print(ast.dump(ast.parse(""" ... try: ... ... ... except Exception: ... ... ... except OtherException as e: ... ... ... else: ... ... ... finally: ... ... ... """), indent=4)) Module( body=[ Try( body=[ Expr( value=Constant(value=Ellipsis))], handlers=[ ExceptHandler( type=Name(id='Exception', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))]), ExceptHandler( type=Name(id='OtherException', ctx=Load()), name='e', body=[ Expr( value=Constant(value=Ellipsis))])], orelse=[ Expr( value=Constant(value=Ellipsis))], finalbody=[ Expr( value=Constant(value=Ellipsis))])])
- class ast.TryStar(body, handlers, orelse, finalbody)¶
tryBlöcke, die vonexcept*Klauseln gefolgt werden. Die Attribute sind die gleichen wie fürTry, aber dieExceptHandlerNodes inhandlerswerden alsexcept*Blöcke anstattexceptinterpretiert.>>> print(ast.dump(ast.parse(""" ... try: ... ... ... except* Exception: ... ... ... """), indent=4)) Module( body=[ TryStar( body=[ Expr( value=Constant(value=Ellipsis))], handlers=[ ExceptHandler( type=Name(id='Exception', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))])])])
Hinzugefügt in Version 3.11.
- class ast.ExceptHandler(type, name, body)¶
Eine einzelne
exceptKlausel.typeist der Exception-Typ, mit dem übereinstimmen soll, typischerweise einNameNode (oderNonefür eine Catch-allexcept:Klausel).nameist ein Rohstring für den Namen, der die Exception aufnehmen soll, oderNone, wenn die Klausel keineas foohat.bodyist eine Liste von Nodes.>>> print(ast.dump(ast.parse("""\ ... try: ... a + 1 ... except TypeError: ... pass ... """), indent=4)) Module( body=[ Try( body=[ Expr( value=BinOp( left=Name(id='a', ctx=Load()), op=Add(), right=Constant(value=1)))], handlers=[ ExceptHandler( type=Name(id='TypeError', ctx=Load()), body=[ Pass()])])])
- class ast.With(items, body, type_comment)¶
Ein
withBlock.itemsist eine Liste vonwithitemNodes, die die Kontextmanager repräsentieren, undbodyist der eingerückte Block innerhalb des Kontexts.- type_comment¶
type_commentist ein optionaler String mit der Typen-Annotation als Kommentar.
- class ast.withitem(context_expr, optional_vars)¶
Ein einzelner Kontextmanager in einem
withBlock.context_exprist der Kontextmanager, oft einCallNode.optional_varsist einName,TupleoderListfür denas fooTeil, oderNone, wenn dieser nicht verwendet wird.>>> 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())]))])])
Mustererkennung¶
- class ast.Match(subject, cases)¶
Eine
matchAnweisung.subjectenthält das Subjekt des Matches (das Objekt, das gegen die Fälle abgeglichen wird) undcasesenthält ein Iterable vonmatch_caseNodes mit den verschiedenen Fällen.Hinzugefügt in Version 3.10.
- class ast.match_case(pattern, guard, body)¶
Ein einzelnes Fallmuster in einer
matchAnweisung.patternenthält das Muster, gegen das das Subjekt abgeglichen wird. Beachten Sie, dass die für Muster erzeugtenASTNodes von denen für Ausdrücke abweichen, auch wenn sie dieselbe Syntax teilen.Das Attribut
guardenthält einen Ausdruck, der ausgewertet wird, wenn das Muster mit dem Subjekt übereinstimmt.bodyenthält eine Liste von Nodes, die ausgeführt werden, wenn das Muster übereinstimmt und das Ergebnis der Auswertung des Guard-Ausdrucks wahr ist.>>> print(ast.dump(ast.parse(""" ... match x: ... case [x] if x>0: ... ... ... case tuple(): ... ... ... """), indent=4)) Module( body=[ Match( subject=Name(id='x', ctx=Load()), cases=[ match_case( pattern=MatchSequence( patterns=[ MatchAs(name='x')]), guard=Compare( left=Name(id='x', ctx=Load()), ops=[ Gt()], comparators=[ Constant(value=0)]), body=[ Expr( value=Constant(value=Ellipsis))]), match_case( pattern=MatchClass( cls=Name(id='tuple', ctx=Load())), body=[ Expr( value=Constant(value=Ellipsis))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchValue(value)¶
Ein Match-Literal- oder Wertmuster, das auf Gleichheit vergleicht.
valueist ein Ausdrucks-Node. Zulässige Wert-Nodes sind eingeschränkt, wie in der Dokumentation der Match-Anweisung beschrieben. Dieses Muster ist erfolgreich, wenn das Match-Subjekt gleich dem ausgewerteten Wert ist.>>> 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))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchSingleton(value)¶
Ein Match-Literal-Muster, das auf Identität vergleicht.
valueist das Singleton, mit dem verglichen werden soll:None,TrueoderFalse. Dieses Muster ist erfolgreich, wenn das Match-Subjekt die gegebene Konstante ist.>>> 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))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchSequence(patterns)¶
Ein Match-Sequenzmuster.
patternsenthält die Muster, die mit den Elementen des Subjekts abgeglichen werden, wenn das Subjekt eine Sequenz ist. Passt auf eine Sequenz variabler Länge, wenn eines der Untermuster einMatchStarNode ist, andernfalls passt es auf eine Sequenz fester Länge.>>> 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))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchStar(name)¶
Passt auf den Rest der Sequenz in einem variablen Längen-Sequenzmuster. Wenn
namenichtNoneist, wird eine Liste, die die verbleibenden Sequenzelemente enthält, an diesen Namen gebunden, wenn das gesamte Sequenzmuster erfolgreich ist.>>> 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))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchMapping(keys, patterns, rest)¶
Ein Match-Mapping-Muster.
keysist eine Sequenz von Ausdrucks-Nodes.patternsist eine entsprechende Sequenz von Muster-Nodes.restist ein optionaler Name, der angegeben werden kann, um die restlichen Mapping-Elemente zu erfassen. Zulässige Schlüssel-Ausdrücke sind eingeschränkt, wie in der Dokumentation der Match-Anweisung beschrieben. Dieses Muster ist erfolgreich, wenn das Subjekt ein Mapping ist, alle ausgewerteten Schlüssel-Ausdrücke im Mapping vorhanden sind und der Wert, der jedem Schlüssel entspricht, mit dem entsprechenden Untermuster übereinstimmt. WennrestnichtNoneist, wird ein Wörterbuch mit den restlichen Mapping-Elementen an diesen Namen gebunden, wenn das gesamte Mapping-Muster erfolgreich ist.Dieses Muster ist erfolgreich, wenn das Subjekt ein Mapping ist, alle ausgewerteten Schlüssel-Ausdrücke im Mapping vorhanden sind und der Wert, der jedem Schlüssel entspricht, mit dem entsprechenden Untermuster übereinstimmt. Wenn
restnichtNoneist, wird ein Wörterbuch mit den restlichen Mapping-Elementen an diesen Namen gebunden, wenn das gesamte Mapping-Muster erfolgreich ist.>>> print(ast.dump(ast.parse(""" ... match x: ... case {1: _, 2: _}: ... ... ... case {**rest}: ... ... ... """), indent=4)) Module( body=[ Match( subject=Name(id='x', ctx=Load()), cases=[ match_case( pattern=MatchMapping( keys=[ Constant(value=1), Constant(value=2)], patterns=[ MatchAs(), MatchAs()]), body=[ Expr( value=Constant(value=Ellipsis))]), match_case( pattern=MatchMapping(rest='rest'), body=[ Expr( value=Constant(value=Ellipsis))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)¶
Ein Match-Klassenmuster.
clsist ein Ausdruck, der die nominale Klasse angibt, die abgeglichen werden soll.patternsist eine Sequenz von Muster-Nodes, die mit den positionsabhängigen Attributen der Klasse abgeglichen werden, die für die Mustererkennung definiert sind.kwd_attrsist eine Sequenz von zusätzlichen Attributen, die abgeglichen werden sollen (angegeben als Schlüsselwortargumente im Klassenmuster),kwd_patternssind die entsprechenden Muster (angegeben als Schlüsselwortwerte im Klassenmuster).Dieses Muster ist erfolgreich, wenn das Subjekt eine Instanz der nominierten Klasse ist, alle Positionsmuster mit den entsprechenden klassen-definierten Attributen übereinstimmen und alle angegebenen Schlüsselwortattribute mit ihren entsprechenden Mustern übereinstimmen.
Hinweis: Klassen können eine Eigenschaft definieren, die self zurückgibt, um ein Muster-Node gegen die abgeglichene Instanz abzugleichen. Mehrere eingebaute Typen werden ebenfalls auf diese Weise abgeglichen, wie in der Dokumentation der Match-Anweisung beschrieben.
>>> print(ast.dump(ast.parse(""" ... match x: ... case Point2D(0, 0): ... ... ... case Point3D(x=0, y=0, z=0): ... ... ... """), indent=4)) Module( body=[ Match( subject=Name(id='x', ctx=Load()), cases=[ match_case( pattern=MatchClass( cls=Name(id='Point2D', ctx=Load()), patterns=[ MatchValue( value=Constant(value=0)), MatchValue( value=Constant(value=0))]), body=[ Expr( value=Constant(value=Ellipsis))]), match_case( pattern=MatchClass( cls=Name(id='Point3D', ctx=Load()), kwd_attrs=[ 'x', 'y', 'z'], kwd_patterns=[ MatchValue( value=Constant(value=0)), MatchValue( value=Constant(value=0)), MatchValue( value=Constant(value=0))]), body=[ Expr( value=Constant(value=Ellipsis))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchAs(pattern, name)¶
Ein Match "as-Muster", Erfassungsmuster oder Wildcard-Muster.
patternenthält das Muster, gegen das das Subjekt abgeglichen wird. Wenn das MusterNoneist, repräsentiert der Node ein Erfassungsmuster (d.h. einen bloßen Namen) und ist immer erfolgreich.Das Attribut
nameenthält den Namen, der gebunden wird, wenn das Muster erfolgreich ist. WennnameNoneist, muss auchpatternNonesein und der Node repräsentiert das Wildcard-Muster.>>> 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))])])])
Hinzugefügt in Version 3.10.
- class ast.MatchOr(patterns)¶
Ein Match "or-Muster". Ein or-Muster gleicht nacheinander jedes seiner Untermuster mit dem Subjekt ab, bis eines erfolgreich ist. Das or-Muster gilt dann als erfolgreich. Wenn keines der Untermuster erfolgreich ist, schlägt das or-Muster fehl. Das Attribut
patternsenthält eine Liste von Match-Muster-Nodes, die mit dem Subjekt abgeglichen werden.>>> 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))])])])
Hinzugefügt in Version 3.10.
Typannotationen¶
- class ast.TypeIgnore(lineno, tag)¶
Ein
# type: ignoreKommentar an lineno. tag ist der optionale Tag, der in der Form# type: ignore <tag>angegeben wird.>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4)) Module( body=[ Assign( targets=[ Name(id='x', ctx=Store())], value=Constant(value=1))], type_ignores=[ TypeIgnore(lineno=1, tag='')]) >>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4)) Module( body=[ AnnAssign( target=Name(id='x', ctx=Store()), annotation=Name(id='bool', ctx=Load()), value=Constant(value=1), simple=1)], type_ignores=[ TypeIgnore(lineno=1, tag='[assignment]')])
Hinweis
TypeIgnoreNodes werden nicht generiert, wenn der Parameter type_comments aufFalse(Standard) gesetzt ist. Sieheast.parse()für weitere Details.Hinzugefügt in Version 3.8.
Typparameter¶
Typparameter können in Klassen, Funktionen und Typaliase vorhanden sein.
- class ast.TypeVar(name, bound, default_value)¶
Ein
typing.TypeVar.nameist der Name der Typvariable.boundsind die Grenzen oder Einschränkungen, falls vorhanden. WennboundeinTupleist, repräsentiert es Einschränkungen; andernfalls repräsentiert es die Grenze.default_valueist der Standardwert; wenn dieTypeVarkeinen Standard hat, wird dieses Attribut aufNonegesetzt.>>> print(ast.dump(ast.parse("type Alias[T: int = bool] = list[T]"), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), type_params=[ TypeVar( name='T', bound=Name(id='int', ctx=Load()), default_value=Name(id='bool', ctx=Load()))], value=Subscript( value=Name(id='list', ctx=Load()), slice=Name(id='T', ctx=Load()), ctx=Load()))])
Hinzugefügt in Version 3.12.
Geändert in Version 3.13: Parameter default_value hinzugefügt.
- class ast.ParamSpec(name, default_value)¶
Ein
typing.ParamSpec.nameist der Name der Parameterspezifikation.default_valueist der Standardwert; wenn dieParamSpeckeinen Standard hat, wird dieses Attribut aufNonegesetzt.>>> print(ast.dump(ast.parse("type Alias[**P = [int, str]] = Callable[P, int]"), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), type_params=[ ParamSpec( name='P', default_value=List( elts=[ Name(id='int', ctx=Load()), Name(id='str', ctx=Load())], ctx=Load()))], value=Subscript( value=Name(id='Callable', ctx=Load()), slice=Tuple( elts=[ Name(id='P', ctx=Load()), Name(id='int', ctx=Load())], ctx=Load()), ctx=Load()))])
Hinzugefügt in Version 3.12.
Geändert in Version 3.13: Parameter default_value hinzugefügt.
- class ast.TypeVarTuple(name, default_value)¶
Ein
typing.TypeVarTuple.nameist der Name des Typvariablentupels.default_valueist der Standardwert; wenn dieTypeVarTuplekeinen Standard hat, wird dieses Attribut aufNonegesetzt.>>> print(ast.dump(ast.parse("type Alias[*Ts = ()] = tuple[*Ts]"), indent=4)) Module( body=[ TypeAlias( name=Name(id='Alias', ctx=Store()), type_params=[ TypeVarTuple( name='Ts', default_value=Tuple(ctx=Load()))], value=Subscript( value=Name(id='tuple', ctx=Load()), slice=Tuple( elts=[ Starred( value=Name(id='Ts', ctx=Load()), ctx=Load())], ctx=Load()), ctx=Load()))])
Hinzugefügt in Version 3.12.
Geändert in Version 3.13: Parameter default_value hinzugefügt.
Funktions- und Klassendefinitionen¶
- class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)¶
Eine Funktionsdefinition.
nameist ein Rohstring des Funktionsnamens.argsist einargumentsNode.bodyist die Liste der Nodes innerhalb der Funktion.decorator_listist die Liste der anzuwendenden Decorators, äußerste zuerst gespeichert (d.h. der erste in der Liste wird zuletzt angewendet).returnsist die Rückgabeannotation.type_paramsist eine Liste von Typparametern.
- type_comment¶
type_commentist ein optionaler String mit der Typen-Annotation als Kommentar.
Geändert in Version 3.12:
type_paramshinzugefügt.
- class ast.Lambda(args, body)¶
lambdaist eine minimale Funktionsdefinition, die innerhalb eines Ausdrucks verwendet werden kann. Im Gegensatz zuFunctionDefenthältbodyeinen einzelnen Node.>>> print(ast.dump(ast.parse('lambda x,y: ...'), indent=4)) Module( body=[ Expr( value=Lambda( args=arguments( args=[ arg(arg='x'), arg(arg='y')]), body=Constant(value=Ellipsis)))])
- class ast.arguments(posonlyargs, args, vararg, kwonlyargs, kw_defaults, kwarg, defaults)¶
Die Argumente einer Funktion.
posonlyargs,argsundkwonlyargssind Listen vonargNodes.varargundkwargsind einzelneargNodes, die sich auf die*args, **kwargsParameter beziehen.kw_defaultsist eine Liste von Standardwerten für Keyword-Only-Argumente. Wenn einer davonNoneist, ist das entsprechende Argument erforderlich.defaultsist eine Liste von Standardwerten für Argumente, die positionsweise übergeben werden können. Wenn es weniger Standardwerte gibt, entsprechen sie den letzten n Argumenten.
- Klasse ast.arg(arg, annotation, type_comment)¶
Ein einzelnes Argument in einer Liste.
argist ein roher String des Argumentnamens;annotationist seine Annotation, z.B. einName-Knoten.- type_comment¶
type_commentist ein optionaler String mit der Typ-Annotation als Kommentar
>>> print(ast.dump(ast.parse("""\ ... @decorator1 ... @decorator2 ... def f(a: 'annotation', b=1, c=2, *d, e, f=3, **g) -> 'return annotation': ... pass ... """), indent=4)) Module( body=[ FunctionDef( name='f', args=arguments( args=[ arg( arg='a', annotation=Constant(value='annotation')), arg(arg='b'), arg(arg='c')], vararg=arg(arg='d'), kwonlyargs=[ arg(arg='e'), arg(arg='f')], kw_defaults=[ None, Constant(value=3)], kwarg=arg(arg='g'), defaults=[ Constant(value=1), Constant(value=2)]), body=[ Pass()], decorator_list=[ Name(id='decorator1', ctx=Load()), Name(id='decorator2', ctx=Load())], returns=Constant(value='return annotation'))])
- Klasse ast.Return(value)¶
Eine
return-Anweisung.>>> print(ast.dump(ast.parse('return 4'), indent=4)) Module( body=[ Return( value=Constant(value=4))])
- Klasse ast.Yield(value)¶
- Klasse ast.YieldFrom(value)¶
Ein
yield- oderyield from-Ausdruck. Da dies Ausdrücke sind, müssen sie in einemExpr-Knoten verpackt werden, wenn der zurückgegebene Wert nicht verwendet wird.>>> print(ast.dump(ast.parse('yield x'), indent=4)) Module( body=[ Expr( value=Yield( value=Name(id='x', ctx=Load())))]) >>> print(ast.dump(ast.parse('yield from x'), indent=4)) Module( body=[ Expr( value=YieldFrom( value=Name(id='x', ctx=Load())))])
- Klasse ast.Global(names)¶
- Klasse ast.Nonlocal(names)¶
global- undnonlocal-Anweisungen.namesist eine Liste von rohen Strings.>>> print(ast.dump(ast.parse('global x,y,z'), indent=4)) Module( body=[ Global( names=[ 'x', 'y', 'z'])]) >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) Module( body=[ Nonlocal( names=[ 'x', 'y', 'z'])])
- Klasse ast.ClassDef(name, bases, keywords, body, decorator_list, type_params)¶
Eine Klassendefinition.
nameist ein roher String für den Klassennamenbasesist eine Liste von Knoten für explizit angegebene Basisklassen.keywordsist eine Liste vonkeyword-Knoten, hauptsächlich für 'metaclass'. Andere Schlüsselwörter werden an die Metaklasse weitergegeben, gemäß PEP 3115.bodyist eine Liste von Knoten, die den Code innerhalb der Klassendefinition darstellen.decorator_listist eine Liste von Knoten, wie inFunctionDef.type_paramsist eine Liste von Typparametern.
>>> 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())])])
Geändert in Version 3.12:
type_paramshinzugefügt.
Async und await¶
- Klasse ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)¶
Eine
async def-Funktionsdefinition. Hat die gleichen Felder wieFunctionDef.Geändert in Version 3.12:
type_paramshinzugefügt.
- Klasse ast.Await(value)¶
Ein
await-Ausdruck.valueist, worauf gewartet wird. Nur gültig im Körper einerAsyncFunctionDef.
>>> print(ast.dump(ast.parse("""\
... async def f():
... await other_func()
... """), indent=4))
Module(
body=[
AsyncFunctionDef(
name='f',
args=arguments(),
body=[
Expr(
value=Await(
value=Call(
func=Name(id='other_func', ctx=Load()))))])])
- Klasse ast.AsyncFor(target, iter, body, orelse, type_comment)¶
- Klasse ast.AsyncWith(items, body, type_comment)¶
async for-Schleifen undasync with-Kontextmanager. Sie haben die gleichen Felder wieForundWith, jeweils. Nur gültig im Körper einerAsyncFunctionDef.
Hinweis
Wenn ein String von ast.parse() geparst wird, sind Operator-Knoten (Unterklassen von ast.operator, ast.unaryop, ast.cmpop, ast.boolop und ast.expr_context) im zurückgegebenen Baum Einzelstücke. Änderungen an einem werden sich in allen anderen Vorkommen desselben Werts widerspiegeln (z.B. ast.Add).
ast-Helfer¶
Abgesehen von den Knotentypen definiert das ast-Modul diese Hilfsfunktionen und Klassen zum Durchlaufen abstrakter Syntaxbäume
- ast.parse(source, filename='<unbekannt>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)¶
Parst den Quellcode in einen AST-Knoten. Entspricht
compile(source, filename, mode, flags=FLAGS_VALUE, optimize=optimize), wobeiFLAGS_VALUEast.PyCF_ONLY_ASTist, wennoptimize <= 0undast.PyCF_OPTIMIZED_ASTandernfalls.Wenn
type_comments=Trueübergeben wird, wird der Parser modifiziert, um Typ-Kommentare gemäß PEP 484 und PEP 526 zu überprüfen und zurückzugeben. Dies entspricht dem Hinzufügen vonast.PyCF_TYPE_COMMENTSzu den ancompile()übergebenen Flags. Dies meldet Syntaxfehler für fehlplatzierte Typ-Kommentare. Ohne dieses Flag werden Typ-Kommentare ignoriert, und das Feldtype_commentauf ausgewählten AST-Knoten ist immerNone. Zusätzlich werden die Positionen von# type: ignore-Kommentaren alstype_ignores-Attribut vonModulezurückgegeben (andernfalls ist es immer eine leere Liste).Zusätzlich, wenn
mode'func_type'ist, wird die Eingabesyntax modifiziert, um den "Signaturtyp-Kommentaren" von PEP 484 zu entsprechen, z.B.(str, int) -> List[str].Wenn
feature_versionauf ein Tupel(major, minor)gesetzt wird, wird ein "Best-Effort"-Versuch unternommen, die Grammatik dieser Python-Version zu parsen. Zum Beispiel wird durch Setzen vonfeature_version=(3, 9)versucht, das Parsen vonmatch-Anweisungen zu unterbinden. Derzeit mussmajorgleich3sein. Die niedrigste unterstützte Version ist(3, 7)(und dies kann sich in zukünftigen Python-Versionen erhöhen); die höchste istsys.version_info[0:2]. "Best-Effort"-Versuch bedeutet, dass keine Garantie besteht, dass das Parsen (oder der Erfolg des Parsens) derselbe ist wie bei Ausführung auf der Python-Version, diefeature_versionentspricht.Wenn die Quelle ein Nullzeichen (
\0) enthält, wirdValueErrorausgelöst.Warnung
Beachten Sie, dass das erfolgreiche Parsen von Quellcode in ein AST-Objekt nicht garantiert, dass der bereitgestellte Quellcode gültiger Python-Code ist, der ausgeführt werden kann, da der Kompilierungsschritt weitere
SyntaxError-Ausnahmen auslösen kann. Zum Beispiel generiert der Quellcodereturn 42einen gültigen AST-Knoten für eine return-Anweisung, aber er kann nicht allein kompiliert werden (er muss sich innerhalb eines Funktionsknotens befinden).Insbesondere führt
ast.parse()keine Gültigkeitsbereichsprüfungen durch, was der Kompilierungsschritt tut.Warnung
Es ist möglich, den Python-Interpreter mit einem ausreichend großen/komplexen String aufgrund von Stapeltiefenbeschränkungen im AST-Compiler von Python zum Absturz zu bringen.
Geändert in Version 3.8: Hinzugefügt:
type_comments,mode='func_type'undfeature_version.Geändert in Version 3.13: Die minimale unterstützte Version für
feature_versionist jetzt(3, 7). Das Argumentoptimizewurde hinzugefügt.
- ast.unparse(ast_obj)¶
Entparst ein
ast.AST-Objekt und generiert einen String mit Code, der ein äquivalentesast.AST-Objekt erzeugen würde, wenn es mitast.parse()zurückgeparst wird.Warnung
Der erzeugte Code-String wird nicht unbedingt mit dem ursprünglichen Code übereinstimmen, der das
ast.AST-Objekt generiert hat (ohne Compiler-Optimierungen, wie z.B. konstante Tupel/Frozensets).Warnung
Der Versuch, einen sehr komplexen Ausdruck zu entparsen, würde zu einem
RecursionErrorführen.Hinzugefügt in Version 3.9.
- ast.literal_eval(node_or_string)¶
Wertet einen Ausdrucksknoten oder einen String aus, der nur ein Python-Literal oder eine Containeranzeige enthält. Der bereitgestellte String oder Knoten darf nur aus den folgenden Python-Literalstrukturen bestehen: Strings, Bytes, Zahlen, Tupel, Listen, Dictionaries, Sets, Booleans,
NoneundEllipsis.Dies kann verwendet werden, um Strings auszuwerten, die Python-Werte enthalten, ohne dass die Werte selbst geparst werden müssen. Es ist nicht in der Lage, beliebig komplexe Ausdrücke auszuwerten, z.B. solche, die Operatoren oder Indizierungen beinhalten.
Diese Funktion wurde in der Vergangenheit als "sicher" dokumentiert, ohne zu definieren, was das bedeutet. Das war irreführend. Sie ist speziell dafür konzipiert, keinen Python-Code auszuführen, im Gegensatz zur allgemeineren Funktion
eval(). Es gibt keinen Namensraum, keine Namensauflösungen und keine Möglichkeit, nach außen zu rufen. Aber sie ist nicht frei von Angriffen: Eine relativ kleine Eingabe kann zu Speichererschöpfung oder C-Stapelerschöpfung führen und den Prozess abstürzen lassen. Es gibt auch die Möglichkeit einer übermäßigen CPU-Auslastung als Denial-of-Service bei einigen Eingaben. Daher wird die Verwendung auf nicht vertrauenswürdigen Daten nicht empfohlen.Warnung
Es ist möglich, den Python-Interpreter aufgrund von Stapeltiefenbeschränkungen im AST-Compiler von Python zum Absturz zu bringen.
Sie kann
ValueError,TypeError,SyntaxError,MemoryErrorundRecursionErrorauslösen, abhängig von der fehlerhaften Eingabe.Geändert in Version 3.2: Erlaubt jetzt Byte- und Set-Literale.
Geändert in Version 3.9: Unterstützt jetzt die Erstellung leerer Sets mit
'set()'.Geändert in Version 3.10: Bei String-Eingaben werden führende Leerzeichen und Tabs jetzt gestrippt.
- ast.get_docstring(node, clean=True)¶
Gibt den Docstring des gegebenen *Knotens* zurück (der ein
FunctionDef-,AsyncFunctionDef-,ClassDef- oderModule-Knoten sein muss) oderNone, wenn er keinen Docstring hat. Wenn *clean* wahr ist, wird die Einrückung des Docstrings mitinspect.cleandoc()bereinigt.Geändert in Version 3.5:
AsyncFunctionDefwird jetzt unterstützt.
- ast.get_source_segment(source, node, *, padded=False)¶
Gibt das Quellcode-Segment des *Quellcodes* zurück, der *Knoten* generiert hat. Wenn einige Standortinformationen (
lineno,end_lineno,col_offsetoderend_col_offset) fehlen, wirdNonezurückgegeben.Wenn *padded*
Trueist, wird die erste Zeile einer mehrzeiligen Anweisung mit Leerzeichen aufgefüllt, um ihre ursprüngliche Position anzupassen.Hinzugefügt in Version 3.8.
- ast.fix_missing_locations(node)¶
Wenn Sie einen Knotentreis mit
compile()kompilieren, erwartet der Compilerlinenoundcol_offsetAttribute für jeden unterstützenden Knoten. Dies ist mühsam für generierte Knoten, daher fügt dieser Helfer diese Attribute rekursiv hinzu, wo sie noch nicht gesetzt sind, indem er sie auf die Werte des Elternknotens setzt. Er arbeitet rekursiv beginnend bei *node*.
- ast.increment_lineno(node, n=1)¶
Inkrementiert die Zeilennummer und die Endzeilennummer jedes Knotens im Baum, beginnend bei *node*, um *n* erhöht. Dies ist nützlich, um "Code" an eine andere Stelle in einer Datei zu verschieben.
- ast.copy_location(new_node, old_node)¶
Kopiert die Quellposition (
lineno,col_offset,end_linenoundend_col_offset) von *old_node* nach *new_node*, wenn möglich, und gibt *new_node* zurück.
- ast.iter_fields(node)¶
Gibt ein Tupel aus
(fieldname, value)für jedes Feld innode._fieldszurück, das auf *node* vorhanden ist.
- ast.iter_child_nodes(node)¶
Gibt alle direkten Kindknoten von *node* zurück, d.h. alle Felder, die Knoten sind, und alle Elemente von Feldern, die Listen von Knoten sind.
- ast.walk(node)¶
Gibt rekursiv alle Nachfahrenknoten im Baum beginnend bei *node* (einschließlich *node* selbst) zurück, in keiner bestimmten Reihenfolge. Dies ist nützlich, wenn Sie nur Knoten vor Ort ändern möchten und sich nicht um den Kontext kümmern.
- Klasse ast.NodeVisitor¶
Eine Basisklasse für Knotenviseure, die den abstrakten Syntaxbaum durchläuft und eine Viseurfunktion für jeden gefundenen Knoten aufruft. Diese Funktion kann einen Wert zurückgeben, der von der Methode
visit()weitergegeben wird.Diese Klasse ist zur Unterklassifizierung gedacht, wobei die Unterklasse Viseurmethoden hinzufügt.
- visit(node)¶
Besucht einen Knoten. Die Standardimplementierung ruft die Methode namens
self.visit_classnameauf, wobei *classname* der Name der Knotenklasse ist, odergeneric_visit(), wenn diese Methode nicht existiert.
- generic_visit(node)¶
Dieser Viseur ruft
visit()für alle Kinder des Knotens auf.Beachten Sie, dass Kindknoten von Knoten, die eine benutzerdefinierte Viseurmethode haben, nicht besucht werden, es sei denn, der Viseur ruft
generic_visit()auf oder besucht sie selbst.
- visit_Constant(node)¶
Behandelt alle Konstantenknoten.
Verwenden Sie den
NodeVisitornicht, wenn Sie Änderungen an Knoten während der Traversal vornehmen möchten. Dafür gibt es einen speziellen Viseur (NodeTransformer), der Modifikationen erlaubt.Veraltet seit Version 3.8: Die Methoden
visit_Num(),visit_Str(),visit_Bytes(),visit_NameConstant()undvisit_Ellipsis()sind veraltet und werden in zukünftigen Python-Versionen nicht mehr aufgerufen. Fügen Sie die Methodevisit_Constant()hinzu, um alle Konstantenknoten zu behandeln.
- Klasse ast.NodeTransformer¶
Eine
NodeVisitor-Unterklasse, die den abstrakten Syntaxbaum durchläuft und die Modifikation von Knoten ermöglicht.Der
NodeTransformerdurchläuft den AST und verwendet den Rückgabewert der Besuchermethoden, um den alten Knoten zu ersetzen oder zu entfernen. Wenn der Rückgabewert der BesuchermethodeNoneist, wird der Knoten an seiner Stelle entfernt, andernfalls wird er durch den Rückgabewert ersetzt. Der Rückgabewert kann der ursprüngliche Knoten sein, in diesem Fall findet keine Ersetzung statt.Hier ist ein Beispiel-Transformer, der alle Vorkommen von Namensverweisen (
foo) indata['foo']umschreibt.class RewriteName(NodeTransformer): def visit_Name(self, node): return Subscript( value=Name(id='data', ctx=Load()), slice=Constant(value=node.id), ctx=node.ctx )
Beachten Sie, dass, wenn der Knoten, mit dem Sie arbeiten, Kindknoten hat, Sie entweder die Kindknoten selbst transformieren oder zuerst die Methode
generic_visit()für den Knoten aufrufen müssen.Für Knoten, die Teil einer Sammlung von Anweisungen waren (was auf alle Anweisungsknoten zutrifft), kann der Besucher auch eine Liste von Knoten anstelle eines einzelnen Knotens zurückgeben.
Wenn
NodeTransformerneue Knoten einführt (die nicht Teil des ursprünglichen Baums waren), ohne ihnen Standortinformationen (wielineno) zu geben, solltefix_missing_locations()mit dem neuen Teilbaum aufgerufen werden, um die Standortinformationen neu zu berechnen.tree = ast.parse('foo', mode='eval') new_tree = fix_missing_locations(RewriteName().visit(tree))
Normalerweise verwendet man den Transformer so:
node = YourTransformer().visit(node)
- ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)¶
Gibt eine formatierte Ausgabe des Baums in node zurück. Dies ist hauptsächlich für Debugging-Zwecke nützlich. Wenn annotate_fields auf wahr gesetzt ist (standardmäßig), zeigt die zurückgegebene Zeichenkette die Namen und Werte für Felder an. Wenn annotate_fields auf falsch gesetzt ist, ist die Ergebniszeichenkette kompakter, indem eindeutige Feldnamen weggelassen werden. Attribute wie Zeilennummern und Spaltenoffsets werden standardmäßig nicht ausgegeben. Wenn dies gewünscht wird, kann include_attributes auf wahr gesetzt werden.
Wenn indent eine nicht-negative Ganzzahl oder eine Zeichenkette ist, wird der Baum mit diesem Einrückungslevel schön formatiert. Ein Einrückungslevel von 0, negativ oder
""fügt nur Zeilenumbrüche ein.None(Standard) wählt die einzeilige Darstellung. Die Verwendung einer positiven Ganzzahl für die Einrückung rückt jeden Level um diese Anzahl von Leerzeichen ein. Wenn indent eine Zeichenkette ist (wie z.B."\t"), wird diese Zeichenkette verwendet, um jeden Level einzurücken.Wenn show_empty auf falsch gesetzt ist (Standard), werden optionale leere Listen aus der Ausgabe weggelassen. Optionale
None-Werte werden immer weggelassen.Geändert in Version 3.9: Die Option indent wurde hinzugefügt.
Geändert in Version 3.13: Die Option show_empty wurde hinzugefügt.
>>> print(ast.dump(ast.parse("""\ ... async def f(): ... await other_func() ... """), indent=4, show_empty=True)) Module( body=[ AsyncFunctionDef( name='f', args=arguments( posonlyargs=[], args=[], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[ Expr( value=Await( value=Call( func=Name(id='other_func', ctx=Load()), args=[], keywords=[])))], decorator_list=[], type_params=[])], type_ignores=[])
Compiler-Flags¶
Die folgenden Flags können an compile() übergeben werden, um die Auswirkungen auf die Kompilierung eines Programms zu ändern
- ast.PyCF_ALLOW_TOP_LEVEL_AWAIT¶
Ermöglicht die Unterstützung für Top-Level
await,async for,async withund asynchrone Comprehensions.Hinzugefügt in Version 3.8.
- ast.PyCF_ONLY_AST¶
Generiert und gibt einen abstrakten Syntaxbaum anstelle eines kompilierten Codeobjekts zurück.
- ast.PyCF_OPTIMIZED_AST¶
Der zurückgegebene AST ist gemäß dem Argument optimize in
compile()oderast.parse()optimiert.Hinzugefügt in Version 3.13.
- ast.PyCF_TYPE_COMMENTS¶
Ermöglicht die Unterstützung für Typ-Kommentare im Stil von PEP 484 und PEP 526 (
# type: <type>,# type: ignore <stuff>).Hinzugefügt in Version 3.8.
- ast.compare(a, b, /, *, compare_attributes=False)¶
Vergleicht rekursiv zwei ASTs.
compare_attributes beeinflusst, ob AST-Attribute beim Vergleich berücksichtigt werden. Wenn compare_attributes auf
False(Standard) gesetzt ist, werden Attribute ignoriert. Andernfalls müssen sie alle gleich sein. Diese Option ist nützlich, um zu überprüfen, ob die ASTs strukturell gleich sind, sich aber in Leerzeichen oder ähnlichen Details unterscheiden. Attribute umfassen Zeilennummern und Spaltenoffsets.Hinzugefügt in Version 3.14.
Verwendung über die Kommandozeile¶
Hinzugefügt in Version 3.9.
Das Modul ast kann als Skript über die Kommandozeile ausgeführt werden. Es ist so einfach wie
python -m ast [-m <mode>] [-a] [infile]
Die folgenden Optionen werden akzeptiert:
- -h, --help¶
Zeigt die Hilfemeldung an und beendet das Programm.
- -m <mode>¶
- --mode <mode>¶
Gibt an, welche Art von Code kompiliert werden muss, ähnlich wie das mode-Argument in
parse().
- --no-type-comments¶
Typ-Kommentare nicht parsen.
- -a, --include-attributes¶
Attribute wie Zeilennummern und Spaltenoffsets einschließen.
- --feature-version <version>¶
Python-Version im Format 3.x (z.B. 3.10). Standardmäßig die aktuelle Version des Interpreters.
Hinzugefügt in Version 3.14.
- -O <level>¶
- --optimize <level>¶
Optimierungsstufe für den Parser. Standardmäßig keine Optimierung.
Hinzugefügt in Version 3.14.
- --show-empty¶
Leere Listen und Felder, die
Nonesind, anzeigen. Standardmäßig werden leere Objekte nicht angezeigt.Hinzugefügt in Version 3.14.
Wenn infile angegeben ist, werden dessen Inhalte in einen AST geparst und auf stdout ausgegeben. Andernfalls werden die Inhalte von stdin gelesen.
Siehe auch
Green Tree Snakes, eine externe Dokumentationsressource, bietet gute Details zur Arbeit mit Python ASTs.
ASTTokens annotiert Python ASTs mit den Positionen von Tokens und Text im Quellcode, der sie generiert hat. Dies ist hilfreich für Werkzeuge, die Quellcode-Transformationen durchführen.
leoAst.py vereinheitlicht die tokenbasierte und die parse-tree-basierte Sicht von Python-Programmen, indem zweiseitige Links zwischen Tokens und AST-Knoten eingefügt werden.
LibCST parst Code als Concrete Syntax Tree, der einem AST ähnelt, und behält alle Formatierungsdetails bei. Es ist nützlich für die Erstellung automatisierter Refactoring- (Codemod-) Anwendungen und Linter.
Parso ist ein Python-Parser, der Fehlerkorrektur und Round-Trip-Parsing für verschiedene Python-Versionen (in mehreren Python-Versionen) unterstützt. Parso kann auch mehrere Syntaxfehler in Ihrer Python-Datei auflisten.