gh-134718: Omit optional Load() values in ast.dump() (GH-134934)

This commit is contained in:
Serhiy Storchaka 2025-05-31 10:32:53 +03:00 committed by GitHub
parent 8e8786f898
commit 4d31d19a1d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 177 additions and 197 deletions

View File

@ -252,12 +252,11 @@ Root nodes
>>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4)) >>> print(ast.dump(ast.parse('(int, str) -> List[int]', mode='func_type'), indent=4))
FunctionType( FunctionType(
argtypes=[ argtypes=[
Name(id='int', ctx=Load()), Name(id='int'),
Name(id='str', ctx=Load())], Name(id='str')],
returns=Subscript( returns=Subscript(
value=Name(id='List', ctx=Load()), value=Name(id='List'),
slice=Name(id='int', ctx=Load()), slice=Name(id='int')))
ctx=Load()))
.. versionadded:: 3.8 .. versionadded:: 3.8
@ -312,14 +311,14 @@ Literals
values=[ values=[
Constant(value='sin('), Constant(value='sin('),
FormattedValue( FormattedValue(
value=Name(id='a', ctx=Load()), value=Name(id='a'),
conversion=-1), conversion=-1),
Constant(value=') is '), Constant(value=') is '),
FormattedValue( FormattedValue(
value=Call( value=Call(
func=Name(id='sin', ctx=Load()), func=Name(id='sin'),
args=[ args=[
Name(id='a', ctx=Load())]), Name(id='a')]),
conversion=-1, conversion=-1,
format_spec=JoinedStr( format_spec=JoinedStr(
values=[ values=[
@ -341,16 +340,14 @@ Literals
elts=[ elts=[
Constant(value=1), Constant(value=1),
Constant(value=2), Constant(value=2),
Constant(value=3)], Constant(value=3)]))
ctx=Load()))
>>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('(1, 2, 3)', mode='eval'), indent=4))
Expression( Expression(
body=Tuple( body=Tuple(
elts=[ elts=[
Constant(value=1), Constant(value=1),
Constant(value=2), Constant(value=2),
Constant(value=3)], Constant(value=3)]))
ctx=Load()))
.. class:: Set(elts) .. class:: Set(elts)
@ -388,7 +385,7 @@ Literals
None], None],
values=[ values=[
Constant(value=1), Constant(value=1),
Name(id='d', ctx=Load())])) Name(id='d')]))
Variables Variables
@ -414,7 +411,7 @@ Variables
Module( Module(
body=[ body=[
Expr( Expr(
value=Name(id='a', ctx=Load()))]) value=Name(id='a'))])
>>> print(ast.dump(ast.parse('a = 1'), indent=4)) >>> print(ast.dump(ast.parse('a = 1'), indent=4))
Module( Module(
@ -452,7 +449,7 @@ Variables
value=Name(id='b', ctx=Store()), value=Name(id='b', ctx=Store()),
ctx=Store())], ctx=Store())],
ctx=Store())], ctx=Store())],
value=Name(id='it', ctx=Load()))]) value=Name(id='it'))])
.. _ast-expressions: .. _ast-expressions:
@ -475,7 +472,7 @@ Expressions
Expr( Expr(
value=UnaryOp( value=UnaryOp(
op=USub(), op=USub(),
operand=Name(id='a', ctx=Load())))]) operand=Name(id='a')))])
.. class:: UnaryOp(op, operand) .. class:: UnaryOp(op, operand)
@ -498,7 +495,7 @@ Expressions
Expression( Expression(
body=UnaryOp( body=UnaryOp(
op=Not(), op=Not(),
operand=Name(id='x', ctx=Load()))) operand=Name(id='x')))
.. class:: BinOp(left, op, right) .. class:: BinOp(left, op, right)
@ -511,9 +508,9 @@ Expressions
>>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('x + y', mode='eval'), indent=4))
Expression( Expression(
body=BinOp( body=BinOp(
left=Name(id='x', ctx=Load()), left=Name(id='x'),
op=Add(), op=Add(),
right=Name(id='y', ctx=Load()))) right=Name(id='y')))
.. class:: Add .. class:: Add
@ -549,8 +546,8 @@ Expressions
body=BoolOp( body=BoolOp(
op=Or(), op=Or(),
values=[ values=[
Name(id='x', ctx=Load()), Name(id='x'),
Name(id='y', ctx=Load())])) Name(id='y')]))
.. class:: And .. class:: And
@ -575,7 +572,7 @@ Expressions
LtE(), LtE(),
Lt()], Lt()],
comparators=[ comparators=[
Name(id='a', ctx=Load()), Name(id='a'),
Constant(value=10)])) Constant(value=10)]))
@ -609,18 +606,17 @@ Expressions
>>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('func(a, b=c, *d, **e)', mode='eval'), indent=4))
Expression( Expression(
body=Call( body=Call(
func=Name(id='func', ctx=Load()), func=Name(id='func'),
args=[ args=[
Name(id='a', ctx=Load()), Name(id='a'),
Starred( Starred(
value=Name(id='d', ctx=Load()), value=Name(id='d'))],
ctx=Load())],
keywords=[ keywords=[
keyword( keyword(
arg='b', arg='b',
value=Name(id='c', ctx=Load())), value=Name(id='c')),
keyword( keyword(
value=Name(id='e', ctx=Load()))])) value=Name(id='e'))]))
.. class:: keyword(arg, value) .. class:: keyword(arg, value)
@ -639,9 +635,9 @@ Expressions
>>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('a if b else c', mode='eval'), indent=4))
Expression( Expression(
body=IfExp( body=IfExp(
test=Name(id='b', ctx=Load()), test=Name(id='b'),
body=Name(id='a', ctx=Load()), body=Name(id='a'),
orelse=Name(id='c', ctx=Load()))) orelse=Name(id='c')))
.. class:: Attribute(value, attr, ctx) .. class:: Attribute(value, attr, ctx)
@ -656,9 +652,8 @@ Expressions
>>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('snake.colour', mode='eval'), indent=4))
Expression( Expression(
body=Attribute( body=Attribute(
value=Name(id='snake', ctx=Load()), value=Name(id='snake'),
attr='colour', attr='colour'))
ctx=Load()))
.. class:: NamedExpr(target, value) .. class:: NamedExpr(target, value)
@ -694,15 +689,13 @@ Subscripting
>>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('l[1:2, 3]', mode='eval'), indent=4))
Expression( Expression(
body=Subscript( body=Subscript(
value=Name(id='l', ctx=Load()), value=Name(id='l'),
slice=Tuple( slice=Tuple(
elts=[ elts=[
Slice( Slice(
lower=Constant(value=1), lower=Constant(value=1),
upper=Constant(value=2)), upper=Constant(value=2)),
Constant(value=3)], Constant(value=3)])))
ctx=Load()),
ctx=Load()))
.. class:: Slice(lower, upper, step) .. class:: Slice(lower, upper, step)
@ -716,11 +709,10 @@ Subscripting
>>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4)) >>> print(ast.dump(ast.parse('l[1:2]', mode='eval'), indent=4))
Expression( Expression(
body=Subscript( body=Subscript(
value=Name(id='l', ctx=Load()), value=Name(id='l'),
slice=Slice( slice=Slice(
lower=Constant(value=1), lower=Constant(value=1),
upper=Constant(value=2)), upper=Constant(value=2))))
ctx=Load()))
Comprehensions Comprehensions
@ -745,11 +737,11 @@ Comprehensions
... )) ... ))
Expression( Expression(
body=ListComp( body=ListComp(
elt=Name(id='x', ctx=Load()), elt=Name(id='x'),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
iter=Name(id='numbers', ctx=Load()), iter=Name(id='numbers'),
is_async=0)])) is_async=0)]))
>>> print(ast.dump( >>> print(ast.dump(
... ast.parse('{x: x**2 for x in numbers}', mode='eval'), ... ast.parse('{x: x**2 for x in numbers}', mode='eval'),
@ -757,15 +749,15 @@ Comprehensions
... )) ... ))
Expression( Expression(
body=DictComp( body=DictComp(
key=Name(id='x', ctx=Load()), key=Name(id='x'),
value=BinOp( value=BinOp(
left=Name(id='x', ctx=Load()), left=Name(id='x'),
op=Pow(), op=Pow(),
right=Constant(value=2)), right=Constant(value=2)),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
iter=Name(id='numbers', ctx=Load()), iter=Name(id='numbers'),
is_async=0)])) is_async=0)]))
>>> print(ast.dump( >>> print(ast.dump(
... ast.parse('{x for x in numbers}', mode='eval'), ... ast.parse('{x for x in numbers}', mode='eval'),
@ -773,11 +765,11 @@ Comprehensions
... )) ... ))
Expression( Expression(
body=SetComp( body=SetComp(
elt=Name(id='x', ctx=Load()), elt=Name(id='x'),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
iter=Name(id='numbers', ctx=Load()), iter=Name(id='numbers'),
is_async=0)])) is_async=0)]))
@ -798,17 +790,17 @@ Comprehensions
Expression( Expression(
body=ListComp( body=ListComp(
elt=Call( elt=Call(
func=Name(id='ord', ctx=Load()), func=Name(id='ord'),
args=[ args=[
Name(id='c', ctx=Load())]), Name(id='c')]),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='line', ctx=Store()), target=Name(id='line', ctx=Store()),
iter=Name(id='file', ctx=Load()), iter=Name(id='file'),
is_async=0), is_async=0),
comprehension( comprehension(
target=Name(id='c', ctx=Store()), target=Name(id='c', ctx=Store()),
iter=Name(id='line', ctx=Load()), iter=Name(id='line'),
is_async=0)])) is_async=0)]))
>>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'), >>> print(ast.dump(ast.parse('(n**2 for n in it if n>5 if n<10)', mode='eval'),
@ -816,22 +808,22 @@ Comprehensions
Expression( Expression(
body=GeneratorExp( body=GeneratorExp(
elt=BinOp( elt=BinOp(
left=Name(id='n', ctx=Load()), left=Name(id='n'),
op=Pow(), op=Pow(),
right=Constant(value=2)), right=Constant(value=2)),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='n', ctx=Store()), target=Name(id='n', ctx=Store()),
iter=Name(id='it', ctx=Load()), iter=Name(id='it'),
ifs=[ ifs=[
Compare( Compare(
left=Name(id='n', ctx=Load()), left=Name(id='n'),
ops=[ ops=[
Gt()], Gt()],
comparators=[ comparators=[
Constant(value=5)]), Constant(value=5)]),
Compare( Compare(
left=Name(id='n', ctx=Load()), left=Name(id='n'),
ops=[ ops=[
Lt()], Lt()],
comparators=[ comparators=[
@ -842,11 +834,11 @@ Comprehensions
... indent=4)) # Async comprehension ... indent=4)) # Async comprehension
Expression( Expression(
body=ListComp( body=ListComp(
elt=Name(id='i', ctx=Load()), elt=Name(id='i'),
generators=[ generators=[
comprehension( comprehension(
target=Name(id='i', ctx=Store()), target=Name(id='i', ctx=Store()),
iter=Name(id='soc', ctx=Load()), iter=Name(id='soc'),
is_async=1)])) is_async=1)]))
@ -888,7 +880,7 @@ Statements
Name(id='a', ctx=Store()), Name(id='a', ctx=Store()),
Name(id='b', ctx=Store())], Name(id='b', ctx=Store())],
ctx=Store())], ctx=Store())],
value=Name(id='c', ctx=Load()))]) value=Name(id='c'))])
.. class:: AnnAssign(target, annotation, value, simple) .. class:: AnnAssign(target, annotation, value, simple)
@ -911,7 +903,7 @@ Statements
body=[ body=[
AnnAssign( AnnAssign(
target=Name(id='c', ctx=Store()), target=Name(id='c', ctx=Store()),
annotation=Name(id='int', ctx=Load()), annotation=Name(id='int'),
simple=1)]) simple=1)])
>>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis >>> print(ast.dump(ast.parse('(a): int = 1'), indent=4)) # Annotation with parenthesis
@ -919,7 +911,7 @@ Statements
body=[ body=[
AnnAssign( AnnAssign(
target=Name(id='a', ctx=Store()), target=Name(id='a', ctx=Store()),
annotation=Name(id='int', ctx=Load()), annotation=Name(id='int'),
value=Constant(value=1), value=Constant(value=1),
simple=0)]) simple=0)])
@ -928,10 +920,10 @@ Statements
body=[ body=[
AnnAssign( AnnAssign(
target=Attribute( target=Attribute(
value=Name(id='a', ctx=Load()), value=Name(id='a'),
attr='b', attr='b',
ctx=Store()), ctx=Store()),
annotation=Name(id='int', ctx=Load()), annotation=Name(id='int'),
simple=0)]) simple=0)])
>>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation >>> print(ast.dump(ast.parse('a[1]: int'), indent=4)) # Subscript annotation
@ -939,10 +931,10 @@ Statements
body=[ body=[
AnnAssign( AnnAssign(
target=Subscript( target=Subscript(
value=Name(id='a', ctx=Load()), value=Name(id='a'),
slice=Constant(value=1), slice=Constant(value=1),
ctx=Store()), ctx=Store()),
annotation=Name(id='int', ctx=Load()), annotation=Name(id='int'),
simple=0)]) simple=0)])
@ -979,8 +971,8 @@ Statements
Module( Module(
body=[ body=[
Raise( Raise(
exc=Name(id='x', ctx=Load()), exc=Name(id='x'),
cause=Name(id='y', ctx=Load()))]) cause=Name(id='y'))])
.. class:: Assert(test, msg) .. class:: Assert(test, msg)
@ -994,8 +986,8 @@ Statements
Module( Module(
body=[ body=[
Assert( Assert(
test=Name(id='x', ctx=Load()), test=Name(id='x'),
msg=Name(id='y', ctx=Load()))]) msg=Name(id='y'))])
.. class:: Delete(targets) .. class:: Delete(targets)
@ -1041,7 +1033,7 @@ Statements
body=[ body=[
TypeAlias( TypeAlias(
name=Name(id='Alias', ctx=Store()), name=Name(id='Alias', ctx=Store()),
value=Name(id='int', ctx=Load()))]) value=Name(id='int'))])
.. versionadded:: 3.12 .. versionadded:: 3.12
@ -1134,13 +1126,13 @@ Control flow
Module( Module(
body=[ body=[
If( If(
test=Name(id='x', ctx=Load()), test=Name(id='x'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
orelse=[ orelse=[
If( If(
test=Name(id='y', ctx=Load()), test=Name(id='y'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
@ -1174,7 +1166,7 @@ Control flow
body=[ body=[
For( For(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
iter=Name(id='y', ctx=Load()), iter=Name(id='y'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
@ -1199,7 +1191,7 @@ Control flow
Module( Module(
body=[ body=[
While( While(
test=Name(id='x', ctx=Load()), test=Name(id='x'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
@ -1227,11 +1219,11 @@ Control flow
body=[ body=[
For( For(
target=Name(id='a', ctx=Store()), target=Name(id='a', ctx=Store()),
iter=Name(id='b', ctx=Load()), iter=Name(id='b'),
body=[ body=[
If( If(
test=Compare( test=Compare(
left=Name(id='a', ctx=Load()), left=Name(id='a'),
ops=[ ops=[
Gt()], Gt()],
comparators=[ comparators=[
@ -1269,12 +1261,12 @@ Control flow
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
handlers=[ handlers=[
ExceptHandler( ExceptHandler(
type=Name(id='Exception', ctx=Load()), type=Name(id='Exception'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))]), value=Constant(value=Ellipsis))]),
ExceptHandler( ExceptHandler(
type=Name(id='OtherException', ctx=Load()), type=Name(id='OtherException'),
name='e', name='e',
body=[ body=[
Expr( Expr(
@ -1309,7 +1301,7 @@ Control flow
value=Constant(value=Ellipsis))], value=Constant(value=Ellipsis))],
handlers=[ handlers=[
ExceptHandler( ExceptHandler(
type=Name(id='Exception', ctx=Load()), type=Name(id='Exception'),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))])])]) value=Constant(value=Ellipsis))])])])
@ -1337,12 +1329,12 @@ Control flow
body=[ body=[
Expr( Expr(
value=BinOp( value=BinOp(
left=Name(id='a', ctx=Load()), left=Name(id='a'),
op=Add(), op=Add(),
right=Constant(value=1)))], right=Constant(value=1)))],
handlers=[ handlers=[
ExceptHandler( ExceptHandler(
type=Name(id='TypeError', ctx=Load()), type=Name(id='TypeError'),
body=[ body=[
Pass()])])]) Pass()])])])
@ -1375,18 +1367,18 @@ Control flow
With( With(
items=[ items=[
withitem( withitem(
context_expr=Name(id='a', ctx=Load()), context_expr=Name(id='a'),
optional_vars=Name(id='b', ctx=Store())), optional_vars=Name(id='b', ctx=Store())),
withitem( withitem(
context_expr=Name(id='c', ctx=Load()), context_expr=Name(id='c'),
optional_vars=Name(id='d', ctx=Store()))], optional_vars=Name(id='d', ctx=Store()))],
body=[ body=[
Expr( Expr(
value=Call( value=Call(
func=Name(id='something', ctx=Load()), func=Name(id='something'),
args=[ args=[
Name(id='b', ctx=Load()), Name(id='b'),
Name(id='d', ctx=Load())]))])]) Name(id='d')]))])])
Pattern matching Pattern matching
@ -1426,14 +1418,14 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchSequence( pattern=MatchSequence(
patterns=[ patterns=[
MatchAs(name='x')]), MatchAs(name='x')]),
guard=Compare( guard=Compare(
left=Name(id='x', ctx=Load()), left=Name(id='x'),
ops=[ ops=[
Gt()], Gt()],
comparators=[ comparators=[
@ -1443,7 +1435,7 @@ Pattern matching
value=Constant(value=Ellipsis))]), value=Constant(value=Ellipsis))]),
match_case( match_case(
pattern=MatchClass( pattern=MatchClass(
cls=Name(id='tuple', ctx=Load())), cls=Name(id='tuple')),
body=[ body=[
Expr( Expr(
value=Constant(value=Ellipsis))])])]) value=Constant(value=Ellipsis))])])])
@ -1467,7 +1459,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchValue( pattern=MatchValue(
@ -1494,7 +1486,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchSingleton(value=None), pattern=MatchSingleton(value=None),
@ -1521,7 +1513,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchSequence( pattern=MatchSequence(
@ -1554,7 +1546,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchSequence( pattern=MatchSequence(
@ -1603,7 +1595,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchMapping( pattern=MatchMapping(
@ -1653,11 +1645,11 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchClass( pattern=MatchClass(
cls=Name(id='Point2D', ctx=Load()), cls=Name(id='Point2D'),
patterns=[ patterns=[
MatchValue( MatchValue(
value=Constant(value=0)), value=Constant(value=0)),
@ -1668,7 +1660,7 @@ Pattern matching
value=Constant(value=Ellipsis))]), value=Constant(value=Ellipsis))]),
match_case( match_case(
pattern=MatchClass( pattern=MatchClass(
cls=Name(id='Point3D', ctx=Load()), cls=Name(id='Point3D'),
kwd_attrs=[ kwd_attrs=[
'x', 'x',
'y', 'y',
@ -1709,7 +1701,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchAs( pattern=MatchAs(
@ -1746,7 +1738,7 @@ Pattern matching
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchOr( pattern=MatchOr(
@ -1786,7 +1778,7 @@ Type annotations
body=[ body=[
AnnAssign( AnnAssign(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
annotation=Name(id='bool', ctx=Load()), annotation=Name(id='bool'),
value=Constant(value=1), value=Constant(value=1),
simple=1)], simple=1)],
type_ignores=[ type_ignores=[
@ -1824,12 +1816,11 @@ aliases.
type_params=[ type_params=[
TypeVar( TypeVar(
name='T', name='T',
bound=Name(id='int', ctx=Load()), bound=Name(id='int'),
default_value=Name(id='bool', ctx=Load()))], default_value=Name(id='bool'))],
value=Subscript( value=Subscript(
value=Name(id='list', ctx=Load()), value=Name(id='list'),
slice=Name(id='T', ctx=Load()), slice=Name(id='T')))])
ctx=Load()))])
.. versionadded:: 3.12 .. versionadded:: 3.12
@ -1854,17 +1845,14 @@ aliases.
name='P', name='P',
default_value=List( default_value=List(
elts=[ elts=[
Name(id='int', ctx=Load()), Name(id='int'),
Name(id='str', ctx=Load())], Name(id='str')]))],
ctx=Load()))],
value=Subscript( value=Subscript(
value=Name(id='Callable', ctx=Load()), value=Name(id='Callable'),
slice=Tuple( slice=Tuple(
elts=[ elts=[
Name(id='P', ctx=Load()), Name(id='P'),
Name(id='int', ctx=Load())], Name(id='int')])))])
ctx=Load()),
ctx=Load()))])
.. versionadded:: 3.12 .. versionadded:: 3.12
@ -1885,18 +1873,13 @@ aliases.
TypeAlias( TypeAlias(
name=Name(id='Alias', ctx=Store()), name=Name(id='Alias', ctx=Store()),
type_params=[ type_params=[
TypeVarTuple( TypeVarTuple(name='Ts', default_value=Tuple())],
name='Ts',
default_value=Tuple(ctx=Load()))],
value=Subscript( value=Subscript(
value=Name(id='tuple', ctx=Load()), value=Name(id='tuple'),
slice=Tuple( slice=Tuple(
elts=[ elts=[
Starred( Starred(
value=Name(id='Ts', ctx=Load()), value=Name(id='Ts'))])))])
ctx=Load())],
ctx=Load()),
ctx=Load()))])
.. versionadded:: 3.12 .. versionadded:: 3.12
@ -2001,8 +1984,8 @@ Function and class definitions
body=[ body=[
Pass()], Pass()],
decorator_list=[ decorator_list=[
Name(id='decorator1', ctx=Load()), Name(id='decorator1'),
Name(id='decorator2', ctx=Load())], Name(id='decorator2')],
returns=Constant(value='return annotation'))]) returns=Constant(value='return annotation'))])
@ -2032,14 +2015,14 @@ Function and class definitions
body=[ body=[
Expr( Expr(
value=Yield( value=Yield(
value=Name(id='x', ctx=Load())))]) value=Name(id='x')))])
>>> print(ast.dump(ast.parse('yield from x'), indent=4)) >>> print(ast.dump(ast.parse('yield from x'), indent=4))
Module( Module(
body=[ body=[
Expr( Expr(
value=YieldFrom( value=YieldFrom(
value=Name(id='x', ctx=Load())))]) value=Name(id='x')))])
.. class:: Global(names) .. class:: Global(names)
@ -2094,17 +2077,17 @@ Function and class definitions
ClassDef( ClassDef(
name='Foo', name='Foo',
bases=[ bases=[
Name(id='base1', ctx=Load()), Name(id='base1'),
Name(id='base2', ctx=Load())], Name(id='base2')],
keywords=[ keywords=[
keyword( keyword(
arg='metaclass', arg='metaclass',
value=Name(id='meta', ctx=Load()))], value=Name(id='meta'))],
body=[ body=[
Pass()], Pass()],
decorator_list=[ decorator_list=[
Name(id='decorator1', ctx=Load()), Name(id='decorator1'),
Name(id='decorator2', ctx=Load())])]) Name(id='decorator2')])])
.. versionchanged:: 3.12 .. versionchanged:: 3.12
Added ``type_params``. Added ``type_params``.
@ -2141,7 +2124,7 @@ Async and await
Expr( Expr(
value=Await( value=Await(
value=Call( value=Call(
func=Name(id='other_func', ctx=Load()))))])]) func=Name(id='other_func'))))])])
.. class:: AsyncFor(target, iter, body, orelse, type_comment) .. class:: AsyncFor(target, iter, body, orelse, type_comment)
@ -2402,7 +2385,7 @@ and classes for traversing abstract syntax trees:
def visit_Name(self, node): def visit_Name(self, node):
return Subscript( return Subscript(
value=Name(id='data', ctx=Load()), value=Name(id='data'),
slice=Constant(value=node.id), slice=Constant(value=node.id),
ctx=node.ctx ctx=node.ctx
) )
@ -2445,42 +2428,35 @@ and classes for traversing abstract syntax trees:
indents that many spaces per level. If *indent* is a string (such as ``"\t"``), indents that many spaces per level. If *indent* is a string (such as ``"\t"``),
that string is used to indent each level. that string is used to indent each level.
If *show_empty* is false (the default), optional empty lists will be If *show_empty* is false (the default), optional empty lists and
omitted from the output. ``Load()`` values will be omitted from the output.
Optional ``None`` values are always omitted. Optional ``None`` values are always omitted.
.. doctest::
>>> tree = ast.parse('print(None)', '?', 'eval')
>>> print(ast.dump(tree, indent=4))
Expression(
body=Call(
func=Name(id='print'),
args=[
Constant(value=None)]))
>>> print(ast.dump(tree, indent=4, show_empty=True))
Expression(
body=Call(
func=Name(id='print', ctx=Load()),
args=[
Constant(value=None)],
keywords=[]))
.. versionchanged:: 3.9 .. versionchanged:: 3.9
Added the *indent* option. Added the *indent* option.
.. versionchanged:: 3.13 .. versionchanged:: 3.13
Added the *show_empty* option. Added the *show_empty* option.
.. doctest:: .. versionchanged:: next
Omit optional ``Load()`` values by default.
>>> print(ast.dump(ast.parse("""\
... async def f():
... await other_func()
... """), indent=4, show_empty=True))
Module(
body=[
AsyncFunctionDef(
name='f',
args=arguments(
posonlyargs=[],
args=[],
kwonlyargs=[],
kw_defaults=[],
defaults=[]),
body=[
Expr(
value=Await(
value=Call(
func=Name(id='other_func', ctx=Load()),
args=[],
keywords=[])))],
decorator_list=[],
type_params=[])],
type_ignores=[])
.. _ast-compiler-flags: .. _ast-compiler-flags:

View File

@ -154,6 +154,12 @@ def dump(
if not keywords: if not keywords:
args_buffer.append(repr(value)) args_buffer.append(repr(value))
continue continue
elif isinstance(value, Load):
field_type = cls._field_types.get(name, object)
if field_type is expr_context:
if not keywords:
args_buffer.append(repr(value))
continue
if not keywords: if not keywords:
args.extend(args_buffer) args.extend(args_buffer)
args_buffer = [] args_buffer = []

View File

@ -1372,17 +1372,17 @@ class ASTHelpers_Test(unittest.TestCase):
def test_dump(self): def test_dump(self):
node = ast.parse('spam(eggs, "and cheese")') node = ast.parse('spam(eggs, "and cheese")')
self.assertEqual(ast.dump(node), self.assertEqual(ast.dump(node),
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " "Module(body=[Expr(value=Call(func=Name(id='spam'), "
"args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')]))])" "args=[Name(id='eggs'), Constant(value='and cheese')]))])"
) )
self.assertEqual(ast.dump(node, annotate_fields=False), self.assertEqual(ast.dump(node, annotate_fields=False),
"Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " "Module([Expr(Call(Name('spam'), [Name('eggs'), "
"Constant('and cheese')]))])" "Constant('and cheese')]))])"
) )
self.assertEqual(ast.dump(node, include_attributes=True), self.assertEqual(ast.dump(node, include_attributes=True),
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " "Module(body=[Expr(value=Call(func=Name(id='spam', "
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
"args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, " "args=[Name(id='eggs', lineno=1, col_offset=5, "
"end_lineno=1, end_col_offset=9), Constant(value='and cheese', " "end_lineno=1, end_col_offset=9), Constant(value='and cheese', "
"lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], " "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], "
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
@ -1396,18 +1396,18 @@ Module(
body=[ body=[
Expr( Expr(
value=Call( value=Call(
func=Name(id='spam', ctx=Load()), func=Name(id='spam'),
args=[ args=[
Name(id='eggs', ctx=Load()), Name(id='eggs'),
Constant(value='and cheese')]))])""") Constant(value='and cheese')]))])""")
self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\ self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
Module( Module(
\t[ \t[
\t\tExpr( \t\tExpr(
\t\t\tCall( \t\t\tCall(
\t\t\t\tName('spam', Load()), \t\t\t\tName('spam'),
\t\t\t\t[ \t\t\t\t[
\t\t\t\t\tName('eggs', Load()), \t\t\t\t\tName('eggs'),
\t\t\t\t\tConstant('and cheese')]))])""") \t\t\t\t\tConstant('and cheese')]))])""")
self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\ self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
Module( Module(
@ -1416,7 +1416,6 @@ Module(
value=Call( value=Call(
func=Name( func=Name(
id='spam', id='spam',
ctx=Load(),
lineno=1, lineno=1,
col_offset=0, col_offset=0,
end_lineno=1, end_lineno=1,
@ -1424,7 +1423,6 @@ Module(
args=[ args=[
Name( Name(
id='eggs', id='eggs',
ctx=Load(),
lineno=1, lineno=1,
col_offset=5, col_offset=5,
end_lineno=1, end_lineno=1,
@ -1454,23 +1452,23 @@ Module(
) )
node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4) node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
self.assertEqual(ast.dump(node), self.assertEqual(ast.dump(node),
"Raise(exc=Name(id='e', ctx=Load()))" "Raise(exc=Name(id='e'))"
) )
self.assertEqual(ast.dump(node, annotate_fields=False), self.assertEqual(ast.dump(node, annotate_fields=False),
"Raise(Name('e', Load()))" "Raise(Name('e'))"
) )
self.assertEqual(ast.dump(node, include_attributes=True), self.assertEqual(ast.dump(node, include_attributes=True),
"Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)" "Raise(exc=Name(id='e'), lineno=3, col_offset=4)"
) )
self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True), self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
"Raise(Name('e', Load()), lineno=3, col_offset=4)" "Raise(Name('e'), lineno=3, col_offset=4)"
) )
node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load())) node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
self.assertEqual(ast.dump(node), self.assertEqual(ast.dump(node),
"Raise(cause=Name(id='e', ctx=Load()))" "Raise(cause=Name(id='e'))"
) )
self.assertEqual(ast.dump(node, annotate_fields=False), self.assertEqual(ast.dump(node, annotate_fields=False),
"Raise(cause=Name('e', Load()))" "Raise(cause=Name('e'))"
) )
# Arguments: # Arguments:
node = ast.arguments(args=[ast.arg("x")]) node = ast.arguments(args=[ast.arg("x")])
@ -1502,10 +1500,10 @@ Module(
[ast.Name('dataclass', ctx=ast.Load())], [ast.Name('dataclass', ctx=ast.Load())],
) )
self.assertEqual(ast.dump(node), self.assertEqual(ast.dump(node),
"ClassDef(name='T', keywords=[keyword(arg='a', value=Constant(value=None))], decorator_list=[Name(id='dataclass', ctx=Load())])", "ClassDef(name='T', keywords=[keyword(arg='a', value=Constant(value=None))], decorator_list=[Name(id='dataclass')])",
) )
self.assertEqual(ast.dump(node, annotate_fields=False), self.assertEqual(ast.dump(node, annotate_fields=False),
"ClassDef('T', [], [keyword('a', Constant(None))], [], [Name('dataclass', Load())])", "ClassDef('T', [], [keyword('a', Constant(None))], [], [Name('dataclass')])",
) )
def test_dump_show_empty(self): def test_dump_show_empty(self):
@ -1533,7 +1531,7 @@ Module(
check_node( check_node(
# Corner case: there are no real `Name` instances with `id=''`: # Corner case: there are no real `Name` instances with `id=''`:
ast.Name(id='', ctx=ast.Load()), ast.Name(id='', ctx=ast.Load()),
empty="Name(id='', ctx=Load())", empty="Name(id='')",
full="Name(id='', ctx=Load())", full="Name(id='', ctx=Load())",
) )
@ -1581,26 +1579,26 @@ Module(
check_text( check_text(
"def a(b: int = 0, *, c): ...", "def a(b: int = 0, *, c): ...",
empty="Module(body=[FunctionDef(name='a', args=arguments(args=[arg(arg='b', annotation=Name(id='int', ctx=Load()))], kwonlyargs=[arg(arg='c')], kw_defaults=[None], defaults=[Constant(value=0)]), body=[Expr(value=Constant(value=Ellipsis))])])", empty="Module(body=[FunctionDef(name='a', args=arguments(args=[arg(arg='b', annotation=Name(id='int'))], kwonlyargs=[arg(arg='c')], kw_defaults=[None], defaults=[Constant(value=0)]), body=[Expr(value=Constant(value=Ellipsis))])])",
full="Module(body=[FunctionDef(name='a', args=arguments(posonlyargs=[], args=[arg(arg='b', annotation=Name(id='int', ctx=Load()))], kwonlyargs=[arg(arg='c')], kw_defaults=[None], defaults=[Constant(value=0)]), body=[Expr(value=Constant(value=Ellipsis))], decorator_list=[], type_params=[])], type_ignores=[])", full="Module(body=[FunctionDef(name='a', args=arguments(posonlyargs=[], args=[arg(arg='b', annotation=Name(id='int', ctx=Load()))], kwonlyargs=[arg(arg='c')], kw_defaults=[None], defaults=[Constant(value=0)]), body=[Expr(value=Constant(value=Ellipsis))], decorator_list=[], type_params=[])], type_ignores=[])",
) )
check_text( check_text(
"def a(b: int = 0, *, c): ...", "def a(b: int = 0, *, c): ...",
empty="Module(body=[FunctionDef(name='a', args=arguments(args=[arg(arg='b', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=9, end_lineno=1, end_col_offset=12), lineno=1, col_offset=6, end_lineno=1, end_col_offset=12)], kwonlyargs=[arg(arg='c', lineno=1, col_offset=21, end_lineno=1, end_col_offset=22)], kw_defaults=[None], defaults=[Constant(value=0, lineno=1, col_offset=15, end_lineno=1, end_col_offset=16)]), body=[Expr(value=Constant(value=Ellipsis, lineno=1, col_offset=25, end_lineno=1, end_col_offset=28), lineno=1, col_offset=25, end_lineno=1, end_col_offset=28)], lineno=1, col_offset=0, end_lineno=1, end_col_offset=28)])", empty="Module(body=[FunctionDef(name='a', args=arguments(args=[arg(arg='b', annotation=Name(id='int', lineno=1, col_offset=9, end_lineno=1, end_col_offset=12), lineno=1, col_offset=6, end_lineno=1, end_col_offset=12)], kwonlyargs=[arg(arg='c', lineno=1, col_offset=21, end_lineno=1, end_col_offset=22)], kw_defaults=[None], defaults=[Constant(value=0, lineno=1, col_offset=15, end_lineno=1, end_col_offset=16)]), body=[Expr(value=Constant(value=Ellipsis, lineno=1, col_offset=25, end_lineno=1, end_col_offset=28), lineno=1, col_offset=25, end_lineno=1, end_col_offset=28)], lineno=1, col_offset=0, end_lineno=1, end_col_offset=28)])",
full="Module(body=[FunctionDef(name='a', args=arguments(posonlyargs=[], args=[arg(arg='b', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=9, end_lineno=1, end_col_offset=12), lineno=1, col_offset=6, end_lineno=1, end_col_offset=12)], kwonlyargs=[arg(arg='c', lineno=1, col_offset=21, end_lineno=1, end_col_offset=22)], kw_defaults=[None], defaults=[Constant(value=0, lineno=1, col_offset=15, end_lineno=1, end_col_offset=16)]), body=[Expr(value=Constant(value=Ellipsis, lineno=1, col_offset=25, end_lineno=1, end_col_offset=28), lineno=1, col_offset=25, end_lineno=1, end_col_offset=28)], decorator_list=[], type_params=[], lineno=1, col_offset=0, end_lineno=1, end_col_offset=28)], type_ignores=[])", full="Module(body=[FunctionDef(name='a', args=arguments(posonlyargs=[], args=[arg(arg='b', annotation=Name(id='int', ctx=Load(), lineno=1, col_offset=9, end_lineno=1, end_col_offset=12), lineno=1, col_offset=6, end_lineno=1, end_col_offset=12)], kwonlyargs=[arg(arg='c', lineno=1, col_offset=21, end_lineno=1, end_col_offset=22)], kw_defaults=[None], defaults=[Constant(value=0, lineno=1, col_offset=15, end_lineno=1, end_col_offset=16)]), body=[Expr(value=Constant(value=Ellipsis, lineno=1, col_offset=25, end_lineno=1, end_col_offset=28), lineno=1, col_offset=25, end_lineno=1, end_col_offset=28)], decorator_list=[], type_params=[], lineno=1, col_offset=0, end_lineno=1, end_col_offset=28)], type_ignores=[])",
include_attributes=True, include_attributes=True,
) )
check_text( check_text(
'spam(eggs, "and cheese")', 'spam(eggs, "and cheese")',
empty="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')]))])", empty="Module(body=[Expr(value=Call(func=Name(id='spam'), args=[Name(id='eggs'), Constant(value='and cheese')]))])",
full="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], keywords=[]))], type_ignores=[])", full="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], keywords=[]))], type_ignores=[])",
) )
check_text( check_text(
'spam(eggs, text="and cheese")', 'spam(eggs, text="and cheese")',
empty="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load())], keywords=[keyword(arg='text', value=Constant(value='and cheese'))]))])", empty="Module(body=[Expr(value=Call(func=Name(id='spam'), args=[Name(id='eggs')], keywords=[keyword(arg='text', value=Constant(value='and cheese'))]))])",
full="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load())], keywords=[keyword(arg='text', value=Constant(value='and cheese'))]))], type_ignores=[])", full="Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), args=[Name(id='eggs', ctx=Load())], keywords=[keyword(arg='text', value=Constant(value='and cheese'))]))], type_ignores=[])",
) )
@ -1634,12 +1632,12 @@ Module(
self.assertEqual(src, ast.fix_missing_locations(src)) self.assertEqual(src, ast.fix_missing_locations(src))
self.maxDiff = None self.maxDiff = None
self.assertEqual(ast.dump(src, include_attributes=True), self.assertEqual(ast.dump(src, include_attributes=True),
"Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), " "Module(body=[Expr(value=Call(func=Name(id='write', "
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
"args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, " "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, "
"end_col_offset=12)], lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=12)], lineno=1, col_offset=0, end_lineno=1, "
"end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
"end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), " "end_col_offset=13), Expr(value=Call(func=Name(id='spam', "
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
"args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, " "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
"end_col_offset=0)], lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=0)], lineno=1, col_offset=0, end_lineno=1, "
@ -3359,7 +3357,7 @@ class CommandLineTests(unittest.TestCase):
body=[ body=[
AnnAssign( AnnAssign(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
annotation=Name(id='bool', ctx=Load()), annotation=Name(id='bool'),
value=Constant(value=1), value=Constant(value=1),
simple=1)], simple=1)],
type_ignores=[ type_ignores=[
@ -3387,7 +3385,7 @@ class CommandLineTests(unittest.TestCase):
expect = ''' expect = '''
Expression( Expression(
body=Call( body=Call(
func=Name(id='print', ctx=Load()), func=Name(id='print'),
args=[ args=[
Constant(value=1), Constant(value=1),
Constant(value=2), Constant(value=2),
@ -3403,12 +3401,11 @@ class CommandLineTests(unittest.TestCase):
expect = ''' expect = '''
FunctionType( FunctionType(
argtypes=[ argtypes=[
Name(id='int', ctx=Load()), Name(id='int'),
Name(id='str', ctx=Load())], Name(id='str')],
returns=Subscript( returns=Subscript(
value=Name(id='list', ctx=Load()), value=Name(id='list'),
slice=Name(id='int', ctx=Load()), slice=Name(id='int')))
ctx=Load()))
''' '''
for flag in ('-m=func_type', '--mode=func_type'): for flag in ('-m=func_type', '--mode=func_type'):
with self.subTest(flag=flag): with self.subTest(flag=flag):
@ -3422,7 +3419,7 @@ class CommandLineTests(unittest.TestCase):
body=[ body=[
AnnAssign( AnnAssign(
target=Name(id='x', ctx=Store()), target=Name(id='x', ctx=Store()),
annotation=Name(id='bool', ctx=Load()), annotation=Name(id='bool'),
value=Constant(value=1), value=Constant(value=1),
simple=1)]) simple=1)])
''' '''
@ -3467,7 +3464,7 @@ class CommandLineTests(unittest.TestCase):
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='x', ctx=Load()), subject=Name(id='x'),
cases=[ cases=[
match_case( match_case(
pattern=MatchValue( pattern=MatchValue(
@ -3490,7 +3487,7 @@ class CommandLineTests(unittest.TestCase):
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='a', ctx=Load()), subject=Name(id='a'),
cases=[ cases=[
match_case( match_case(
pattern=MatchValue( pattern=MatchValue(
@ -3516,7 +3513,7 @@ class CommandLineTests(unittest.TestCase):
Module( Module(
body=[ body=[
Match( Match(
subject=Name(id='a', ctx=Load()), subject=Name(id='a'),
cases=[ cases=[
match_case( match_case(
pattern=MatchValue( pattern=MatchValue(

View File

@ -0,0 +1 @@
By default, omit optional ``Load()`` values in :func:`ast.dump`.