ast — Abstrakta syntaxträd¶
Källkod: Lib/ast.py
Modulen ast hjälper Python-program att bearbeta träd av Pythons abstrakta syntaxgrammatik. Den abstrakta syntaxen i sig kan ändras med varje Python-version; den här modulen hjälper till att programmatiskt ta reda på hur den aktuella grammatiken ser ut.
Ett abstrakt syntaxträd kan genereras genom att skicka ast.PyCF_ONLY_AST som en flagga till den inbyggda funktionen compile(), eller genom att använda hjälpen parse() som finns i den här modulen. Resultatet blir ett träd av objekt vars klasser alla ärver från ast.AST. Ett abstrakt syntaxträd kan kompileras till ett Python-kodobjekt med hjälp av den inbyggda funktionen compile().
Abstrakt grammatik¶
Den abstrakta grammatiken definieras för närvarande på följande sätt:
-- 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)
}
Klasser för noder¶
- class ast.AST¶
Detta är basen för alla AST-nodklasser. De faktiska nodklasserna härleds från filen
Parser/Python.asdl, som reproduceras above. De definieras i C-modulen_astoch exporteras på nytt iast.Det finns en klass definierad för varje symbol på vänstersidan i den abstrakta grammatiken (t.ex.
ast.stmtellerast.expr). Dessutom finns det en klass definierad för varje konstruktör på högersidan; dessa klasser ärver från klasserna för vänstersidans träd. Till exempel ärverast.BinOpfrånast.expr. För produktionsregler med alternativ (även kallade ”summor”) är klassen på vänster sida abstrakt: endast instanser av specifika konstruktörsnoder skapas någonsin.- _fields¶
Varje konkret klass har ett attribut
_fieldssom anger namnen på alla underordnade noder.Varje instans av en konkret klass har ett attribut för varje underordnad nod, av den typ som definieras i grammatiken. Exempelvis har instanser av
ast.BinOpett attributleftav typenast.expr.Om dessa attribut är markerade som valfria i grammatiken (med ett frågetecken) kan värdet vara
None. Om attributen kan ha noll eller fler värden (markerade med en asterisk), representeras värdena som Python-listor. Alla möjliga attribut måste finnas och ha giltiga värden när man kompilerar en AST medcompile().
- _field_types¶
Attributet
_field_typespå varje konkret klass är en ordbok som mappar fältnamn (som också listas i_fields) till deras typer.>>> ast.TypeVar._field_types {'name': <class 'str'>, 'bound': ast.expr | None, 'default_value': ast.expr | None}
Tillagd i version 3.13.
- lineno¶
- col_offset¶
- end_lineno¶
- end_col_offset¶
Instanser av underklasserna
ast.exprochast.stmthar attributenlineno,col_offset,end_linenoochend_col_offset. Attributenlinenoochend_linenoär det första och sista radnumret i källtexten (1-indexerat så att den första raden är rad 1) och attributencol_offsetochend_col_offsetär motsvarande UTF-8-byteoffset för den första och sista tokens som genererade noden. UTF-8-offset registreras eftersom parsern använder UTF-8 internt.Observera att slutpositionerna inte krävs av kompilatorn och därför är valfria. Slutoffsetet är efter den sista symbolen, till exempel kan man få källsegmentet för en nod med enradigt uttryck med hjälp av
source_line[node.col_offset : node.end_col_offset].
Konstruktören för en klass
ast.Tanalyserar sina argument på följande sätt:Om det finns positionella argument måste det finnas lika många som det finns objekt i
T._fields; de kommer att tilldelas som attribut till dessa namn.Om det finns nyckelordsargument kommer de att ställa in attributen med samma namn till de angivna värdena.
Om du till exempel vill skapa och fylla i en
ast.UnaryOp-nod kan du användanode = ast.UnaryOp(ast.USub(), ast.Constant(5, lineno=0, col_offset=0), lineno=0, col_offset=0)
Om ett fält som är valfritt i grammatiken utelämnas från konstruktorn, blir standardvärdet
None. Om ett listfält utelämnas är standardvärdet den tomma listan. Om ett fält av typenast.expr_contextutelämnas, blir standardvärdetLoad(). Om något annat fält utelämnas, kommer enDeprecationWarningatt visas och AST-noden kommer inte att ha detta fält. I Python 3.15 kommer detta villkor att ge upphov till ett fel.
Ändrad i version 3.8: Klassen ast.Constant används nu för alla konstanter.
Ändrad i version 3.9: Enkla index representeras av sitt värde, extended slices representeras som tupler.
Ändrad i version 3.14: Utmatningen __repr__() av AST-noder innehåller värdena för nodfälten.
Föråldrad sedan version 3.8: Gamla klasser ast.Num, ast.Str, ast.Bytes, ast.NameConstant och ast.Ellipsis är fortfarande tillgängliga, men de kommer att tas bort i framtida Python-versioner. Under tiden kommer instansiering av dem att returnera en instans av en annan klass.
Föråldrad sedan version 3.9: Gamla klasser ast.Index och ast.ExtSlice är fortfarande tillgängliga, men de kommer att tas bort i framtida Python-versioner. Under tiden kommer instansiering av dem att returnera en instans av en annan klass.
Deprecated since version 3.13, will be removed in version 3.15: Tidigare versioner av Python tillät skapandet av AST-noder som saknade obligatoriska fält. På samma sätt tillät AST-nodkonstruktörer godtyckliga nyckelordsargument som sattes som attribut för AST-noden, även om de inte matchade något av fälten i AST-noden. Detta beteende är föråldrat och kommer att tas bort i Python 3.15.
Anteckning
Beskrivningarna av de specifika nodklasserna som visas här anpassades ursprungligen från det fantastiska projektet Green Tree Snakes och alla dess bidragsgivare.
Rotnoder¶
- class ast.Module(body, type_ignores)¶
En Python-modul, som med file input. Nodtyp genererad av
ast.parse()i standard"exec"mode.bodyär enlistaav modulens Specifikation.type_ignoresär enlistaöver modulens kommentarer för ignorerade typer; seast.parse()för mer information.>>> 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)¶
En enda Python uttrycksinmatning. Nodtyp som genereras av
ast.parse()när mode är"eval".bodyär en enskild nod, en av uttryckstyperna.>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) Expression( body=Constant(value=123))
- class ast.Interactive(body)¶
En enda interaktiv inmatning, som i Interaktivt läge. Nodtyp som genereras av
ast.parse()när mode är"single".bodyär enlistav statement nodes.>>> 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)¶
En representation av en gammal typkommentar för funktioner, eftersom Python-versioner före 3.5 inte hade stöd för PEP 484-annoteringar. Nodtyp som genereras av
ast.parse()när mode är"func_type".En sådan typ av kommentarer skulle se ut så här:
def sum_two_number(a, b): # typ: (int, int) -> int returnerar a + b
argtypesär enlistav uttrycksnoder.returnsär en enda uttrycksnod.>>> 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()))
Tillagd i version 3.8.
Bokstäver¶
- class ast.Constant(value)¶
Ett konstant värde. Attributet
valueförConstantliteralen innehåller det Python-objekt som den representerar. De värden som representeras kan vara instanser avstr,bytes,int,float,complexochbool, samt konstanternaNoneochEllipsis.>>> print(ast.dump(ast.parse('123', mode='eval'), indent=4)) Expression( body=Constant(value=123))
- class ast.FormattedValue(value, conversion, format_spec)¶
Nod som representerar ett enda formateringsfält i en f-sträng. Om strängen innehåller ett enda formateringsfält och inget annat kan noden isoleras, annars visas den i
JoinedStr.värdeär vilken uttrycksnod som helst (t.ex. en bokstav, en variabel eller ett funktionsanrop).konverteringär ett heltal:format_specär enJoinedStr-nod som representerar formateringen av värdet, ellerNoneom inget format har angetts. Bådeconversionochformat_speckan anges samtidigt.
- class ast.JoinedStr(values)¶
En f-sträng som består av en serie
FormattedValue- ochConstant-noder.>>> 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, /)¶
Tillagd i version 3.14.
Nod som representerar en mallsträngliteral, bestående av en serie
Interpolation- ochConstant-noder. Dessa noder kan vara i valfri ordning och behöver inte vara sammanflätade.>>> 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)¶
Tillagd i version 3.14.
Nod som representerar ett enskilt interpoleringsfält i en mallsträngliteral.
valueär vilken uttrycksnod som helst (t.ex. en litteral, en variabel eller ett funktionsanrop). Detta har samma betydelse somFormattedValue.value.strär en konstant som innehåller texten i interpoleringsuttrycket.konverteringär ett heltal:-1: ingen konvertering
97 (
ord('a')):!aASCII-konvertering114 (
ord('r')):!rrepr()-konvertering115 (
ord('s')):!sstring-konvertering
Detta har samma betydelse som
FormattedValue.conversion.format_specär enJoinedStr-nod som representerar formateringen av värdet, ellerNoneom inget format har angetts. Bådeconversionochformat_speckan anges samtidigt. Detta har samma betydelse somFormattedValue.format_spec.
- class ast.List(elts, ctx)¶
- class ast.Tuple(elts, ctx)¶
En lista eller tupel.
eltsinnehåller en lista med noder som representerar elementen.ctxärStore`om behållaren är ett mål för en tilldelning (dvs.(x,y)=något), ochLoad`annars.>>> 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)¶
En uppsättning.
eltsinnehåller en lista med noder som representerar setets element.>>> 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)¶
En ordbok.
keysochvaluesinnehåller listor med noder som representerar nycklarna respektive värdena, i matchande ordning (vad som skulle returneras vid anrop avdictionary.keys()ochdictionary.values()).Vid uppackning av ordböcker med hjälp av ordbokslitteraler hamnar det uttryck som ska expanderas i listan
values, med enNonepå motsvarande position ikeys.>>> 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())]))
Variabler¶
- class ast.Name(id, ctx)¶
Ett variabelnamn.
idinnehåller namnet som en sträng, ochctxär en av följande typer.
- class ast.Load¶
- class ast.Store¶
- class ast.Del¶
Variabelreferenser kan användas för att ladda en variabels värde, tilldela den ett nytt värde eller ta bort den. Variabelreferenser ges ett sammanhang för att skilja dessa fall åt.
>>> 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)¶
En
*varvariabelreferens.valueinnehåller variabeln, vanligtvis enName-nod. Denna typ måste användas när man bygger enCall-nod med*args.>>> print(ast.dump(ast.parse('a, *b = it'), indent=4)) Module( body=[ Assign( targets=[ Tuple( elts=[ Name(id='a', ctx=Store()), Starred( value=Name(id='b', ctx=Store()), ctx=Store())], ctx=Store())], value=Name(id='it', ctx=Load()))])
Uttryck¶
- class ast.Expr(value)¶
När ett uttryck, t.ex. ett funktionsanrop, visas som en egen sats utan att dess returvärde används eller lagras, omsluts det av denna container.
valueinnehåller en av de andra noderna i detta avsnitt, enConstant, enName, enLambda, enYieldellerYieldFromnod.>>> 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)¶
En unär operation.
opär operatorn ochoperanden uttrycksnod.
- class ast.UAdd¶
- class ast.USub¶
- class ast.Not¶
- class ast.Invert¶
Unära operatortokens.
Notär nyckelordetnot,Invertär operatorn~.>>> 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)¶
En binär operation (som addition eller division).
opär operatorn, ochleftochrightär valfria uttrycksnoder.>>> 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¶
Tokens för binära operatorer.
- class ast.BoolOp(op, values)¶
En boolesk operation, ”eller” eller ”och”.
opärOrellerAnd.valuesär de involverade värdena. På varandra följande operationer med samma operator, t.ex.a eller b eller c, slås samman till en nod med flera värden.Detta inkluderar inte
not, som är enUnaryOp.>>> 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)¶
En jämförelse av två eller flera värden.
leftär det första värdet i jämförelsen,opslistan med operatorer ochcomparatorslistan med värden efter det första elementet i jämförelsen.>>> 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¶
Tokens för jämförelseoperator.
- class ast.Call(func, args, keywords)¶
Ett anrop av en funktion.
funcär funktionen, som ofta kommer att vara ettNameellerAttributeobjekt. Av argumenten:argsinnehåller en lista över de argument som skickas med position.keywordsinnehåller en lista medkeyword-objekt som representerar argument som skickas med keyword.
Argumenten
argsochkeywordsär valfria och är som standard tomma listor.>>> 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)¶
Ett nyckelordsargument till ett funktionsanrop eller en klassdefinition.
argär en rå sträng med parameternamnet,valueär en nod att skicka in.
- class ast.IfExp(test, body, orelse)¶
Ett uttryck som
a if b else c. Varje fält innehåller en enda nod, så i följande exempel är alla treName-noder.>>> 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)¶
Attributåtkomst, t.ex.
d.keys.valueär en nod, vanligtvis enName.atträr en naken sträng som anger namnet på attributet, ochctxärLoad,StoreellerDelberoende på hur attributet används.>>> 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)¶
Ett namngivet uttryck. Denna AST-nod produceras av operatorn för assignment-uttryck (även känd som valrossoperatorn). I motsats till
Assign-noden där det första argumentet kan vara flera noder, måste i detta fall bådetargetochvaluevara enstaka noder.>>> print(ast.dump(ast.parse('(x := 4)', mode='eval'), indent=4)) Expression( body=NamedExpr( target=Name(id='x', ctx=Store()), value=Constant(value=4)))
Tillagd i version 3.8.
Subskription¶
- class ast.Subscript(value, slice, ctx)¶
Ett index, t.ex.
l[1].valueär det subskriberade objektet (vanligtvis sekvens eller mappning).liceär ett index, en skiva eller en nyckel. Det kan vara enTupleoch innehålla enSlice.ctxärLoad,StoreellerDelberoende på vilken åtgärd som utförs med subskriptionen.>>> 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)¶
Vanlig skärning (på formen
lower:upperellerlower:upper:step). Kan endast förekomma i fältet slice iSubscript, antingen direkt eller som ett element iTuple.>>> 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()))
Förståelse¶
- class ast.ListComp(elt, generators)¶
- class ast.SetComp(elt, generators)¶
- class ast.GeneratorExp(elt, generators)¶
- class ast.DictComp(key, value, generators)¶
List- och set-förståelser, generatoruttryck och ordboksförståelser.
elt(ellerkeyochvalue) är en enda nod som representerar den del som kommer att utvärderas för varje objekt.generatorsär en lista avcomprehensionnoder.>>> 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)¶
En
for-sats i en förståelse.targetär referensen som ska användas för varje element - vanligtvis enNameellerTuple-nod.iterär objektet som ska itereras över.ifsär en lista med testuttryck: varjefor-sats kan ha fleraifs.is_asyncindikerar att en förståelse är asynkron (använder enasync foristället förfor). Värdet är ett heltal (0 eller 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)]))
Specifikation¶
- class ast.Assign(targets, value, type_comment)¶
En tilldelning.
targetsär en lista med noder ochvalueär en enskild nod.Flera noder i
targetsrepresenterar att tilldela samma värde till alla. Uppackning representeras genom att sätta enTupleellerListinomtargets.- type_comment¶
type_commentär en valfri sträng med typannoteringen som en 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)¶
Ett uppdrag med en typannotering.
targetär en enskild nod och kan vara enName, enAttributeeller enSubscript.annotationär annoteringen, t.ex. en nod av typenConstantellerName.valueär en enskild valfri nod.simpleär alltid antingen 0 (indikerar ett ”komplext” mål) eller 1 (indikerar ett ”enkelt” mål). Ett ”enkelt” mål består enbart av enName-nod som inte förekommer inom parentes; alla andra mål betraktas som komplexa. Endast enkla mål visas i__annotations__-ordlistan över moduler och klasser.>>> 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)¶
Förstärkt tilldelning, t.ex.
a += 1. I följande exempel ärtargetenName-nod förx(medStore-kontexten),opärAdd, ochvalueär enConstantmed värdet 1.Attributet
targetkan inte vara av klassTupleellerList, till skillnad från målen iAssign.>>> 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)¶
Ett
raise-uttryck.excär det undantagsobjekt som ska genereras, normalt ettCallellerName, ellerNoneför ett friståenderaise.causeär den valfria delen föryiraise 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)¶
Ett påstående.
testinnehåller villkoret, t.ex. enCompare-nod.msginnehåller felmeddelandet.>>> 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)¶
Representerar ett
del-uttryck.targetsär en lista med noder, till exempelName,AttributeellerSubscript-noder.>>> 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¶
Ett ”godkänt” uttalande.
>>> print(ast.dump(ast.parse('pass'), indent=4)) Module( body=[ Pass()])
- class ast.TypeAlias(name, type_params, value)¶
Ett type-alias som skapas genom
type-satsen.nameär namnet på aliaset,type_paramsär en lista med type-parametrar, ochvalueär värdet på typaliaset.>>> 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()))])
Tillagd i version 3.12.
Andra uttalanden som endast är tillämpliga inom funktioner eller loopar beskrivs i andra avsnitt.
Importer¶
- class ast.Import(names)¶
En importförklaring.
namesär en lista medalias-noder.>>> 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)¶
Representerar
from x import y.moduleär en rå sträng av ’from’-namnet, utan några inledande punkter, ellerNoneför uttalanden somfrom . import foo.levelär ett heltal som anger nivån på den relativa importen (0 betyder absolut 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)¶
Båda parametrarna är råa strängar av namnen.
asnamekan varaNoneom det vanliga namnet ska användas.>>> 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)])
Kontrollflöde¶
Anteckning
Valfria klausuler som else lagras som en tom lista om de inte finns med.
- class ast.If(test, body, orelse)¶
En
if-sats.testinnehåller en enda nod, t.ex. enCompare-nod.bodyochorelseinnehåller var och en en lista med noder.elif-klausuler har ingen särskild representation i AST, utan visas istället som extraIf-noder inomorelse-sektionen i den föregående.>>> 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)¶
En
for-slinga.targetinnehåller den eller de variabler som slingan tilldelar, som en endaName,Tuple,List,AttributeellerSubscript-nod.iterinnehåller det objekt som ska slingas, återigen som en enda nod.bodyochorelseinnehåller listor över noder som ska exekveras. De iorelseexekveras om slingan avslutas normalt, snarare än via ettbreak-uttryck.- type_comment¶
type_commentär en valfri sträng med typannoteringen som en 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)¶
En
while-slinga.testinnehåller villkoret, till exempel enCompare-nod.>>> 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¶
Uttalandena
brytochfortsätt.>>> 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)¶
försökblock. Alla attribut är listor över noder som ska köras, utomhandlers, som är en lista överExceptHandler-noder.>>> print(ast.dump(ast.parse(""" ... try: ... ... ... except Exception: ... ... ... except OtherException as e: ... ... ... else: ... ... ... finally: ... ... ... """), indent=4)) Module( body=[ Try( body=[ Expr( value=Constant(value=Ellipsis))], handlers=[ ExceptHandler( type=Name(id='Exception', ctx=Load()), body=[ Expr( value=Constant(value=Ellipsis))]), ExceptHandler( type=Name(id='OtherException', ctx=Load()), name='e', body=[ Expr( value=Constant(value=Ellipsis))])], orelse=[ Expr( value=Constant(value=Ellipsis))], finalbody=[ Expr( value=Constant(value=Ellipsis))])])
- class ast.TryStar(body, handlers, orelse, finalbody)¶
try-block som följs avexcept*-klausuler. Attributen är desamma som förTry, menExceptHandler-noderna ihandlerstolkas somexcept*-block istället förexcept.>>> 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))])])])
Tillagd i version 3.11.
- class ast.ExceptHandler(type, name, body)¶
En enda
exceptklausul.typeär undantagstypen som den kommer att matcha, vanligtvis enNamenod (ellerNoneför en catch-allexcept:klausul).nameär en rå sträng för namnet på undantaget, ellerNoneom klausulen inte haras foo.bodyär en lista med noder.>>> 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)¶
Ett
with-block.itemsär en lista medwithitem-noder som representerar kontext hanterarna, ochbodyär det indragna blocket inuti kontexten.- type_comment¶
type_commentär en valfri sträng med typannoteringen som en kommentar.
- class ast.withitem(context_expr, optional_vars)¶
En enda kontextmanager i ett
with-block.context_exprär kontextmanagern, ofta enCall-nod.optional_varsär enName,TupleellerListför delenas foo, ellerNoneom den inte används.>>> 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())]))])])
Mönstermatchning¶
- class ast.Match(subject, cases)¶
Ett
match-uttryck.subjectinnehåller ämnet för matchningen (objektet som matchas mot fallen) ochcasesinnehåller en iterabel avmatch_case-noder med olika fall.Tillagd i version 3.10.
- class ast.match_case(pattern, guard, body)¶
Ett enda fallmönster i ett
match-uttryck.patterninnehåller det mönster som objektet ska matchas mot. Observera attAST-noder som skapas för mönster skiljer sig från de som skapas för uttryck, även om de har samma syntax.Attributet
guardinnehåller ett uttryck som kommer att utvärderas om mönstret matchar ämnet.bodyinnehåller en lista med noder som ska köras om mönstret matchar och resultatet av utvärderingen av guard-uttrycket är sant.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchValue(value)¶
Ett matchande bokstavs- eller värdemönster som jämförs genom likhet.
valueär en uttrycksnod. Tillåtna värdenoder är begränsade enligt beskrivningen i dokumentationen för match-satsen. Det här mönstret lyckas om matchningsobjektet är lika med det utvärderade värdet.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchSingleton(value)¶
Ett litterärt matchningsmönster som jämför med identitet.
valueär den singleton som ska jämföras mot:None,True, ellerFalse. Detta mönster lyckas om matchningsobjektet är den givna konstanten.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchSequence(patterns)¶
Ett matchningsmönster för en sekvens.
patternsinnehåller de mönster som ska matchas mot ämneselementen om ämnet är en sekvens. Matchar en sekvens med variabel längd om ett av undermönstren är enMatchStar-nod, annars matchas en sekvens med fast längd.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchStar(name)¶
Matchar resten av sekvensen i ett matchsekvensmönster med variabel längd. Om
nameinte ärNone, binds en lista som innehåller de återstående sekvenselementen till det namnet om det övergripande sekvensmönstret är framgångsrikt.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchMapping(keys, patterns, rest)¶
Ett matchande mappningsmönster.
keysär en sekvens av uttrycksnoder.patternsär en motsvarande sekvens av mönsternoder.restär ett valfritt namn som kan anges för att fånga de återstående mappningselementen. Tillåtna nyckeluttryck begränsas på det sätt som beskrivs i dokumentationen för match statement.Detta mönster lyckas om ämnet är en mappning, alla utvärderade nyckeluttryck finns i mappningen och värdet som motsvarar varje nyckel matchar motsvarande undermönster. Om
restinte ärNone, binds en dict som innehåller de återstående mappningselementen till namnet om det övergripande mappningsmönstret är framgångsrikt.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)¶
Ett matchningsmönster för klass.
clsär ett uttryck som anger den nominella klass som skall matchas.patternsär en sekvens av mönsternoder som skall matchas mot den klassdefinierade sekvensen av attribut för mönstermatchning.kwd_attrsär en sekvens av ytterligare attribut som skall matchas (specificerade som nyckelordsargument i klassmönstret),kwd_patternsär motsvarande mönster (specificerade som nyckelordsvärden i klassmönstret).Detta mönster lyckas om ämnet är en instans av den nominerade klassen, alla positionsmönster matchar motsvarande klassdefinierade attribut och alla angivna nyckelordsattribut matchar motsvarande mönster.
Observera: Klasser kan definiera en egenskap som returnerar self för att matcha en mönsternod mot den instans som ska matchas. Flera inbyggda typer matchas också på detta sätt, vilket beskrivs i dokumentationen för match statement.
>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchAs(pattern, name)¶
En matchning ”som mönster”, fångstmönster eller jokerteckenmönster.
patterninnehåller det matchningsmönster som ämnet kommer att matchas mot. Om mönstret ärNonerepresenterar noden ett fångstmönster (dvs. ett tomt namn) och kommer alltid att lyckas.Attributet
nameinnehåller det namn som kommer att bindas om mönstret är framgångsrikt. OmnameärNonemåstepatternockså varaNoneoch noden representerar wildcard-mönstret.>>> 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))])])])
Tillagd i version 3.10.
- class ast.MatchOr(patterns)¶
En matchning ”eller-mönster”. Ett eller-mönster matchar vart och ett av sina undermönster i tur och ordning till ämnet, tills ett lyckas. Då anses or-mönstret vara framgångsrikt. Om inget av undermönstren lyckas misslyckas or-mönstret. Attributet
patternsinnehåller en lista över matchningsmönsternoder som kommer att matchas mot subjektet.>>> 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))])])])
Tillagd i version 3.10.
Typ av anteckningar¶
- class ast.TypeIgnore(lineno, tag)¶
En
# type: ignorekommentar som finns på lineno. tag är den valfria tagg som anges av formuläret# type: ignore <tag>.>>> print(ast.dump(ast.parse('x = 1 # type: ignore', type_comments=True), indent=4)) Module( body=[ Assign( targets=[ Name(id='x', ctx=Store())], value=Constant(value=1))], type_ignores=[ TypeIgnore(lineno=1, tag='')]) >>> print(ast.dump(ast.parse('x: bool = 1 # type: ignore[assignment]', type_comments=True), indent=4)) Module( body=[ AnnAssign( target=Name(id='x', ctx=Store()), annotation=Name(id='bool', ctx=Load()), value=Constant(value=1), simple=1)], type_ignores=[ TypeIgnore(lineno=1, tag='[assignment]')])
Anteckning
TypeIgnore-noder genereras inte när parametern type_comments är inställd påFalse(standard). Seast.parse()för mer information.Tillagd i version 3.8.
Typ av parametrar¶
Typ-parametrar kan finnas i klasser, funktioner och typaliaser.
- class ast.TypeVar(name, bound, default_value)¶
En
typing.TypeVar.nameär namnet på typvariabeln.boundär bindningen eller begränsningarna, om sådana finns. Omboundär enTuplerepresenterar den begränsningar; annars representerar den bindningen.default_valueär standardvärdet; omTypeVarinte har något standardvärde kommer detta attribut att sättas tillNone.>>> 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()))])
Tillagd i version 3.12.
Ändrad i version 3.13: Parametern default_value har lagts till.
- class ast.ParamSpec(name, default_value)¶
En
typing.ParamSpec.nameär namnet på parameterspecifikationen.default_valueär standardvärdet; omParamSpecinte har något standardvärde kommer detta attribut att sättas tillNone.>>> 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()))])
Tillagd i version 3.12.
Ändrad i version 3.13: Parametern default_value har lagts till.
- class ast.TypeVarTuple(name, default_value)¶
En
typing.TypeVarTuple.nameär namnet på typvariabeln tuple.default_valueär standardvärdet; omTypeVarTupleinte har något standardvärde kommer detta attribut att sättas tillNone.>>> 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()))])
Tillagd i version 3.12.
Ändrad i version 3.13: Parametern default_value har lagts till.
Funktions- och klassdefinitioner¶
- class ast.FunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)¶
En funktionsdefinition.
nameär en rå sträng med funktionens namn.argsär en nod iarguments.bodyär listan över noder i funktionen.decorator_listär listan över dekoratorer som ska tillämpas, lagrade längst ut först (dvs. den första i listan kommer att tillämpas sist).returnsär returannoteringen.type_paramsär en lista med typ-parametrar.
- type_comment¶
type_commentär en valfri sträng med typannoteringen som en kommentar.
Ändrad i version 3.12: Lagt till
type_params.
- class ast.Lambda(args, body)¶
lambdaär en minimal funktionsdefinition som kan användas inuti ett uttryck. Till skillnad frånFunctionDefinnehållerbodyen enda nod.>>> 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)¶
Argumenten för en funktion.
posonlyargs,argsochkwonlyargsär listor avarg-noder.varargochkwargär enskildaarg-noder som refererar till parametrarna*args, **kwargs.kw_defaultsär en lista med standardvärden för argument som endast innehåller nyckelord. Om ett ärNonekrävs motsvarande argument.defaultsär en lista med standardvärden för argument som kan skickas positionellt. Om det finns färre standardvärden motsvarar de de sista n argumenten.
- class ast.arg(arg, annotation, type_comment)¶
Ett enskilt argument i en lista.
argär en rå sträng med argumentets namn;annotationär dess annotation, t.ex. enName-nod.- type_comment¶
type_commentär en valfri sträng med typannoteringen som en 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'))])
- class ast.Return(value)¶
Ett
returuttalande.>>> print(ast.dump(ast.parse('return 4'), indent=4)) Module( body=[ Return( value=Constant(value=4))])
- class ast.Yield(value)¶
- class ast.YieldFrom(value)¶
Ett
yieldelleryield fromuttryck. Eftersom det här är uttryck måste de omslutas av enExpr-nod om värdet som skickas tillbaka inte ska användas.>>> print(ast.dump(ast.parse('yield x'), indent=4)) Module( body=[ Expr( value=Yield( value=Name(id='x', ctx=Load())))]) >>> print(ast.dump(ast.parse('yield from x'), indent=4)) Module( body=[ Expr( value=YieldFrom( value=Name(id='x', ctx=Load())))])
- class ast.Global(names)¶
- class ast.Nonlocal(names)¶
globalochnonlocalsatser.namesär en lista med råa strängar.>>> print(ast.dump(ast.parse('global x,y,z'), indent=4)) Module( body=[ Global( names=[ 'x', 'y', 'z'])]) >>> print(ast.dump(ast.parse('nonlocal x,y,z'), indent=4)) Module( body=[ Nonlocal( names=[ 'x', 'y', 'z'])])
- class ast.ClassDef(name, bases, keywords, body, decorator_list, type_params)¶
En klassdefinition.
nameär en rå sträng för klassnamnetbasesär en lista med noder för explicit angivna basklasser.keywordsär en lista medkeyword-noder, huvudsakligen för ’metaclass’. Andra nyckelord kommer att skickas till metaklassen, enligt PEP 3115.bodyär en lista med noder som representerar koden i klassdefinitionen.decorator_listär en lista med noder, som iFunctionDef.type_paramsär en lista med typ-parametrar.
>>> 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())])])
Ändrad i version 3.12: Lagt till
type_params.
Asynkron och await¶
- class ast.AsyncFunctionDef(name, args, body, decorator_list, returns, type_comment, type_params)¶
En
async deffunktionsdefinition. Har samma fält somFunctionDef.Ändrad i version 3.12: Lagt till
type_params.
- class ast.Await(value)¶
Ett
await-uttryck.valueär det som väntas på. Endast giltigt i kroppen av enAsyncFunctionDef.
>>> print(ast.dump(ast.parse("""\
... async def f():
... await other_func()
... """), indent=4))
Module(
body=[
AsyncFunctionDef(
name='f',
args=arguments(),
body=[
Expr(
value=Await(
value=Call(
func=Name(id='other_func', ctx=Load()))))])])
- class ast.AsyncFor(target, iter, body, orelse, type_comment)¶
- class ast.AsyncWith(items, body, type_comment)¶
async for-slingor ochasync with-kontexthanterare. De har samma fält somForrespektiveWith. Endast giltigt i kroppen av enAsyncFunctionDef.
Anteckning
När en sträng analyseras av ast.parse(), kommer operator-noder (underklasser till ast.operator, ast.unaryop, ast.cmpop, ast.boolop och ast.expr_context) på det returnerade trädet att vara singletons. Ändringar i ett av dem kommer att återspeglas i alla andra förekomster av samma värde (t.ex. ast.Add).
ast hjälpare¶
Förutom nodklasserna definierar modulen ast dessa verktygsfunktioner och klasser för genomgång av abstrakta syntaxträd:
- ast.parse(source, filename='<unknown>', mode='exec', *, type_comments=False, feature_version=None, optimize=-1)¶
Parsar källan till en AST-nod. Motsvarar
compile(source, filename, mode, flags=FLAGS_VALUE, optimize=optimize), därFLAGS_VALUEärast.PyCF_ONLY_ASTomoptimize <= 0ochast.PyCF_OPTIMIZED_ASTannars.Om
type_comments=Trueanges, modifieras parsern för att kontrollera och returnera typkommentarer som specificeras av PEP 484 och PEP 526. Detta är likvärdigt med att lägga tillast.PyCF_TYPE_COMMENTStill flaggorna som skickas tillcompile(). Detta kommer att rapportera syntaxfel för felplacerade typkommentarer. Utan denna flagga kommer typkommentarer att ignoreras och fältettype_commentpå valda AST-noder kommer alltid att varaNone. Dessutom kommer platserna för# type: ignorekommentarer att returneras somtype_ignoresattributet förModule(annars är det alltid en tom lista).Dessutom, om
modeär'func_type', ändras inmatningssyntaxen för att motsvara PEP 484 ”signaturtypskommentarer”, t.ex.(str, int) -> List[str].Om du anger
feature_versiontill en tupel(major, minor)kommer det att resultera i ett ”best-effort” försök att analysera med hjälp av den Python-versionens grammatik. Till exempel, att sättafeature_version=(3, 9)kommer att försöka att inte tillåta parsning avmatch-satser. För närvarande måstemajorvara lika med3. Den lägsta versionen som stöds är(3, 7)(och detta kan öka i framtida Python-versioner); den högsta ärsys.version_info[0:2]. ”Best-effort”-försök innebär att det inte finns någon garanti för att parsen (eller att parsen lyckas) är densamma som när den körs på den Python-version som motsvararfeature_version.Om källan innehåller ett null-tecken (
\0),ValueError.Varning
Observera att en lyckad parsning av källkod till ett AST-objekt inte garanterar att den källkod som tillhandahålls är giltig Python-kod som kan exekveras eftersom kompileringssteget kan ge upphov till ytterligare
SyntaxError-undantag. Till exempel genererar källanreturn 42en giltig AST-nod för en return-sats, men den kan inte kompileras ensam (den måste vara inuti en funktionsnod).I synnerhet kommer
ast.parse()inte att göra några scoping-kontroller, vilket kompileringssteget gör.Varning
Det är möjligt att krascha Python-tolken med en tillräckligt stor/komplex sträng på grund av begränsningar i stackdjupet i Pythons AST-kompilator.
Ändrad i version 3.8: Lagt till
type_comments,mode='func_type'ochfeature_version.Ändrad i version 3.13: Den minsta versionen som stöds för
feature_versionär nu(3, 7). Argumentetoptimizehar lagts till.
- ast.unparse(ast_obj)¶
Unparse ett
ast.AST-objekt och generera en sträng med kod som skulle producera ett motsvarandeast.AST-objekt om det analyserades tillbaka medast.parse().Varning
Den kodsträng som produceras kommer inte nödvändigtvis att vara lika med den ursprungliga koden som genererade
ast.AST-objektet (utan några kompilatoroptimeringar, t.ex. konstanta tuples/frozensets).Varning
Försök att unparsa ett mycket komplext uttryck skulle resultera i
RecursionError.Tillagd i version 3.9.
- ast.literal_eval(node_or_string)¶
Utvärderar en uttrycksnod eller en sträng som endast innehåller en Python-litteral eller containervisning. Den angivna strängen eller noden får endast bestå av följande Python-litteralstrukturer: strängar, bytes, tal, tupler, listor, dicts, set, booleaner,
NoneochEllipsis.Detta kan användas för att utvärdera strängar som innehåller Python-värden utan att man behöver analysera värdena själv. Den kan inte utvärdera godtyckligt komplexa uttryck, t.ex. med operatorer eller indexering.
Denna funktion har tidigare dokumenterats som ”säker” utan att det har definierats vad det innebär. Det var missvisande. Detta är specifikt utformat för att inte exekvera Python-kod, till skillnad från den mer allmänna
eval(). Det finns ingen namnrymd, inga namnuppslagningar eller möjlighet att ringa ut. Men det är inte fritt från angrepp: En relativt liten inmatning kan leda till att minnet eller C-stacken tar slut och att processen kraschar. Det finns också möjlighet till överdriven CPU-konsumtion, denial of service, för vissa indata. Att anropa den på icke betrodda data rekommenderas därför inte.Varning
Det är möjligt att krascha Python-tolken på grund av begränsningar i stackdjupet i Pythons AST-kompilator.
Det kan ge upphov till
ValueError,TypeError,SyntaxError,MemoryErrorochRecursionErrorberoende på den felaktiga indata.Ändrad i version 3.2: Tillåter nu bytes och set-litteraler.
Ändrad i version 3.9: Stöder nu skapandet av tomma uppsättningar med
'set()'.Ändrad i version 3.10: För stränginmatningar tas nu inledande mellanslag och tabbar bort.
- ast.get_docstring(node, clean=True)¶
Returnerar dokumentsträngen för den givna noden (som måste vara en
FunctionDef,AsyncFunctionDef,ClassDef, ellerModulenod), ellerNoneom den inte har någon dokumentsträng. Om clean är true, rensa upp dokumentsträngens indrag medinspect.cleandoc().Ändrad i version 3.5:
AsyncFunctionDefstöds nu.
- ast.get_source_segment(source, node, *, padded=False)¶
Hämta källkodssegmentet för den källa som genererade nod. Om någon platsinformation (
lineno,end_lineno,col_offset, ellerend_col_offset) saknas, returnerasNone.Om padded är
True, kommer den första raden i ett flerradigt uttalande att fyllas med mellanslag för att matcha dess ursprungliga position.Tillagd i version 3.8.
- ast.fix_missing_locations(node)¶
När du kompilerar ett nodträd med
compile()förväntar sig kompilatorn attributenlinenoochcol_offsetför varje nod som stöder dem. Detta är ganska tråkigt att fylla i för genererade noder, så den här hjälpen lägger till dessa attribut rekursivt där de inte redan är inställda, genom att ställa in dem till värdena för den överordnade noden. Det fungerar rekursivt med början på node.
- ast.increment_lineno(node, n=1)¶
Öka radnumret och slutradnumret för varje nod i trädet som börjar vid nod med n. Detta är användbart för att ”flytta kod” till en annan plats i en fil.
- ast.copy_location(new_node, old_node)¶
Kopiera källplatsen (
lineno,col_offset,end_lineno, ochend_col_offset) från old_node till new_node om möjligt, och returnera new_node.
- ast.iter_fields(node)¶
Ger en tupel av
(fältnamn, värde)för varje fält inode._fieldssom finns på node.
- ast.iter_child_nodes(node)¶
Ger alla direkta underordnade noder till node, dvs. alla fält som är noder och alla fältobjekt som är listor över noder.
- ast.walk(node)¶
Ger rekursivt alla nedstigande noder i trädet som börjar på node (inklusive node själv), utan specificerad ordning. Detta är användbart om du bara vill modifiera noder på plats och inte bryr dig om sammanhanget.
- class ast.NodeVisitor¶
En basklass för nodbesökare som går igenom det abstrakta syntaxträdet och anropar en besökarfunktion för varje nod som hittas. Denna funktion kan returnera ett värde som vidarebefordras av
visit()-metoden.Denna klass är avsedd att underklassificeras, varvid underklassen lägger till besöksmetoder.
- visit(node)¶
Besöker en nod. Standardimplementeringen anropar metoden som heter
self.visit_classnamedär klassnamn är namnet på nodklassen, ellergeneric_visit()om den metoden inte finns.
- generic_visit(node)¶
Den här besökaren anropar
visit()på alla barn till noden.Observera att barnnoder till noder som har en anpassad besöksmetod inte kommer att besökas om inte besökaren anropar
generic_visit()eller besöker dem själv.
- visit_Constant(node)¶
Hanterar alla konstanta noder.
Använd inte
NodeVisitorom du vill göra ändringar i noder under traversal. För detta finns en speciell besökare (NodeTransformer) som tillåter ändringar.Föråldrad sedan version 3.8: Metoderna
visit_Num(),visit_Str(),visit_Bytes(),visit_NameConstant()ochvisit_Ellipsis()är föråldrade nu och kommer inte att anropas i framtida Python-versioner. Lägg till metodenvisit_Constant()för att hantera alla konstanta noder.
- class ast.NodeTransformer¶
En
NodeVisitor-underklass som går igenom det abstrakta syntaxträdet och tillåter modifiering av noder.NodeTransformerkommer att gå igenom AST och använda returvärdet från besöksmetoderna för att ersätta eller ta bort den gamla noden. Om besöksmetodens returvärde ärNonekommer noden att tas bort från sin plats, annars ersätts den med returvärdet. Returvärdet kan vara den ursprungliga noden och i så fall sker ingen ersättning.Här är ett exempel på en transformator som skriver om alla förekomster av namnuppslagningar (
foo) tilldata['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 )
Tänk på att om den nod du använder har underordnade noder måste du antingen transformera de underordnade noderna själv eller anropa metoden
generic_visit()för noden först.För noder som ingick i en samling uttalanden (det gäller alla uttalandenoder) kan besökaren också returnera en lista med noder i stället för bara en enda nod.
Om
NodeTransformerintroducerar nya noder (som inte var en del av det ursprungliga trädet) utan att ge dem platsinformation (t.ex.lineno), börfix_missing_locations()anropas med det nya delträdet för att räkna om platsinformationen:träd = ast.parse('foo', mode='eval') new_tree = fix_missing_locations(RewriteName().visit(tree))
Vanligtvis använder du transformatorn på följande sätt:
nod = DinTransformator().visit(nod)
- ast.dump(node, annotate_fields=True, include_attributes=False, *, indent=None, show_empty=False)¶
Returnerar en formaterad dumpning av trädet i node. Detta är främst användbart för felsökning. Om annotate_fields är true (standard) kommer den returnerade strängen att visa namn och värden för fälten. Om annotate_fields är false blir resultatsträngen mer kompakt genom att otvetydiga fältnamn utelämnas. Attribut som radnummer och kolumnoffset dumpas inte som standard. Om detta önskas kan include_attributes sättas till true.
Om indent är ett icke-negativt heltal eller en sträng, kommer trädet att skrivas ut med den indragsnivån. En indragsnivå på 0, negativ eller
""kommer endast att infoga nya rader.None(standard) väljer representation med en rad. Om du använder ett positivt heltal indenteras så många mellanslag per nivå. Om indent är en sträng (t.ex."\t") används den strängen för att dra in varje nivå.Om show_empty är false (standard) kommer valfria tomma listor att utelämnas från utdata. Valfria
None-värden utelämnas alltid.Ändrad i version 3.9: Lagt till alternativet indent.
Ändrad i version 3.13: Lagt till alternativet show_empty.
>>> print(ast.dump(ast.parse("""\ ... async def f(): ... await other_func() ... """), indent=4, show_empty=True)) Module( body=[ AsyncFunctionDef( name='f', args=arguments( posonlyargs=[], args=[], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[ Expr( value=Await( value=Call( func=Name(id='other_func', ctx=Load()), args=[], keywords=[])))], decorator_list=[], type_params=[])], type_ignores=[])
Flaggor för kompilator¶
Följande flaggor kan skickas till compile() för att ändra effekterna på kompileringen av ett program:
- ast.PyCF_ALLOW_TOP_LEVEL_AWAIT¶
Aktiverar stöd för toppnivå
await,async for,async withoch async-förståelser.Tillagd i version 3.8.
- ast.PyCF_ONLY_AST¶
Genererar och returnerar ett abstrakt syntaxträd i stället för att returnera ett kompilerat kodobjekt.
- ast.PyCF_OPTIMIZED_AST¶
Den returnerade AST:n optimeras enligt optimize-argumentet i
compile()ellerast.parse().Tillagd i version 3.13.
- ast.PyCF_TYPE_COMMENTS¶
Aktiverar stöd för typkommentarer i stil med PEP 484 och PEP 526 (
# type: <type>,# type: ignore <stuff>).Tillagd i version 3.8.
- ast.compare(a, b, /, *, compare_attributes=False)¶
Jämför rekursivt två AST:er.
compare_attributes påverkar om AST-attribut ska beaktas i jämförelsen. Om compare_attributes är
False(standard) ignoreras attributen. Annars måste de alla vara lika. Det här alternativet är användbart för att kontrollera om AST:erna är strukturellt lika men skiljer sig åt i blanksteg eller liknande detaljer. Attribut inkluderar radnummer och kolumnoffset.Tillagd i version 3.14.
Användning av kommandoraden¶
Tillagd i version 3.9.
Modulen ast kan köras som ett skript från kommandoraden. Det är så enkelt som att:
python -m ast [-m <mode>] [-a] [infile]
Följande alternativ accepteras:
- -h, --help¶
Visa hjälpmeddelandet och avsluta.
- --no-type-comments¶
Analysera inte typkommentarer.
- -a, --include-attributes¶
Inkludera attribut som radnummer och kolumnförskjutningar.
- --feature-version <version>¶
Python-version i formatet 3.x (t.ex. 3.10). Standardvärdet är den aktuella versionen av tolken.
Tillagd i version 3.14.
- -O <level>¶
- --optimize <level>¶
Optimeringsnivå för parsern. Standardvärdet är ingen optimering.
Tillagd i version 3.14.
- --show-empty¶
Visa tomma listor och fält som är
None. Standardinställningen är att inte visa tomma objekt.Tillagd i version 3.14.
Om infile anges analyseras dess innehåll till AST och dumpas till stdout. I annat fall läses innehållet från stdin.
Se även
Green Tree Snakes, en extern dokumentationsresurs, har bra detaljer om hur man arbetar med Python ASTs.
ASTTokens annoterar Python ASTs med positionerna för tokens och text i källkoden som genererade dem. Detta är användbart för verktyg som gör källkodstransformationer.
leoAst.py förenar de tokenbaserade och parse-tree-baserade vyerna av pythonprogram genom att infoga tvåvägslänkar mellan tokens och ast-noder.
LibCST analyserar kod som ett konkret syntaxträd som ser ut som ett asträd och behåller alla formateringsdetaljer. Det är användbart för att bygga automatiserade refaktoriseringsprogram (codemod) och linters.
Parso är en Python-parser som stöder felåterställning och round-trip-parsing för olika Python-versioner (i flera Python-versioner). Parso kan också lista flera syntaxfel i din Python-fil.