aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_ast.py141
1 files changed, 123 insertions, 18 deletions
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 5b47cdaafb0..44bcb9bae1c 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -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):