mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	gh-116022: Improve repr() of AST nodes (#117046)
				
					
				
			Co-authored-by: AN Long <aisk@users.noreply.github.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									f9fa6ba4f8
								
							
						
					
					
						commit
						21d2a9ab2f
					
				
					 7 changed files with 682 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -134,6 +134,11 @@ Node classes
 | 
			
		|||
   Simple indices are represented by their value, extended slices are
 | 
			
		||||
   represented as tuples.
 | 
			
		||||
 | 
			
		||||
.. versionchanged:: 3.14
 | 
			
		||||
 | 
			
		||||
    The :meth:`~object.__repr__` output of :class:`~ast.AST` nodes includes
 | 
			
		||||
    the values of the node fields.
 | 
			
		||||
 | 
			
		||||
.. deprecated:: 3.8
 | 
			
		||||
 | 
			
		||||
   Old classes :class:`!ast.Num`, :class:`!ast.Str`, :class:`!ast.Bytes`,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										209
									
								
								Lib/test/test_ast/data/ast_repr.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								Lib/test/test_ast/data/ast_repr.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,209 @@
 | 
			
		|||
Module(body=[Expr(value=Constant(value='module docstring', kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Constant(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[arg(...)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[arg(...)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=arg(...), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=arg(...), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=arg(...), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=arg(...), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(...), defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[arg(...), ..., arg(...)], vararg=arg(...), kwonlyargs=[arg(...)], kw_defaults=[Constant(...)], kwarg=arg(...), defaults=[Constant(...), ..., Dict(...)]), body=[Expr(value=Constant(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='C', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='C', bases=[], keywords=[], body=[Expr(value=Constant(...))], decorator_list=[], type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='C', bases=[Name(id='object', ctx=Load(...))], keywords=[], body=[Pass()], decorator_list=[], type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='C', bases=[Name(id='A', ctx=Load(...)), Name(id='B', ctx=Load(...))], keywords=[], body=[Pass()], decorator_list=[], type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=Constant(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Return(value=None)], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Delete(targets=[Name(id='v', ctx=Del(...))])], type_ignores=[])
 | 
			
		||||
Module(body=[Assign(targets=[Name(id='v', ctx=Store(...))], value=Constant(value=1, kind=None), type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Assign(targets=[Tuple(elts=[Name(...), Name(...)], ctx=Store(...))], value=Name(id='c', ctx=Load(...)), type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Assign(targets=[Tuple(elts=[Name(...), Name(...)], ctx=Store(...))], value=Name(id='c', ctx=Load(...)), type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Assign(targets=[List(elts=[Name(...), Name(...)], ctx=Store(...))], value=Name(id='c', ctx=Load(...)), type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Assign(targets=[Subscript(value=Name(...), slice=Name(...), ctx=Store(...))], value=Name(id='c', ctx=Load(...)), type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[AnnAssign(target=Name(id='x', ctx=Store(...)), annotation=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), value=None, simple=1)], type_ignores=[])
 | 
			
		||||
Module(body=[AnnAssign(target=Name(id='x', ctx=Store(...)), annotation=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), value=None, simple=1)], type_ignores=[])
 | 
			
		||||
Module(body=[AnnAssign(target=Name(id='x', ctx=Store(...)), annotation=Subscript(value=Name(...), slice=Tuple(...), ctx=Load(...)), value=None, simple=1)], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Add(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Sub(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Mult(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=MatMult(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Div(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Mod(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=Pow(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=LShift(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=RShift(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=BitOr(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=BitXor(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=BitAnd(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[AugAssign(target=Name(id='v', ctx=Store(...)), op=FloorDiv(), value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Name(id='v', ctx=Store(...)), iter=Name(id='v', ctx=Load(...)), body=[Pass()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Name(id='v', ctx=Store(...)), iter=Name(id='v', ctx=Load(...)), body=[Pass()], orelse=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[While(test=Name(id='v', ctx=Load(...)), body=[Pass()], orelse=[])], type_ignores=[])
 | 
			
		||||
Module(body=[While(test=Name(id='v', ctx=Load(...)), body=[Pass()], orelse=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=Name(id='v', ctx=Load(...)), body=[Pass()], orelse=[])], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=Name(id='a', ctx=Load(...)), body=[Pass()], orelse=[If(test=Name(...), body=[Pass(...)], orelse=[])])], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=Name(id='a', ctx=Load(...)), body=[Pass()], orelse=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=Name(id='a', ctx=Load(...)), body=[Pass()], orelse=[If(test=Name(...), body=[Pass(...)], orelse=[Pass(...)])])], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=Name(id='a', ctx=Load(...)), body=[Pass()], orelse=[If(test=Name(...), body=[Pass(...)], orelse=[If(...)])])], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=None)], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=None), withitem(context_expr=Name(...), optional_vars=None)], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=Name(...))], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=Name(...)), withitem(context_expr=Name(...), optional_vars=Name(...))], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=Name(...))], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[With(items=[withitem(context_expr=Name(...), optional_vars=None), withitem(context_expr=Name(...), optional_vars=None)], body=[Pass()], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Raise(exc=None, cause=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Raise(exc=Call(func=Name(...), args=[Constant(...)], keywords=[]), cause=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Raise(exc=Name(id='Exception', ctx=Load(...)), cause=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Raise(exc=Call(func=Name(...), args=[Constant(...)], keywords=[]), cause=Constant(value=None, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name=None, body=[Pass(...)])], orelse=[], finalbody=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name='exc', body=[Pass(...)])], orelse=[], finalbody=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Try(body=[Pass()], handlers=[], orelse=[], finalbody=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[TryStar(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name=None, body=[Pass(...)])], orelse=[], finalbody=[])], type_ignores=[])
 | 
			
		||||
Module(body=[TryStar(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name='exc', body=[Pass(...)])], orelse=[], finalbody=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name=None, body=[Pass(...)])], orelse=[Pass()], finalbody=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name='exc', body=[Pass(...)])], orelse=[Pass()], finalbody=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[TryStar(body=[Pass()], handlers=[ExceptHandler(type=Name(...), name='exc', body=[Pass(...)])], orelse=[Pass()], finalbody=[Pass()])], type_ignores=[])
 | 
			
		||||
Module(body=[Assert(test=Name(id='v', ctx=Load(...)), msg=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Assert(test=Name(id='v', ctx=Load(...)), msg=Constant(value='message', kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Import(names=[alias(name='sys', asname=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[Import(names=[alias(name='foo', asname='bar')])], type_ignores=[])
 | 
			
		||||
Module(body=[ImportFrom(module='sys', names=[alias(name='x', asname='y')], level=0)], type_ignores=[])
 | 
			
		||||
Module(body=[ImportFrom(module='sys', names=[alias(name='v', asname=None)], level=0)], type_ignores=[])
 | 
			
		||||
Module(body=[Global(names=['v'])], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=1, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Pass()], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Name(id='v', ctx=Store(...)), iter=Name(id='v', ctx=Load(...)), body=[Break()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Name(id='v', ctx=Store(...)), iter=Name(id='v', ctx=Load(...)), body=[Continue()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Tuple(elts=[Name(...), Name(...)], ctx=Store(...)), iter=Name(id='c', ctx=Load(...)), body=[Pass()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=Tuple(elts=[Name(...), Name(...)], ctx=Store(...)), iter=Name(id='c', ctx=Load(...)), body=[Pass()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[For(target=List(elts=[Name(...), Name(...)], ctx=Store(...)), iter=Name(id='c', ctx=Load(...)), body=[Pass()], orelse=[], type_comment=None)], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=GeneratorExp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=DictComp(key=Name(...), value=Name(...), generators=[comprehension(...), comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=DictComp(key=Name(...), value=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[AsyncFunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Constant(...)), Expr(value=Await(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[AsyncFunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[AsyncFor(target=Name(...), iter=Name(...), body=[Expr(...)], orelse=[Expr(...)], type_comment=None)], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[AsyncFunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[AsyncWith(items=[withitem(...)], body=[Expr(...)], type_comment=None)], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Dict(keys=[None, Constant(...)], values=[Dict(...), Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Set(elts=[Starred(...), Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Yield(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=YieldFrom(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[AsyncFunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=ListComp(...))], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='deco1', ctx=Load(...)), ..., Call(func=Name(...), args=[Constant(...)], keywords=[])], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[AsyncFunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='deco1', ctx=Load(...)), ..., Call(func=Name(...), args=[Constant(...)], keywords=[])], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='C', bases=[], keywords=[], body=[Pass()], decorator_list=[Name(id='deco1', ctx=Load(...)), ..., Call(func=Name(...), args=[Constant(...)], keywords=[])], type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(...), args=[GeneratorExp(...)], keywords=[])], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Attribute(value=Attribute(...), attr='c', ctx=Load(...))], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=NamedExpr(target=Name(...), value=Constant(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[If(test=NamedExpr(target=Name(...), value=Call(...)), body=[Pass()], orelse=[])], type_ignores=[])
 | 
			
		||||
Module(body=[While(test=NamedExpr(target=Name(...), value=Call(...)), body=[Pass()], orelse=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...), ..., arg(...)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...), arg(...)], kw_defaults=[None, None], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...), arg(...)], kw_defaults=[None, None], kwarg=arg(...), defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...), arg(...)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Constant(...), ..., Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...)], kw_defaults=[Constant(...)], kwarg=None, defaults=[Constant(...), Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...)], kw_defaults=[None], kwarg=None, defaults=[Constant(...), Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...)], kw_defaults=[Constant(...)], kwarg=arg(...), defaults=[Constant(...), Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[arg(...)], args=[arg(...)], vararg=None, kwonlyargs=[arg(...)], kw_defaults=[None], kwarg=arg(...), defaults=[Constant(...), Constant(...)]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[])], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[], value=Name(id='int', ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[TypeVar(name='T', bound=None, default_value=None)], value=Name(id='int', ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[TypeVar(name='T', bound=None, default_value=None), ..., ParamSpec(name='P', default_value=None)], value=Tuple(elts=[Name(...), ..., Name(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[TypeVar(name='T', bound=Name(...), default_value=None), ..., ParamSpec(name='P', default_value=None)], value=Tuple(elts=[Name(...), ..., Name(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[TypeVar(name='T', bound=Tuple(...), default_value=None), ..., ParamSpec(name='P', default_value=None)], value=Tuple(elts=[Name(...), ..., Name(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[TypeAlias(name=Name(id='X', ctx=Store(...)), type_params=[TypeVar(name='T', bound=Name(...), default_value=Constant(...)), ..., ParamSpec(name='P', default_value=Constant(...))], value=Tuple(elts=[Name(...), ..., Name(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='X', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[TypeVar(name='T', bound=None, default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='X', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[TypeVar(name='T', bound=None, default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='X', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[TypeVar(name='T', bound=Name(...), default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='X', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[TypeVar(name='T', bound=Tuple(...), default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[ClassDef(name='X', bases=[], keywords=[], body=[Pass()], decorator_list=[], type_params=[TypeVar(name='T', bound=Name(...), default_value=Constant(...)), ..., ParamSpec(name='P', default_value=Constant(...))])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[TypeVar(name='T', bound=None, default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[TypeVar(name='T', bound=None, default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[TypeVar(name='T', bound=Name(...), default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[TypeVar(name='T', bound=Tuple(...), default_value=None), ..., ParamSpec(name='P', default_value=None)])], type_ignores=[])
 | 
			
		||||
Module(body=[FunctionDef(name='f', args=arguments(posonlyargs=[], args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None, type_comment=None, type_params=[TypeVar(name='T', bound=Name(...), default_value=Constant(...)), ..., ParamSpec(name='P', default_value=Constant(...))])], type_ignores=[])
 | 
			
		||||
Module(body=[Match(subject=Name(id='x', ctx=Load(...)), cases=[match_case(pattern=MatchValue(...), guard=None, body=[Pass(...)])])], type_ignores=[])
 | 
			
		||||
Module(body=[Match(subject=Name(id='x', ctx=Load(...)), cases=[match_case(pattern=MatchValue(...), guard=None, body=[Pass(...)]), match_case(pattern=MatchAs(...), guard=None, body=[Pass(...)])])], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=None, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=True, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=False, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BoolOp(op=And(...), values=[Name(...), Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BoolOp(op=Or(...), values=[Name(...), Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Add(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Sub(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Mult(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Div(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=MatMult(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=FloorDiv(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Pow(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=Mod(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=RShift(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=LShift(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=BitXor(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=BitOr(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=BinOp(left=Name(...), op=BitAnd(...), right=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=UnaryOp(op=Not(...), operand=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=UnaryOp(op=UAdd(...), operand=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=UnaryOp(op=USub(...), operand=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=UnaryOp(op=Invert(...), operand=Name(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Lambda(args=arguments(...), body=Constant(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Dict(keys=[Constant(...)], values=[Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Dict(keys=[], values=[]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Set(elts=[Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Dict(keys=[Constant(...)], values=[Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=List(elts=[Constant(...), Constant(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Tuple(elts=[Constant(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Set(elts=[Constant(...), Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=ListComp(elt=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=GeneratorExp(elt=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=DictComp(key=Name(...), value=Name(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=ListComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=ListComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=ListComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=SetComp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=GeneratorExp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=GeneratorExp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=GeneratorExp(elt=Tuple(...), generators=[comprehension(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Constant(...), ops=[Lt(...), Lt(...)], comparators=[Constant(...), Constant(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[Eq(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[LtE(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[GtE(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[NotEq(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[Is(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[IsNot(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[In(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Compare(left=Name(...), ops=[NotIn(...)], comparators=[Name(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Call(func=Name(...), args=[], keywords=[]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Call(func=Name(...), args=[Constant(...), ..., Starred(...)], keywords=[keyword(...), keyword(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Call(func=Name(...), args=[Starred(...)], keywords=[]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Call(func=Name(...), args=[GeneratorExp(...)], keywords=[]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=10, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value=1j, kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Constant(value='string', kind=None))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Attribute(value=Name(...), attr='b', ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Subscript(value=Name(...), slice=Slice(...), ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Name(id='v', ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=List(elts=[Constant(...), ..., Constant(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=List(elts=[], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Tuple(elts=[Constant(...), ..., Constant(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Tuple(elts=[Constant(...), ..., Constant(...)], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Tuple(elts=[], ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Call(func=Attribute(...), args=[Subscript(...)], keywords=[]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Subscript(value=List(...), slice=Slice(...), ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Subscript(value=List(...), slice=Slice(...), ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Subscript(value=List(...), slice=Slice(...), ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=Subscript(value=List(...), slice=Slice(...), ctx=Load(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=IfExp(test=Name(...), body=Call(...), orelse=Call(...)))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=JoinedStr(values=[FormattedValue(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=JoinedStr(values=[FormattedValue(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=JoinedStr(values=[FormattedValue(...)]))], type_ignores=[])
 | 
			
		||||
Module(body=[Expr(value=JoinedStr(values=[Constant(...), ..., Constant(...)]))], type_ignores=[])
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
import types
 | 
			
		||||
import unittest
 | 
			
		||||
import weakref
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from textwrap import dedent
 | 
			
		||||
try:
 | 
			
		||||
    import _testinternalcapi
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +30,16 @@
 | 
			
		|||
STDLIB_FILES = [fn for fn in os.listdir(STDLIB) if fn.endswith(".py")]
 | 
			
		||||
STDLIB_FILES.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
 | 
			
		||||
 | 
			
		||||
AST_REPR_DATA_FILE = Path(__file__).parent / "data" / "ast_repr.txt"
 | 
			
		||||
 | 
			
		||||
def ast_repr_get_test_cases() -> list[str]:
 | 
			
		||||
    return exec_tests + eval_tests
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ast_repr_update_snapshots() -> None:
 | 
			
		||||
    data = [repr(ast.parse(test)) for test in ast_repr_get_test_cases()]
 | 
			
		||||
    AST_REPR_DATA_FILE.write_text("\n".join(data))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AST_Tests(unittest.TestCase):
 | 
			
		||||
    maxDiff = None
 | 
			
		||||
| 
						 | 
				
			
			@ -408,7 +419,7 @@ def test_invalid_sum(self):
 | 
			
		|||
        m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
 | 
			
		||||
        with self.assertRaises(TypeError) as cm:
 | 
			
		||||
            compile(m, "<test>", "exec")
 | 
			
		||||
        self.assertIn("but got <ast.expr", str(cm.exception))
 | 
			
		||||
        self.assertIn("but got expr()", str(cm.exception))
 | 
			
		||||
 | 
			
		||||
    def test_invalid_identifier(self):
 | 
			
		||||
        m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
 | 
			
		||||
| 
						 | 
				
			
			@ -772,6 +783,12 @@ def test_none_checks(self) -> None:
 | 
			
		|||
        for node, attr, source in tests:
 | 
			
		||||
            self.assert_none_check(node, attr, source)
 | 
			
		||||
 | 
			
		||||
    def test_repr(self) -> None:
 | 
			
		||||
        snapshots = AST_REPR_DATA_FILE.read_text().split("\n")
 | 
			
		||||
        for test, snapshot in zip(ast_repr_get_test_cases(), snapshots, strict=True):
 | 
			
		||||
            with self.subTest(test_input=test):
 | 
			
		||||
                self.assertEqual(repr(ast.parse(test)), snapshot)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CopyTests(unittest.TestCase):
 | 
			
		||||
    """Test copying and pickling AST nodes."""
 | 
			
		||||
| 
						 | 
				
			
			@ -3332,5 +3349,8 @@ def test_folding_type_param_in_type_alias(self):
 | 
			
		|||
            self.assert_ast(result_code, non_optimized_target, optimized_target)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
 | 
			
		||||
        ast_repr_update_snapshots()
 | 
			
		||||
        sys.exit(0)
 | 
			
		||||
    unittest.main()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2416,6 +2416,7 @@ LIBSUBDIRS=	asyncio \
 | 
			
		|||
TESTSUBDIRS=	idlelib/idle_test \
 | 
			
		||||
		test \
 | 
			
		||||
		test/test_ast \
 | 
			
		||||
		test/test_ast/data \
 | 
			
		||||
		test/archivetestdata \
 | 
			
		||||
		test/audiodata \
 | 
			
		||||
		test/certdata \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Improve the :meth:`~object.__repr__` output of :class:`~ast.AST` nodes.
 | 
			
		||||
							
								
								
									
										222
									
								
								Parser/asdl_c.py
									
										
									
									
									
								
							
							
						
						
									
										222
									
								
								Parser/asdl_c.py
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1435,8 +1435,230 @@ def visitModule(self, mod):
 | 
			
		|||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_max_depth(AST_object *self, int depth);
 | 
			
		||||
 | 
			
		||||
/* Format list and tuple properties of AST nodes.
 | 
			
		||||
   Note that, only the first and last elements are shown.
 | 
			
		||||
   Anything in between is represented with an ellipsis ('...').
 | 
			
		||||
   For example, the list [1, 2, 3] is formatted as
 | 
			
		||||
   'List(elts=[Constant(1), ..., Constant(3)])'. */
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_list(PyObject *list, int depth)
 | 
			
		||||
{
 | 
			
		||||
    assert(PyList_Check(list) || PyTuple_Check(list));
 | 
			
		||||
 | 
			
		||||
    struct ast_state *state = get_ast_state();
 | 
			
		||||
    if (state == NULL) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_ssize_t length = PySequence_Size(list);
 | 
			
		||||
    if (length < 0) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    else if (length == 0) {
 | 
			
		||||
        return PyObject_Repr(list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _PyUnicodeWriter writer;
 | 
			
		||||
    _PyUnicodeWriter_Init(&writer);
 | 
			
		||||
    writer.overallocate = 1;
 | 
			
		||||
    PyObject *items[2] = {NULL, NULL};
 | 
			
		||||
 | 
			
		||||
    items[0] = PySequence_GetItem(list, 0);
 | 
			
		||||
    if (!items[0]) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    if (length > 1) {
 | 
			
		||||
        items[1] = PySequence_GetItem(list, length - 1);
 | 
			
		||||
        if (!items[1]) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool is_list = PyList_Check(list);
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, is_list ? '[' : '(') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (Py_ssize_t i = 0; i < Py_MIN(length, 2); i++) {
 | 
			
		||||
        PyObject *item = items[i];
 | 
			
		||||
        PyObject *item_repr;
 | 
			
		||||
 | 
			
		||||
        if (PyType_IsSubtype(Py_TYPE(item), (PyTypeObject *)state->AST_type)) {
 | 
			
		||||
            item_repr = ast_repr_max_depth((AST_object*)item, depth - 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            item_repr = PyObject_Repr(item);
 | 
			
		||||
        }
 | 
			
		||||
        if (!item_repr) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (i > 0) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, item_repr) < 0) {
 | 
			
		||||
            Py_DECREF(item_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (i == 0 && length > 2) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ...", 5) < 0) {
 | 
			
		||||
                Py_DECREF(item_repr);
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Py_DECREF(item_repr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, is_list ? ']' : ')') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_XDECREF(items[0]);
 | 
			
		||||
    Py_XDECREF(items[1]);
 | 
			
		||||
    return _PyUnicodeWriter_Finish(&writer);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
    Py_XDECREF(items[0]);
 | 
			
		||||
    Py_XDECREF(items[1]);
 | 
			
		||||
    _PyUnicodeWriter_Dealloc(&writer);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_max_depth(AST_object *self, int depth)
 | 
			
		||||
{
 | 
			
		||||
    struct ast_state *state = get_ast_state();
 | 
			
		||||
    if (state == NULL) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (depth <= 0) {
 | 
			
		||||
        return PyUnicode_FromFormat("%s(...)", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int status = Py_ReprEnter((PyObject *)self);
 | 
			
		||||
    if (status != 0) {
 | 
			
		||||
        if (status < 0) {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        return PyUnicode_FromFormat("%s(...)", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PyObject *fields;
 | 
			
		||||
    if (PyObject_GetOptionalAttr((PyObject *)Py_TYPE(self), state->_fields, &fields) < 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_ssize_t numfields = PySequence_Size(fields);
 | 
			
		||||
    if (numfields < 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        Py_DECREF(fields);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (numfields == 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        Py_DECREF(fields);
 | 
			
		||||
        return PyUnicode_FromFormat("%s()", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const char* tp_name = Py_TYPE(self)->tp_name;
 | 
			
		||||
    _PyUnicodeWriter writer;
 | 
			
		||||
    _PyUnicodeWriter_Init(&writer);
 | 
			
		||||
    writer.overallocate = 1;
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteASCIIString(&writer, tp_name, strlen(tp_name)) < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (Py_ssize_t i = 0; i < numfields; i++) {
 | 
			
		||||
        PyObject *name = PySequence_GetItem(fields, i);
 | 
			
		||||
        if (!name) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PyObject *value = PyObject_GetAttr((PyObject *)self, name);
 | 
			
		||||
        if (!value) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PyObject *value_repr;
 | 
			
		||||
        if (PyList_Check(value) || PyTuple_Check(value)) {
 | 
			
		||||
            value_repr = ast_repr_list(value, depth);
 | 
			
		||||
        }
 | 
			
		||||
        else if (PyType_IsSubtype(Py_TYPE(value), (PyTypeObject *)state->AST_type)) {
 | 
			
		||||
            value_repr = ast_repr_max_depth((AST_object*)value, depth - 1);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            value_repr = PyObject_Repr(value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(value);
 | 
			
		||||
 | 
			
		||||
        if (!value_repr) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            Py_DECREF(value);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (i > 0) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
 | 
			
		||||
                Py_DECREF(name);
 | 
			
		||||
                Py_DECREF(value_repr);
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, name) < 0) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(name);
 | 
			
		||||
 | 
			
		||||
        if (_PyUnicodeWriter_WriteChar(&writer, '=') < 0) {
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, value_repr) < 0) {
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(value_repr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    Py_ReprLeave((PyObject *)self);
 | 
			
		||||
    Py_DECREF(fields);
 | 
			
		||||
    return _PyUnicodeWriter_Finish(&writer);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
    Py_ReprLeave((PyObject *)self);
 | 
			
		||||
    Py_DECREF(fields);
 | 
			
		||||
    _PyUnicodeWriter_Dealloc(&writer);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr(AST_object *self)
 | 
			
		||||
{
 | 
			
		||||
    return ast_repr_max_depth(self, 3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyType_Slot AST_type_slots[] = {
 | 
			
		||||
    {Py_tp_dealloc, ast_dealloc},
 | 
			
		||||
    {Py_tp_repr, ast_repr},
 | 
			
		||||
    {Py_tp_getattro, PyObject_GenericGetAttr},
 | 
			
		||||
    {Py_tp_setattro, PyObject_GenericSetAttr},
 | 
			
		||||
    {Py_tp_traverse, ast_traverse},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										222
									
								
								Python/Python-ast.c
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										222
									
								
								Python/Python-ast.c
									
										
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -5636,8 +5636,230 @@ static PyGetSetDef ast_type_getsets[] = {
 | 
			
		|||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_max_depth(AST_object *self, int depth);
 | 
			
		||||
 | 
			
		||||
/* Format list and tuple properties of AST nodes.
 | 
			
		||||
   Note that, only the first and last elements are shown.
 | 
			
		||||
   Anything in between is represented with an ellipsis ('...').
 | 
			
		||||
   For example, the list [1, 2, 3] is formatted as
 | 
			
		||||
   'List(elts=[Constant(1), ..., Constant(3)])'. */
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_list(PyObject *list, int depth)
 | 
			
		||||
{
 | 
			
		||||
    assert(PyList_Check(list) || PyTuple_Check(list));
 | 
			
		||||
 | 
			
		||||
    struct ast_state *state = get_ast_state();
 | 
			
		||||
    if (state == NULL) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_ssize_t length = PySequence_Size(list);
 | 
			
		||||
    if (length < 0) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    else if (length == 0) {
 | 
			
		||||
        return PyObject_Repr(list);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _PyUnicodeWriter writer;
 | 
			
		||||
    _PyUnicodeWriter_Init(&writer);
 | 
			
		||||
    writer.overallocate = 1;
 | 
			
		||||
    PyObject *items[2] = {NULL, NULL};
 | 
			
		||||
 | 
			
		||||
    items[0] = PySequence_GetItem(list, 0);
 | 
			
		||||
    if (!items[0]) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    if (length > 1) {
 | 
			
		||||
        items[1] = PySequence_GetItem(list, length - 1);
 | 
			
		||||
        if (!items[1]) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool is_list = PyList_Check(list);
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, is_list ? '[' : '(') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (Py_ssize_t i = 0; i < Py_MIN(length, 2); i++) {
 | 
			
		||||
        PyObject *item = items[i];
 | 
			
		||||
        PyObject *item_repr;
 | 
			
		||||
 | 
			
		||||
        if (PyType_IsSubtype(Py_TYPE(item), (PyTypeObject *)state->AST_type)) {
 | 
			
		||||
            item_repr = ast_repr_max_depth((AST_object*)item, depth - 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            item_repr = PyObject_Repr(item);
 | 
			
		||||
        }
 | 
			
		||||
        if (!item_repr) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (i > 0) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, item_repr) < 0) {
 | 
			
		||||
            Py_DECREF(item_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (i == 0 && length > 2) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ...", 5) < 0) {
 | 
			
		||||
                Py_DECREF(item_repr);
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Py_DECREF(item_repr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, is_list ? ']' : ')') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_XDECREF(items[0]);
 | 
			
		||||
    Py_XDECREF(items[1]);
 | 
			
		||||
    return _PyUnicodeWriter_Finish(&writer);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
    Py_XDECREF(items[0]);
 | 
			
		||||
    Py_XDECREF(items[1]);
 | 
			
		||||
    _PyUnicodeWriter_Dealloc(&writer);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr_max_depth(AST_object *self, int depth)
 | 
			
		||||
{
 | 
			
		||||
    struct ast_state *state = get_ast_state();
 | 
			
		||||
    if (state == NULL) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (depth <= 0) {
 | 
			
		||||
        return PyUnicode_FromFormat("%s(...)", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int status = Py_ReprEnter((PyObject *)self);
 | 
			
		||||
    if (status != 0) {
 | 
			
		||||
        if (status < 0) {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        return PyUnicode_FromFormat("%s(...)", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PyObject *fields;
 | 
			
		||||
    if (PyObject_GetOptionalAttr((PyObject *)Py_TYPE(self), state->_fields, &fields) < 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Py_ssize_t numfields = PySequence_Size(fields);
 | 
			
		||||
    if (numfields < 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        Py_DECREF(fields);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (numfields == 0) {
 | 
			
		||||
        Py_ReprLeave((PyObject *)self);
 | 
			
		||||
        Py_DECREF(fields);
 | 
			
		||||
        return PyUnicode_FromFormat("%s()", Py_TYPE(self)->tp_name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const char* tp_name = Py_TYPE(self)->tp_name;
 | 
			
		||||
    _PyUnicodeWriter writer;
 | 
			
		||||
    _PyUnicodeWriter_Init(&writer);
 | 
			
		||||
    writer.overallocate = 1;
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteASCIIString(&writer, tp_name, strlen(tp_name)) < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (Py_ssize_t i = 0; i < numfields; i++) {
 | 
			
		||||
        PyObject *name = PySequence_GetItem(fields, i);
 | 
			
		||||
        if (!name) {
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PyObject *value = PyObject_GetAttr((PyObject *)self, name);
 | 
			
		||||
        if (!value) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PyObject *value_repr;
 | 
			
		||||
        if (PyList_Check(value) || PyTuple_Check(value)) {
 | 
			
		||||
            value_repr = ast_repr_list(value, depth);
 | 
			
		||||
        }
 | 
			
		||||
        else if (PyType_IsSubtype(Py_TYPE(value), (PyTypeObject *)state->AST_type)) {
 | 
			
		||||
            value_repr = ast_repr_max_depth((AST_object*)value, depth - 1);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            value_repr = PyObject_Repr(value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(value);
 | 
			
		||||
 | 
			
		||||
        if (!value_repr) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            Py_DECREF(value);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (i > 0) {
 | 
			
		||||
            if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
 | 
			
		||||
                Py_DECREF(name);
 | 
			
		||||
                Py_DECREF(value_repr);
 | 
			
		||||
                goto error;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, name) < 0) {
 | 
			
		||||
            Py_DECREF(name);
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(name);
 | 
			
		||||
 | 
			
		||||
        if (_PyUnicodeWriter_WriteChar(&writer, '=') < 0) {
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        if (_PyUnicodeWriter_WriteStr(&writer, value_repr) < 0) {
 | 
			
		||||
            Py_DECREF(value_repr);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Py_DECREF(value_repr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0) {
 | 
			
		||||
        goto error;
 | 
			
		||||
    }
 | 
			
		||||
    Py_ReprLeave((PyObject *)self);
 | 
			
		||||
    Py_DECREF(fields);
 | 
			
		||||
    return _PyUnicodeWriter_Finish(&writer);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
    Py_ReprLeave((PyObject *)self);
 | 
			
		||||
    Py_DECREF(fields);
 | 
			
		||||
    _PyUnicodeWriter_Dealloc(&writer);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *
 | 
			
		||||
ast_repr(AST_object *self)
 | 
			
		||||
{
 | 
			
		||||
    return ast_repr_max_depth(self, 3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyType_Slot AST_type_slots[] = {
 | 
			
		||||
    {Py_tp_dealloc, ast_dealloc},
 | 
			
		||||
    {Py_tp_repr, ast_repr},
 | 
			
		||||
    {Py_tp_getattro, PyObject_GenericGetAttr},
 | 
			
		||||
    {Py_tp_setattro, PyObject_GenericSetAttr},
 | 
			
		||||
    {Py_tp_traverse, ast_traverse},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue