mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
gh-116023: Add show_empty=False to ast.dump (#116037)
Co-authored-by: Carl Meyer <carl@oddbird.net>
This commit is contained in:
parent
7e87d30f1f
commit
692e902c74
4 changed files with 249 additions and 167 deletions
|
|
@ -1227,21 +1227,20 @@ class ASTHelpers_Test(unittest.TestCase):
|
|||
node = ast.parse('spam(eggs, "and cheese")')
|
||||
self.assertEqual(ast.dump(node),
|
||||
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
|
||||
"args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], "
|
||||
"keywords=[]))], type_ignores=[])"
|
||||
"args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')]))])"
|
||||
)
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
|
||||
"Constant('and cheese')], []))], [])"
|
||||
"Constant('and cheese')]))])"
|
||||
)
|
||||
self.assertEqual(ast.dump(node, include_attributes=True),
|
||||
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
|
||||
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
|
||||
"args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
|
||||
"end_lineno=1, end_col_offset=9), Constant(value='and cheese', "
|
||||
"lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
|
||||
"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)], type_ignores=[])"
|
||||
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)])"
|
||||
)
|
||||
|
||||
def test_dump_indent(self):
|
||||
|
|
@ -1254,9 +1253,7 @@ Module(
|
|||
func=Name(id='spam', ctx=Load()),
|
||||
args=[
|
||||
Name(id='eggs', ctx=Load()),
|
||||
Constant(value='and cheese')],
|
||||
keywords=[]))],
|
||||
type_ignores=[])""")
|
||||
Constant(value='and cheese')]))])""")
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
|
||||
Module(
|
||||
\t[
|
||||
|
|
@ -1265,9 +1262,7 @@ Module(
|
|||
\t\t\t\tName('spam', Load()),
|
||||
\t\t\t\t[
|
||||
\t\t\t\t\tName('eggs', Load()),
|
||||
\t\t\t\t\tConstant('and cheese')],
|
||||
\t\t\t\t[]))],
|
||||
\t[])""")
|
||||
\t\t\t\t\tConstant('and cheese')]))])""")
|
||||
self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
|
||||
Module(
|
||||
body=[
|
||||
|
|
@ -1294,7 +1289,6 @@ Module(
|
|||
col_offset=11,
|
||||
end_lineno=1,
|
||||
end_col_offset=23)],
|
||||
keywords=[],
|
||||
lineno=1,
|
||||
col_offset=0,
|
||||
end_lineno=1,
|
||||
|
|
@ -1302,8 +1296,7 @@ Module(
|
|||
lineno=1,
|
||||
col_offset=0,
|
||||
end_lineno=1,
|
||||
end_col_offset=24)],
|
||||
type_ignores=[])""")
|
||||
end_col_offset=24)])""")
|
||||
|
||||
def test_dump_incomplete(self):
|
||||
node = ast.Raise(lineno=3, col_offset=4)
|
||||
|
|
@ -1333,6 +1326,119 @@ Module(
|
|||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"Raise(cause=Name('e', Load()))"
|
||||
)
|
||||
# Arguments:
|
||||
node = ast.arguments(args=[ast.arg("x")])
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"arguments([], [arg('x')])",
|
||||
)
|
||||
node = ast.arguments(posonlyargs=[ast.arg("x")])
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"arguments([arg('x')])",
|
||||
)
|
||||
node = ast.arguments(posonlyargs=[ast.arg("x")], kwonlyargs=[ast.arg('y')])
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"arguments([arg('x')], kwonlyargs=[arg('y')])",
|
||||
)
|
||||
node = ast.arguments(args=[ast.arg("x")], kwonlyargs=[ast.arg('y')])
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"arguments([], [arg('x')], kwonlyargs=[arg('y')])",
|
||||
)
|
||||
node = ast.arguments()
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"arguments()",
|
||||
)
|
||||
# Classes:
|
||||
node = ast.ClassDef(
|
||||
'T',
|
||||
[],
|
||||
[ast.keyword('a', ast.Constant(None))],
|
||||
[],
|
||||
[ast.Name('dataclass')],
|
||||
)
|
||||
self.assertEqual(ast.dump(node),
|
||||
"ClassDef(name='T', keywords=[keyword(arg='a', value=Constant(value=None))], decorator_list=[Name(id='dataclass')])",
|
||||
)
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"ClassDef('T', [], [keyword('a', Constant(None))], [], [Name('dataclass')])",
|
||||
)
|
||||
|
||||
def test_dump_show_empty(self):
|
||||
def check_node(node, empty, full, **kwargs):
|
||||
with self.subTest(show_empty=False):
|
||||
self.assertEqual(
|
||||
ast.dump(node, show_empty=False, **kwargs),
|
||||
empty,
|
||||
)
|
||||
with self.subTest(show_empty=True):
|
||||
self.assertEqual(
|
||||
ast.dump(node, show_empty=True, **kwargs),
|
||||
full,
|
||||
)
|
||||
|
||||
def check_text(code, empty, full, **kwargs):
|
||||
check_node(ast.parse(code), empty, full, **kwargs)
|
||||
|
||||
check_node(
|
||||
ast.arguments(),
|
||||
empty="arguments()",
|
||||
full="arguments(posonlyargs=[], args=[], kwonlyargs=[], kw_defaults=[], defaults=[])",
|
||||
)
|
||||
|
||||
check_node(
|
||||
# Corner case: there are no real `Name` instances with `id=''`:
|
||||
ast.Name(id='', ctx=ast.Load()),
|
||||
empty="Name(id='', ctx=Load())",
|
||||
full="Name(id='', ctx=Load())",
|
||||
)
|
||||
|
||||
check_node(
|
||||
ast.MatchSingleton(value=None),
|
||||
empty="MatchSingleton(value=None)",
|
||||
full="MatchSingleton(value=None)",
|
||||
)
|
||||
|
||||
check_node(
|
||||
ast.Constant(value=None),
|
||||
empty="Constant(value=None)",
|
||||
full="Constant(value=None)",
|
||||
)
|
||||
|
||||
check_node(
|
||||
ast.Constant(value=''),
|
||||
empty="Constant(value='')",
|
||||
full="Constant(value='')",
|
||||
)
|
||||
|
||||
check_text(
|
||||
"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))])])",
|
||||
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(
|
||||
"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)])",
|
||||
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,
|
||||
)
|
||||
|
||||
check_text(
|
||||
'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')]))])",
|
||||
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(
|
||||
'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'))]))])",
|
||||
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=[])",
|
||||
)
|
||||
|
||||
check_text(
|
||||
"import _ast as ast; from module import sub",
|
||||
empty="Module(body=[Import(names=[alias(name='_ast', asname='ast')]), ImportFrom(module='module', names=[alias(name='sub')], level=0)])",
|
||||
full="Module(body=[Import(names=[alias(name='_ast', asname='ast')]), ImportFrom(module='module', names=[alias(name='sub')], level=0)], type_ignores=[])",
|
||||
)
|
||||
|
||||
def test_copy_location(self):
|
||||
src = ast.parse('1 + 1', mode='eval')
|
||||
|
|
@ -1361,14 +1467,13 @@ Module(
|
|||
"Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
|
||||
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
|
||||
"args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, "
|
||||
"end_col_offset=12)], keywords=[], 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), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
|
||||
"lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
|
||||
"args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
|
||||
"end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
|
||||
"end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
|
||||
"type_ignores=[])"
|
||||
"end_col_offset=0)], lineno=1, col_offset=0, end_lineno=1, "
|
||||
"end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)])"
|
||||
)
|
||||
|
||||
def test_increment_lineno(self):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue