blob: bddb3de2f090bf78b00c958b305fece257924f51 [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
Victor Stinnere5fbe0c2020-09-15 18:03:34 +02002import builtins
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01003import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05004import os
5import sys
Victor Stinnere5fbe0c2020-09-15 18:03:34 +02006import types
Benjamin Peterson832bfe22011-08-09 16:15:04 -05007import unittest
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03008import warnings
Benjamin Peterson9ed37432012-07-08 11:13:36 -07009import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +000010from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -070011
12from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000013
14def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000015 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000016 return t
17 elif isinstance(t, list):
18 return [to_tuple(e) for e in t]
19 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000020 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
21 result.append((t.lineno, t.col_offset))
Serhiy Storchaka850a8852020-01-10 10:12:55 +020022 if hasattr(t, 'end_lineno') and hasattr(t, 'end_col_offset'):
23 result[-1] += (t.end_lineno, t.end_col_offset)
Tim Peters400cbc32006-02-28 18:44:41 +000024 if t._fields is None:
25 return tuple(result)
26 for f in t._fields:
27 result.append(to_tuple(getattr(t, f)))
28 return tuple(result)
29
Neal Norwitzee9b10a2008-03-31 05:29:39 +000030
Tim Peters400cbc32006-02-28 18:44:41 +000031# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030032# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000033exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050034 # None
35 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090036 # Module docstring
37 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000038 # FunctionDef
39 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090040 # FunctionDef with docstring
41 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050042 # FunctionDef with arg
43 "def f(a): pass",
44 # FunctionDef with arg and default value
45 "def f(a=0): pass",
46 # FunctionDef with varargs
47 "def f(*args): pass",
48 # FunctionDef with kwargs
49 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090050 # FunctionDef with all kind of args and docstring
51 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000052 # ClassDef
53 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090054 # ClassDef with docstring
55 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050056 # ClassDef, new style class
57 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000058 # Return
59 "def f():return 1",
60 # Delete
61 "del v",
62 # Assign
63 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020064 "a,b = c",
65 "(a,b) = c",
66 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000067 # AugAssign
68 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000069 # For
70 "for v in v:pass",
71 # While
72 "while v:pass",
73 # If
74 "if v:pass",
Lysandros Nikolaou025a6022019-12-12 22:40:21 +010075 # If-Elif
76 "if a:\n pass\nelif b:\n pass",
Lysandros Nikolaou5936a4c2019-12-14 11:24:57 +010077 # If-Elif-Else
78 "if a:\n pass\nelif b:\n pass\nelse:\n pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050079 # With
80 "with x as y: pass",
81 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000082 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000083 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000084 # TryExcept
85 "try:\n pass\nexcept Exception:\n pass",
86 # TryFinally
87 "try:\n pass\nfinally:\n pass",
88 # Assert
89 "assert v",
90 # Import
91 "import sys",
92 # ImportFrom
93 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000094 # Global
95 "global v",
96 # Expr
97 "1",
98 # Pass,
99 "pass",
100 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -0400101 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +0000102 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -0400103 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +0000104 # for statements with naked tuples (see http://bugs.python.org/issue6704)
105 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200106 "for (a,b) in c: pass",
107 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500108 # Multiline generator expression (test for .lineno & .col_offset)
109 """(
110 (
111 Aa
112 ,
113 Bb
114 )
115 for
116 Aa
117 ,
118 Bb in Cc
119 )""",
120 # dictcomp
121 "{a : b for w in x for m in p if g}",
122 # dictcomp with naked tuple
123 "{a : b for v,w in x}",
124 # setcomp
125 "{r for l in x if g}",
126 # setcomp with naked tuple
127 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400128 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900129 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400130 # AsyncFor
131 "async def f():\n async for e in i: 1\n else: 2",
132 # AsyncWith
133 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400134 # PEP 448: Additional Unpacking Generalizations
135 "{**{1:2}, 2:3}",
136 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700137 # Asynchronous comprehensions
138 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200139 # Decorated FunctionDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300140 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200141 # Decorated AsyncFunctionDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300142 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200143 # Decorated ClassDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300144 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200145 # Decorator with generator argument
146 "@deco(a for a in b)\ndef f(): pass",
Lysandros Nikolaoud2e10982020-02-08 00:36:32 +0100147 # Decorator with attribute
148 "@a.b.c\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000149 # Simple assignment expression
150 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100151 # Positional-only arguments
152 "def f(a, /,): pass",
153 "def f(a, /, c, d, e): pass",
154 "def f(a, /, c, *, d, e): pass",
155 "def f(a, /, c, *, d, e, **kwargs): pass",
156 # Positional-only arguments with defaults
157 "def f(a=1, /,): pass",
158 "def f(a=1, /, b=2, c=4): pass",
159 "def f(a=1, /, b=2, *, c=4): pass",
160 "def f(a=1, /, b=2, *, c): pass",
161 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
162 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000163
Tim Peters400cbc32006-02-28 18:44:41 +0000164]
165
166# These are compiled through "single"
167# because of overlap with "eval", it just tests what
168# can't be tested with "eval"
169single_tests = [
170 "1+2"
171]
172
173# These are compiled through "eval"
174# It should test all expressions
175eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500176 # None
177 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000178 # BoolOp
179 "a and b",
180 # BinOp
181 "a + b",
182 # UnaryOp
183 "not v",
184 # Lambda
185 "lambda:None",
186 # Dict
187 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500188 # Empty dict
189 "{}",
190 # Set
191 "{None,}",
192 # Multiline dict (test for .lineno & .col_offset)
193 """{
194 1
195 :
196 2
197 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000198 # ListComp
199 "[a for b in c if d]",
200 # GeneratorExp
201 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200202 # Comprehensions with multiple for targets
203 "[(a,b) for a,b in c]",
204 "[(a,b) for (a,b) in c]",
205 "[(a,b) for [a,b] in c]",
206 "{(a,b) for a,b in c}",
207 "{(a,b) for (a,b) in c}",
208 "{(a,b) for [a,b] in c}",
209 "((a,b) for a,b in c)",
210 "((a,b) for (a,b) in c)",
211 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000212 # Yield - yield expressions can't work outside a function
213 #
214 # Compare
215 "1 < 2 < 3",
216 # Call
217 "f(1,2,c=3,*d,**e)",
Lysandros Nikolaou50d4f122019-12-18 01:20:55 +0100218 # Call with multi-character starred
219 "f(*[0, 1])",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200220 # Call with a generator argument
221 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000222 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000223 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000224 # Str
225 "'string'",
226 # Attribute
227 "a.b",
228 # Subscript
229 "a[b:c]",
230 # Name
231 "v",
232 # List
233 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500234 # Empty list
235 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000236 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000237 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500238 # Tuple
239 "(1,2,3)",
240 # Empty tuple
241 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000242 # Combination
243 "a.b.c.d(a.b[1:2])",
244
Tim Peters400cbc32006-02-28 18:44:41 +0000245]
246
247# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
248# excepthandler, arguments, keywords, alias
249
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000250class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000251
Batuhan TaĹźkaya397b96f2020-03-01 23:12:17 +0300252 def _is_ast_node(self, name, node):
253 if not isinstance(node, type):
254 return False
255 if "ast" not in node.__module__:
256 return False
257 return name != 'AST' and name[0].isupper()
258
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500259 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000260 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000261 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000262 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000263 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200264 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000265 parent_pos = (ast_node.lineno, ast_node.col_offset)
266 for name in ast_node._fields:
267 value = getattr(ast_node, name)
268 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200269 first_pos = parent_pos
270 if value and name == 'decorator_list':
271 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000272 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200273 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000274 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500275 self._assertTrueorder(value, parent_pos)
Brandt Bucher145bf262021-02-26 14:51:55 -0800276 self.assertEqual(ast_node._fields, ast_node.__match_args__)
Tim Peters5ddfe412006-03-01 23:02:57 +0000277
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500278 def test_AST_objects(self):
279 x = ast.AST()
280 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700281 x.foobar = 42
282 self.assertEqual(x.foobar, 42)
283 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500284
285 with self.assertRaises(AttributeError):
286 x.vararg
287
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500288 with self.assertRaises(TypeError):
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200289 # "ast.AST constructor takes 0 positional arguments"
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500290 ast.AST(2)
291
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700292 def test_AST_garbage_collection(self):
293 class X:
294 pass
295 a = ast.AST()
296 a.x = X()
297 a.x.a = a
298 ref = weakref.ref(a.x)
299 del a
300 support.gc_collect()
301 self.assertIsNone(ref())
302
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000303 def test_snippets(self):
304 for input, output, kind in ((exec_tests, exec_results, "exec"),
305 (single_tests, single_results, "single"),
306 (eval_tests, eval_results, "eval")):
307 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400308 with self.subTest(action="parsing", input=i):
309 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
310 self.assertEqual(to_tuple(ast_tree), o)
311 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100312 with self.subTest(action="compiling", input=i, kind=kind):
313 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000314
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000315 def test_ast_validation(self):
316 # compile() is the only function that calls PyAST_Validate
317 snippets_to_validate = exec_tests + single_tests + eval_tests
318 for snippet in snippets_to_validate:
319 tree = ast.parse(snippet)
320 compile(tree, '<string>', 'exec')
321
Benjamin Peterson78565b22009-06-28 19:19:51 +0000322 def test_slice(self):
323 slc = ast.parse("x[::]").body[0].value.slice
324 self.assertIsNone(slc.upper)
325 self.assertIsNone(slc.lower)
326 self.assertIsNone(slc.step)
327
328 def test_from_import(self):
329 im = ast.parse("from . import y").body[0]
330 self.assertIsNone(im.module)
331
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400332 def test_non_interned_future_from_ast(self):
333 mod = ast.parse("from __future__ import division")
334 self.assertIsInstance(mod.body[0], ast.ImportFrom)
335 mod.body[0].module = " __future__ ".strip()
336 compile(mod, "<test>", "exec")
337
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000338 def test_base_classes(self):
339 self.assertTrue(issubclass(ast.For, ast.stmt))
340 self.assertTrue(issubclass(ast.Name, ast.expr))
341 self.assertTrue(issubclass(ast.stmt, ast.AST))
342 self.assertTrue(issubclass(ast.expr, ast.AST))
343 self.assertTrue(issubclass(ast.comprehension, ast.AST))
344 self.assertTrue(issubclass(ast.Gt, ast.AST))
345
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500346 def test_field_attr_existence(self):
347 for name, item in ast.__dict__.items():
Batuhan TaĹźkaya397b96f2020-03-01 23:12:17 +0300348 if self._is_ast_node(name, item):
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200349 if name == 'Index':
350 # Index(value) just returns value now.
351 # The argument is required.
352 continue
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500353 x = item()
354 if isinstance(x, ast.AST):
355 self.assertEqual(type(x._fields), tuple)
356
357 def test_arguments(self):
358 x = ast.arguments()
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200359 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
360 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500361
362 with self.assertRaises(AttributeError):
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200363 x.args
364 self.assertIsNone(x.vararg)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500365
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100366 x = ast.arguments(*range(1, 8))
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200367 self.assertEqual(x.args, 2)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100368 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500369
370 def test_field_attr_writable(self):
371 x = ast.Num()
372 # We can assign to _fields
373 x._fields = 666
374 self.assertEqual(x._fields, 666)
375
376 def test_classattrs(self):
377 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700378 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300379
380 with self.assertRaises(AttributeError):
381 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500382
383 with self.assertRaises(AttributeError):
384 x.n
385
386 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300387 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500388 self.assertEqual(x.n, 42)
389
390 with self.assertRaises(AttributeError):
391 x.lineno
392
393 with self.assertRaises(AttributeError):
394 x.foobar
395
396 x = ast.Num(lineno=2)
397 self.assertEqual(x.lineno, 2)
398
399 x = ast.Num(42, lineno=0)
400 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700401 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300402 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500403 self.assertEqual(x.n, 42)
404
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700405 self.assertRaises(TypeError, ast.Num, 1, None, 2)
406 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500407
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200408 # Arbitrary keyword arguments are supported
409 self.assertEqual(ast.Constant(1, foo='bar').foo, 'bar')
410 self.assertEqual(ast.Num(1, foo='bar').foo, 'bar')
411
412 with self.assertRaisesRegex(TypeError, "Num got multiple values for argument 'n'"):
413 ast.Num(1, n=2)
414 with self.assertRaisesRegex(TypeError, "Constant got multiple values for argument 'value'"):
415 ast.Constant(1, value=2)
416
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300417 self.assertEqual(ast.Num(42).n, 42)
418 self.assertEqual(ast.Num(4.25).n, 4.25)
419 self.assertEqual(ast.Num(4.25j).n, 4.25j)
420 self.assertEqual(ast.Str('42').s, '42')
421 self.assertEqual(ast.Bytes(b'42').s, b'42')
422 self.assertIs(ast.NameConstant(True).value, True)
423 self.assertIs(ast.NameConstant(False).value, False)
424 self.assertIs(ast.NameConstant(None).value, None)
425
426 self.assertEqual(ast.Constant(42).value, 42)
427 self.assertEqual(ast.Constant(4.25).value, 4.25)
428 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
429 self.assertEqual(ast.Constant('42').value, '42')
430 self.assertEqual(ast.Constant(b'42').value, b'42')
431 self.assertIs(ast.Constant(True).value, True)
432 self.assertIs(ast.Constant(False).value, False)
433 self.assertIs(ast.Constant(None).value, None)
434 self.assertIs(ast.Constant(...).value, ...)
435
436 def test_realtype(self):
437 self.assertEqual(type(ast.Num(42)), ast.Constant)
438 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
439 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
440 self.assertEqual(type(ast.Str('42')), ast.Constant)
441 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
442 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
443 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
444 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
445 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
446
447 def test_isinstance(self):
448 self.assertTrue(isinstance(ast.Num(42), ast.Num))
449 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
450 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
451 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
452 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
453 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
454 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
455 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
456 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
457
458 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
459 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
460 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
461 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
462 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
463 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
464 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
465 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
466 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
467
468 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
469 self.assertFalse(isinstance(ast.Num(42), ast.Str))
470 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
471 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
472 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800473 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
474 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300475
476 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
477 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
478 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
479 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
480 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800481 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
482 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300483
484 self.assertFalse(isinstance(ast.Constant(), ast.Num))
485 self.assertFalse(isinstance(ast.Constant(), ast.Str))
486 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
487 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
488 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
489
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200490 class S(str): pass
491 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
492 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
493
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300494 def test_subclasses(self):
495 class N(ast.Num):
496 def __init__(self, *args, **kwargs):
497 super().__init__(*args, **kwargs)
498 self.z = 'spam'
499 class N2(ast.Num):
500 pass
501
502 n = N(42)
503 self.assertEqual(n.n, 42)
504 self.assertEqual(n.z, 'spam')
505 self.assertEqual(type(n), N)
506 self.assertTrue(isinstance(n, N))
507 self.assertTrue(isinstance(n, ast.Num))
508 self.assertFalse(isinstance(n, N2))
509 self.assertFalse(isinstance(ast.Num(42), N))
510 n = N(n=42)
511 self.assertEqual(n.n, 42)
512 self.assertEqual(type(n), N)
513
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500514 def test_module(self):
515 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800516 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500517 self.assertEqual(x.body, body)
518
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000519 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100520 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500521 x = ast.BinOp()
522 self.assertEqual(x._fields, ('left', 'op', 'right'))
523
524 # Random attribute allowed too
525 x.foobarbaz = 5
526 self.assertEqual(x.foobarbaz, 5)
527
528 n1 = ast.Num(1)
529 n3 = ast.Num(3)
530 addop = ast.Add()
531 x = ast.BinOp(n1, addop, n3)
532 self.assertEqual(x.left, n1)
533 self.assertEqual(x.op, addop)
534 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500535
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500536 x = ast.BinOp(1, 2, 3)
537 self.assertEqual(x.left, 1)
538 self.assertEqual(x.op, 2)
539 self.assertEqual(x.right, 3)
540
Georg Brandl0c77a822008-06-10 16:37:50 +0000541 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000542 self.assertEqual(x.left, 1)
543 self.assertEqual(x.op, 2)
544 self.assertEqual(x.right, 3)
545 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000546
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500547 # node raises exception when given too many arguments
548 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500549 # node raises exception when given too many arguments
550 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000551
552 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000553 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000554 self.assertEqual(x.left, 1)
555 self.assertEqual(x.op, 2)
556 self.assertEqual(x.right, 3)
557 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000558
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500559 # Random kwargs also allowed
560 x = ast.BinOp(1, 2, 3, foobarbaz=42)
561 self.assertEqual(x.foobarbaz, 42)
562
563 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000564 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000565 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500566 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000567
568 def test_pickling(self):
569 import pickle
570 mods = [pickle]
571 try:
572 import cPickle
573 mods.append(cPickle)
574 except ImportError:
575 pass
576 protocols = [0, 1, 2]
577 for mod in mods:
578 for protocol in protocols:
579 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
580 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000581 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000582
Benjamin Peterson5b066812010-11-20 01:38:49 +0000583 def test_invalid_sum(self):
584 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800585 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000586 with self.assertRaises(TypeError) as cm:
587 compile(m, "<test>", "exec")
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200588 self.assertIn("but got <ast.expr", str(cm.exception))
Benjamin Peterson5b066812010-11-20 01:38:49 +0000589
Min ho Kimc4cacc82019-07-31 08:16:13 +1000590 def test_invalid_identifier(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800591 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500592 ast.fix_missing_locations(m)
593 with self.assertRaises(TypeError) as cm:
594 compile(m, "<test>", "exec")
595 self.assertIn("identifier must be of type str", str(cm.exception))
596
Batuhan TaĹźkaya0ac59f92020-03-19 14:32:28 +0300597 def test_invalid_constant(self):
598 for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)):
599 e = ast.Expression(body=ast.Constant(invalid_constant))
600 ast.fix_missing_locations(e)
601 with self.assertRaisesRegex(
602 TypeError, "invalid type in Constant: type"
603 ):
604 compile(e, "<test>", "eval")
605
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000606 def test_empty_yield_from(self):
607 # Issue 16546: yield from value is not optional.
608 empty_yield_from = ast.parse("def f():\n yield from g()")
609 empty_yield_from.body[0].body[0].value.value = None
610 with self.assertRaises(ValueError) as cm:
611 compile(empty_yield_from, "<test>", "exec")
Batuhan Taskaya091951a2020-05-06 17:29:32 +0300612 self.assertIn("field 'value' is required", str(cm.exception))
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000613
Oren Milman7dc46d82017-09-30 20:16:24 +0300614 @support.cpython_only
615 def test_issue31592(self):
616 # There shouldn't be an assertion failure in case of a bad
617 # unicodedata.normalize().
618 import unicodedata
619 def bad_normalize(*args):
620 return None
621 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
622 self.assertRaises(TypeError, ast.parse, '\u03D5')
623
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200624 def test_issue18374_binop_col_offset(self):
625 tree = ast.parse('4+5+6+7')
626 parent_binop = tree.body[0].value
627 child_binop = parent_binop.left
628 grandchild_binop = child_binop.left
629 self.assertEqual(parent_binop.col_offset, 0)
630 self.assertEqual(parent_binop.end_col_offset, 7)
631 self.assertEqual(child_binop.col_offset, 0)
632 self.assertEqual(child_binop.end_col_offset, 5)
633 self.assertEqual(grandchild_binop.col_offset, 0)
634 self.assertEqual(grandchild_binop.end_col_offset, 3)
635
636 tree = ast.parse('4+5-\\\n 6-7')
637 parent_binop = tree.body[0].value
638 child_binop = parent_binop.left
639 grandchild_binop = child_binop.left
640 self.assertEqual(parent_binop.col_offset, 0)
641 self.assertEqual(parent_binop.lineno, 1)
642 self.assertEqual(parent_binop.end_col_offset, 4)
643 self.assertEqual(parent_binop.end_lineno, 2)
644
645 self.assertEqual(child_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200646 self.assertEqual(child_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200647 self.assertEqual(child_binop.end_col_offset, 2)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200648 self.assertEqual(child_binop.end_lineno, 2)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200649
650 self.assertEqual(grandchild_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200651 self.assertEqual(grandchild_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200652 self.assertEqual(grandchild_binop.end_col_offset, 3)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200653 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000654
Lysandros Nikolaoud2e10982020-02-08 00:36:32 +0100655 def test_issue39579_dotted_name_end_col_offset(self):
656 tree = ast.parse('@a.b.c\ndef f(): pass')
657 attr_b = tree.body[0].decorator_list[0].value
658 self.assertEqual(attr_b.end_col_offset, 4)
659
Batuhan TaĹźkaya4ab362c2020-03-16 11:12:53 +0300660 def test_ast_asdl_signature(self):
661 self.assertEqual(ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)")
662 self.assertEqual(ast.GtE.__doc__, "GtE")
663 self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)")
664 self.assertEqual(ast.cmpop.__doc__, "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn")
665 expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()]
666 expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}"
667 self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions)
668
Shantanuc116c942020-05-27 13:30:38 -0700669 def test_issue40614_feature_version(self):
670 ast.parse('f"{x=}"', feature_version=(3, 8))
671 with self.assertRaises(SyntaxError):
672 ast.parse('f"{x=}"', feature_version=(3, 7))
673
Batuhan Taskaya68874a82020-06-06 15:44:16 +0300674 def test_constant_as_name(self):
675 for constant in "True", "False", "None":
676 expr = ast.Expression(ast.Name(constant, ast.Load()))
677 ast.fix_missing_locations(expr)
678 with self.assertRaisesRegex(ValueError, f"Name node can't be used with '{constant}' constant"):
679 compile(expr, "<test>", "eval")
680
Batuhan TaĹźkaya4ab362c2020-03-16 11:12:53 +0300681
Georg Brandl0c77a822008-06-10 16:37:50 +0000682class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700683 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000684
685 def test_parse(self):
686 a = ast.parse('foo(1 + 1)')
687 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
688 self.assertEqual(ast.dump(a), ast.dump(b))
689
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400690 def test_parse_in_error(self):
691 try:
692 1/0
693 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400694 with self.assertRaises(SyntaxError) as e:
695 ast.literal_eval(r"'\U'")
696 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400697
Georg Brandl0c77a822008-06-10 16:37:50 +0000698 def test_dump(self):
699 node = ast.parse('spam(eggs, "and cheese")')
700 self.assertEqual(ast.dump(node),
701 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200702 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800703 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000704 )
705 self.assertEqual(ast.dump(node, annotate_fields=False),
706 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200707 "Constant('and cheese')], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000708 )
709 self.assertEqual(ast.dump(node, include_attributes=True),
710 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000711 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
712 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200713 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000714 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
715 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800716 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000717 )
718
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300719 def test_dump_indent(self):
720 node = ast.parse('spam(eggs, "and cheese")')
721 self.assertEqual(ast.dump(node, indent=3), """\
722Module(
723 body=[
724 Expr(
725 value=Call(
726 func=Name(id='spam', ctx=Load()),
727 args=[
728 Name(id='eggs', ctx=Load()),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200729 Constant(value='and cheese')],
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300730 keywords=[]))],
731 type_ignores=[])""")
732 self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
733Module(
734\t[
735\t\tExpr(
736\t\t\tCall(
737\t\t\t\tName('spam', Load()),
738\t\t\t\t[
739\t\t\t\t\tName('eggs', Load()),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200740\t\t\t\t\tConstant('and cheese')],
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300741\t\t\t\t[]))],
742\t[])""")
743 self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
744Module(
745 body=[
746 Expr(
747 value=Call(
748 func=Name(
749 id='spam',
750 ctx=Load(),
751 lineno=1,
752 col_offset=0,
753 end_lineno=1,
754 end_col_offset=4),
755 args=[
756 Name(
757 id='eggs',
758 ctx=Load(),
759 lineno=1,
760 col_offset=5,
761 end_lineno=1,
762 end_col_offset=9),
763 Constant(
764 value='and cheese',
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300765 lineno=1,
766 col_offset=11,
767 end_lineno=1,
768 end_col_offset=23)],
769 keywords=[],
770 lineno=1,
771 col_offset=0,
772 end_lineno=1,
773 end_col_offset=24),
774 lineno=1,
775 col_offset=0,
776 end_lineno=1,
777 end_col_offset=24)],
778 type_ignores=[])""")
779
Serhiy Storchakae64f9482019-08-29 09:30:23 +0300780 def test_dump_incomplete(self):
781 node = ast.Raise(lineno=3, col_offset=4)
782 self.assertEqual(ast.dump(node),
783 "Raise()"
784 )
785 self.assertEqual(ast.dump(node, include_attributes=True),
786 "Raise(lineno=3, col_offset=4)"
787 )
788 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
789 self.assertEqual(ast.dump(node),
790 "Raise(exc=Name(id='e', ctx=Load()))"
791 )
792 self.assertEqual(ast.dump(node, annotate_fields=False),
793 "Raise(Name('e', Load()))"
794 )
795 self.assertEqual(ast.dump(node, include_attributes=True),
796 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
797 )
798 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
799 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
800 )
801 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
802 self.assertEqual(ast.dump(node),
803 "Raise(cause=Name(id='e', ctx=Load()))"
804 )
805 self.assertEqual(ast.dump(node, annotate_fields=False),
806 "Raise(cause=Name('e', Load()))"
807 )
808
Georg Brandl0c77a822008-06-10 16:37:50 +0000809 def test_copy_location(self):
810 src = ast.parse('1 + 1', mode='eval')
811 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
812 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200813 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000814 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
815 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
816 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000817 )
Batuhan Taskaya8f4380d2020-08-05 16:32:32 +0300818 src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1)
819 new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None))
820 self.assertIsNone(new.end_lineno)
821 self.assertIsNone(new.end_col_offset)
822 self.assertEqual(new.lineno, 1)
823 self.assertEqual(new.col_offset, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000824
825 def test_fix_missing_locations(self):
826 src = ast.parse('write("spam")')
827 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400828 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000829 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000830 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000831 self.assertEqual(ast.dump(src, include_attributes=True),
832 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000833 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200834 "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000835 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
836 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
837 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
838 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
839 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
840 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800841 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
842 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000843 )
844
845 def test_increment_lineno(self):
846 src = ast.parse('1 + 1', mode='eval')
847 self.assertEqual(ast.increment_lineno(src, n=3), src)
848 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200849 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
850 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000851 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
852 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000853 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000854 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000855 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000856 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
857 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200858 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
859 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000860 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
861 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000862 )
Batuhan Taskaya8f4380d2020-08-05 16:32:32 +0300863 src = ast.Call(
864 func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1
865 )
866 self.assertEqual(ast.increment_lineno(src).lineno, 2)
867 self.assertIsNone(ast.increment_lineno(src).end_lineno)
Georg Brandl0c77a822008-06-10 16:37:50 +0000868
869 def test_iter_fields(self):
870 node = ast.parse('foo()', mode='eval')
871 d = dict(ast.iter_fields(node.body))
872 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400873 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000874
875 def test_iter_child_nodes(self):
876 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
877 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
878 iterator = ast.iter_child_nodes(node.body)
879 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300880 self.assertEqual(next(iterator).value, 23)
881 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000882 self.assertEqual(ast.dump(next(iterator)),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200883 "keyword(arg='eggs', value=Constant(value='leek'))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000884 )
885
886 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300887 node = ast.parse('"""line one\n line two"""')
888 self.assertEqual(ast.get_docstring(node),
889 'line one\nline two')
890
891 node = ast.parse('class foo:\n """line one\n line two"""')
892 self.assertEqual(ast.get_docstring(node.body[0]),
893 'line one\nline two')
894
Georg Brandl0c77a822008-06-10 16:37:50 +0000895 node = ast.parse('def foo():\n """line one\n line two"""')
896 self.assertEqual(ast.get_docstring(node.body[0]),
897 'line one\nline two')
898
Yury Selivanov2f07a662015-07-23 08:54:35 +0300899 node = ast.parse('async def foo():\n """spam\n ham"""')
900 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300901
902 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800903 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300904 node = ast.parse('x = "not docstring"')
905 self.assertIsNone(ast.get_docstring(node))
906 node = ast.parse('def foo():\n pass')
907 self.assertIsNone(ast.get_docstring(node))
908
909 node = ast.parse('class foo:\n pass')
910 self.assertIsNone(ast.get_docstring(node.body[0]))
911 node = ast.parse('class foo:\n x = "not docstring"')
912 self.assertIsNone(ast.get_docstring(node.body[0]))
913 node = ast.parse('class foo:\n def bar(self): pass')
914 self.assertIsNone(ast.get_docstring(node.body[0]))
915
916 node = ast.parse('def foo():\n pass')
917 self.assertIsNone(ast.get_docstring(node.body[0]))
918 node = ast.parse('def foo():\n x = "not docstring"')
919 self.assertIsNone(ast.get_docstring(node.body[0]))
920
921 node = ast.parse('async def foo():\n pass')
922 self.assertIsNone(ast.get_docstring(node.body[0]))
923 node = ast.parse('async def foo():\n x = "not docstring"')
924 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300925
Anthony Sottile995d9b92019-01-12 20:05:13 -0800926 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
927 node = ast.parse(
928 '"""line one\nline two"""\n\n'
929 'def foo():\n """line one\n line two"""\n\n'
930 ' def bar():\n """line one\n line two"""\n'
931 ' """line one\n line two"""\n'
932 '"""line one\nline two"""\n\n'
933 )
934 self.assertEqual(node.body[0].col_offset, 0)
935 self.assertEqual(node.body[0].lineno, 1)
936 self.assertEqual(node.body[1].body[0].col_offset, 2)
937 self.assertEqual(node.body[1].body[0].lineno, 5)
938 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
939 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
940 self.assertEqual(node.body[1].body[2].col_offset, 2)
941 self.assertEqual(node.body[1].body[2].lineno, 11)
942 self.assertEqual(node.body[2].col_offset, 0)
943 self.assertEqual(node.body[2].lineno, 13)
944
Lysandros Nikolaou025a6022019-12-12 22:40:21 +0100945 def test_elif_stmt_start_position(self):
946 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
947 elif_stmt = node.body[0].orelse[0]
948 self.assertEqual(elif_stmt.lineno, 3)
949 self.assertEqual(elif_stmt.col_offset, 0)
950
Lysandros Nikolaou5936a4c2019-12-14 11:24:57 +0100951 def test_elif_stmt_start_position_with_else(self):
952 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
953 elif_stmt = node.body[0].orelse[0]
954 self.assertEqual(elif_stmt.lineno, 3)
955 self.assertEqual(elif_stmt.col_offset, 0)
956
Lysandros Nikolaou50d4f122019-12-18 01:20:55 +0100957 def test_starred_expr_end_position_within_call(self):
958 node = ast.parse('f(*[0, 1])')
959 starred_expr = node.body[0].value.args[0]
960 self.assertEqual(starred_expr.end_lineno, 1)
961 self.assertEqual(starred_expr.end_col_offset, 9)
962
Georg Brandl0c77a822008-06-10 16:37:50 +0000963 def test_literal_eval(self):
964 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
965 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
966 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000967 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000968 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Raymond Hettinger4fcf5c12020-01-02 22:21:18 -0700969 self.assertEqual(ast.literal_eval('set()'), set())
Georg Brandl0c77a822008-06-10 16:37:50 +0000970 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200971 self.assertEqual(ast.literal_eval('6'), 6)
972 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000973 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000974 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200975 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
976 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
977 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
978 self.assertRaises(ValueError, ast.literal_eval, '++6')
979 self.assertRaises(ValueError, ast.literal_eval, '+True')
980 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000981
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200982 def test_literal_eval_complex(self):
983 # Issue #4907
984 self.assertEqual(ast.literal_eval('6j'), 6j)
985 self.assertEqual(ast.literal_eval('-6j'), -6j)
986 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
987 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
988 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
989 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
990 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
991 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
992 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
993 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
994 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
995 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
996 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
997 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
998 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
999 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
1000 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
1001 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +00001002
Curtis Bucherc21c5122020-05-05 12:40:56 -07001003 def test_literal_eval_malformed_dict_nodes(self):
1004 malformed = ast.Dict(keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)])
1005 self.assertRaises(ValueError, ast.literal_eval, malformed)
1006 malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)])
1007 self.assertRaises(ValueError, ast.literal_eval, malformed)
1008
Batuhan Taskayae799aa82020-10-04 03:46:44 +03001009 def test_literal_eval_trailing_ws(self):
1010 self.assertEqual(ast.literal_eval(" -1"), -1)
1011 self.assertEqual(ast.literal_eval("\t\t-1"), -1)
1012 self.assertEqual(ast.literal_eval(" \t -1"), -1)
1013 self.assertRaises(IndentationError, ast.literal_eval, "\n -1")
1014
Irit Katriel586f3db2020-12-25 17:04:31 +00001015 def test_literal_eval_malformed_lineno(self):
1016 msg = r'malformed node or string on line 3:'
1017 with self.assertRaisesRegex(ValueError, msg):
1018 ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}")
1019
1020 node = ast.UnaryOp(
1021 ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6)))
1022 self.assertIsNone(getattr(node, 'lineno', None))
1023 msg = r'malformed node or string:'
1024 with self.assertRaisesRegex(ValueError, msg):
1025 ast.literal_eval(node)
1026
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +01001027 def test_bad_integer(self):
1028 # issue13436: Bad error message with invalid numeric values
1029 body = [ast.ImportFrom(module='time',
1030 names=[ast.alias(name='sleep')],
1031 level=None,
1032 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001033 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +01001034 with self.assertRaises(ValueError) as cm:
1035 compile(mod, 'test', 'exec')
1036 self.assertIn("invalid integer value: None", str(cm.exception))
1037
Berker Peksag0a5bd512016-04-29 19:50:02 +03001038 def test_level_as_none(self):
1039 body = [ast.ImportFrom(module='time',
1040 names=[ast.alias(name='sleep')],
1041 level=None,
1042 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001043 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +03001044 code = compile(mod, 'test', 'exec')
1045 ns = {}
1046 exec(code, ns)
1047 self.assertIn('sleep', ns)
1048
Georg Brandl0c77a822008-06-10 16:37:50 +00001049
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001050class ASTValidatorTests(unittest.TestCase):
1051
1052 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
1053 mod.lineno = mod.col_offset = 0
1054 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001055 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001056 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001057 else:
1058 with self.assertRaises(exc) as cm:
1059 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001060 self.assertIn(msg, str(cm.exception))
1061
1062 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001063 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001064 self.mod(mod, msg, exc=exc)
1065
1066 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001067 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001068 self.mod(mod, msg)
1069
1070 def test_module(self):
1071 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
1072 self.mod(m, "must have Load context", "single")
1073 m = ast.Expression(ast.Name("x", ast.Store()))
1074 self.mod(m, "must have Load context", "eval")
1075
1076 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001077 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001078 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001079 defaults=None, kw_defaults=None):
1080 if args is None:
1081 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001082 if posonlyargs is None:
1083 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001084 if kwonlyargs is None:
1085 kwonlyargs = []
1086 if defaults is None:
1087 defaults = []
1088 if kw_defaults is None:
1089 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001090 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
1091 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001092 return fac(args)
1093 args = [ast.arg("x", ast.Name("x", ast.Store()))]
1094 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001095 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001096 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001097 check(arguments(defaults=[ast.Num(3)]),
1098 "more positional defaults than args")
1099 check(arguments(kw_defaults=[ast.Num(4)]),
1100 "length of kwonlyargs is not the same as kw_defaults")
1101 args = [ast.arg("x", ast.Name("x", ast.Load()))]
1102 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
1103 "must have Load context")
1104 args = [ast.arg("a", ast.Name("x", ast.Load())),
1105 ast.arg("b", ast.Name("y", ast.Load()))]
1106 check(arguments(kwonlyargs=args,
1107 kw_defaults=[None, ast.Name("x", ast.Store())]),
1108 "must have Load context")
1109
1110 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001111 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001112 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001113 self.stmt(f, "empty body on FunctionDef")
1114 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001115 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001116 self.stmt(f, "must have Load context")
1117 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001118 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001119 self.stmt(f, "must have Load context")
1120 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001121 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001122 self._check_arguments(fac, self.stmt)
1123
1124 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001125 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001126 if bases is None:
1127 bases = []
1128 if keywords is None:
1129 keywords = []
1130 if body is None:
1131 body = [ast.Pass()]
1132 if decorator_list is None:
1133 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001134 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001135 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001136 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1137 "must have Load context")
1138 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1139 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001140 self.stmt(cls(body=[]), "empty body on ClassDef")
1141 self.stmt(cls(body=[None]), "None disallowed")
1142 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1143 "must have Load context")
1144
1145 def test_delete(self):
1146 self.stmt(ast.Delete([]), "empty targets on Delete")
1147 self.stmt(ast.Delete([None]), "None disallowed")
1148 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1149 "must have Del context")
1150
1151 def test_assign(self):
1152 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1153 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1154 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1155 "must have Store context")
1156 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1157 ast.Name("y", ast.Store())),
1158 "must have Load context")
1159
1160 def test_augassign(self):
1161 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1162 ast.Name("y", ast.Load()))
1163 self.stmt(aug, "must have Store context")
1164 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1165 ast.Name("y", ast.Store()))
1166 self.stmt(aug, "must have Load context")
1167
1168 def test_for(self):
1169 x = ast.Name("x", ast.Store())
1170 y = ast.Name("y", ast.Load())
1171 p = ast.Pass()
1172 self.stmt(ast.For(x, y, [], []), "empty body on For")
1173 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1174 "must have Store context")
1175 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1176 "must have Load context")
1177 e = ast.Expr(ast.Name("x", ast.Store()))
1178 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1179 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1180
1181 def test_while(self):
1182 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1183 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1184 "must have Load context")
1185 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1186 [ast.Expr(ast.Name("x", ast.Store()))]),
1187 "must have Load context")
1188
1189 def test_if(self):
1190 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1191 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1192 self.stmt(i, "must have Load context")
1193 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1194 self.stmt(i, "must have Load context")
1195 i = ast.If(ast.Num(3), [ast.Pass()],
1196 [ast.Expr(ast.Name("x", ast.Store()))])
1197 self.stmt(i, "must have Load context")
1198
1199 def test_with(self):
1200 p = ast.Pass()
1201 self.stmt(ast.With([], [p]), "empty items on With")
1202 i = ast.withitem(ast.Num(3), None)
1203 self.stmt(ast.With([i], []), "empty body on With")
1204 i = ast.withitem(ast.Name("x", ast.Store()), None)
1205 self.stmt(ast.With([i], [p]), "must have Load context")
1206 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1207 self.stmt(ast.With([i], [p]), "must have Store context")
1208
1209 def test_raise(self):
1210 r = ast.Raise(None, ast.Num(3))
1211 self.stmt(r, "Raise with cause but no exception")
1212 r = ast.Raise(ast.Name("x", ast.Store()), None)
1213 self.stmt(r, "must have Load context")
1214 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1215 self.stmt(r, "must have Load context")
1216
1217 def test_try(self):
1218 p = ast.Pass()
1219 t = ast.Try([], [], [], [p])
1220 self.stmt(t, "empty body on Try")
1221 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1222 self.stmt(t, "must have Load context")
1223 t = ast.Try([p], [], [], [])
1224 self.stmt(t, "Try has neither except handlers nor finalbody")
1225 t = ast.Try([p], [], [p], [p])
1226 self.stmt(t, "Try has orelse but no except handlers")
1227 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1228 self.stmt(t, "empty body on ExceptHandler")
1229 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1230 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1231 e = [ast.ExceptHandler(None, "x", [p])]
1232 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1233 self.stmt(t, "must have Load context")
1234 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1235 self.stmt(t, "must have Load context")
1236
1237 def test_assert(self):
1238 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1239 "must have Load context")
1240 assrt = ast.Assert(ast.Name("x", ast.Load()),
1241 ast.Name("y", ast.Store()))
1242 self.stmt(assrt, "must have Load context")
1243
1244 def test_import(self):
1245 self.stmt(ast.Import([]), "empty names on Import")
1246
1247 def test_importfrom(self):
1248 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001249 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001250 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1251
1252 def test_global(self):
1253 self.stmt(ast.Global([]), "empty names on Global")
1254
1255 def test_nonlocal(self):
1256 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1257
1258 def test_expr(self):
1259 e = ast.Expr(ast.Name("x", ast.Store()))
1260 self.stmt(e, "must have Load context")
1261
1262 def test_boolop(self):
1263 b = ast.BoolOp(ast.And(), [])
1264 self.expr(b, "less than 2 values")
1265 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1266 self.expr(b, "less than 2 values")
1267 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1268 self.expr(b, "None disallowed")
1269 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1270 self.expr(b, "must have Load context")
1271
1272 def test_unaryop(self):
1273 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1274 self.expr(u, "must have Load context")
1275
1276 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001277 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001278 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1279 "must have Load context")
1280 def fac(args):
1281 return ast.Lambda(args, ast.Name("x", ast.Load()))
1282 self._check_arguments(fac, self.expr)
1283
1284 def test_ifexp(self):
1285 l = ast.Name("x", ast.Load())
1286 s = ast.Name("y", ast.Store())
1287 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001288 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001289
1290 def test_dict(self):
1291 d = ast.Dict([], [ast.Name("x", ast.Load())])
1292 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001293 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1294 self.expr(d, "None disallowed")
1295
1296 def test_set(self):
1297 self.expr(ast.Set([None]), "None disallowed")
1298 s = ast.Set([ast.Name("x", ast.Store())])
1299 self.expr(s, "must have Load context")
1300
1301 def _check_comprehension(self, fac):
1302 self.expr(fac([]), "comprehension with no generators")
1303 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001304 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001305 self.expr(fac([g]), "must have Store context")
1306 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001307 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001308 self.expr(fac([g]), "must have Load context")
1309 x = ast.Name("x", ast.Store())
1310 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001311 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001312 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001313 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001314 self.expr(fac([g]), "must have Load context")
1315
1316 def _simple_comp(self, fac):
1317 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001318 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001319 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1320 "must have Load context")
1321 def wrap(gens):
1322 return fac(ast.Name("x", ast.Store()), gens)
1323 self._check_comprehension(wrap)
1324
1325 def test_listcomp(self):
1326 self._simple_comp(ast.ListComp)
1327
1328 def test_setcomp(self):
1329 self._simple_comp(ast.SetComp)
1330
1331 def test_generatorexp(self):
1332 self._simple_comp(ast.GeneratorExp)
1333
1334 def test_dictcomp(self):
1335 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001336 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001337 c = ast.DictComp(ast.Name("x", ast.Store()),
1338 ast.Name("y", ast.Load()), [g])
1339 self.expr(c, "must have Load context")
1340 c = ast.DictComp(ast.Name("x", ast.Load()),
1341 ast.Name("y", ast.Store()), [g])
1342 self.expr(c, "must have Load context")
1343 def factory(comps):
1344 k = ast.Name("x", ast.Load())
1345 v = ast.Name("y", ast.Load())
1346 return ast.DictComp(k, v, comps)
1347 self._check_comprehension(factory)
1348
1349 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001350 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1351 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001352
1353 def test_compare(self):
1354 left = ast.Name("x", ast.Load())
1355 comp = ast.Compare(left, [ast.In()], [])
1356 self.expr(comp, "no comparators")
1357 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1358 self.expr(comp, "different number of comparators and operands")
1359 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001360 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001361 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001362 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001363
1364 def test_call(self):
1365 func = ast.Name("x", ast.Load())
1366 args = [ast.Name("y", ast.Load())]
1367 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001368 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001369 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001370 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001371 self.expr(call, "None disallowed")
1372 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001373 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001374 self.expr(call, "must have Load context")
1375
1376 def test_num(self):
1377 class subint(int):
1378 pass
1379 class subfloat(float):
1380 pass
1381 class subcomplex(complex):
1382 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001383 for obj in "0", "hello":
1384 self.expr(ast.Num(obj))
1385 for obj in subint(), subfloat(), subcomplex():
1386 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001387
1388 def test_attribute(self):
1389 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1390 self.expr(attr, "must have Load context")
1391
1392 def test_subscript(self):
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001393 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Num(3),
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001394 ast.Load())
1395 self.expr(sub, "must have Load context")
1396 x = ast.Name("x", ast.Load())
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001397 sub = ast.Subscript(x, ast.Name("y", ast.Store()),
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001398 ast.Load())
1399 self.expr(sub, "must have Load context")
1400 s = ast.Name("x", ast.Store())
1401 for args in (s, None, None), (None, s, None), (None, None, s):
1402 sl = ast.Slice(*args)
1403 self.expr(ast.Subscript(x, sl, ast.Load()),
1404 "must have Load context")
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001405 sl = ast.Tuple([], ast.Load())
1406 self.expr(ast.Subscript(x, sl, ast.Load()))
1407 sl = ast.Tuple([s], ast.Load())
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001408 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1409
1410 def test_starred(self):
1411 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1412 ast.Store())
1413 assign = ast.Assign([left], ast.Num(4))
1414 self.stmt(assign, "must have Store context")
1415
1416 def _sequence(self, fac):
1417 self.expr(fac([None], ast.Load()), "None disallowed")
1418 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1419 "must have Load context")
1420
1421 def test_list(self):
1422 self._sequence(ast.List)
1423
1424 def test_tuple(self):
1425 self._sequence(ast.Tuple)
1426
Benjamin Peterson442f2092012-12-06 17:41:04 -05001427 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001428 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001429
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001430 def test_stdlib_validates(self):
1431 stdlib = os.path.dirname(ast.__file__)
1432 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1433 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1434 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001435 with self.subTest(module):
1436 fn = os.path.join(stdlib, module)
1437 with open(fn, "r", encoding="utf-8") as fp:
1438 source = fp.read()
1439 mod = ast.parse(source, fn)
1440 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001441
1442
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001443class ConstantTests(unittest.TestCase):
1444 """Tests on the ast.Constant node type."""
1445
1446 def compile_constant(self, value):
1447 tree = ast.parse("x = 123")
1448
1449 node = tree.body[0].value
1450 new_node = ast.Constant(value=value)
1451 ast.copy_location(new_node, node)
1452 tree.body[0].value = new_node
1453
1454 code = compile(tree, "<string>", "exec")
1455
1456 ns = {}
1457 exec(code, ns)
1458 return ns['x']
1459
Victor Stinnerbe59d142016-01-27 00:39:12 +01001460 def test_validation(self):
1461 with self.assertRaises(TypeError) as cm:
1462 self.compile_constant([1, 2, 3])
1463 self.assertEqual(str(cm.exception),
1464 "got an invalid type in Constant: list")
1465
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001466 def test_singletons(self):
1467 for const in (None, False, True, Ellipsis, b'', frozenset()):
1468 with self.subTest(const=const):
1469 value = self.compile_constant(const)
1470 self.assertIs(value, const)
1471
1472 def test_values(self):
1473 nested_tuple = (1,)
1474 nested_frozenset = frozenset({1})
1475 for level in range(3):
1476 nested_tuple = (nested_tuple, 2)
1477 nested_frozenset = frozenset({nested_frozenset, 2})
1478 values = (123, 123.0, 123j,
1479 "unicode", b'bytes',
1480 tuple("tuple"), frozenset("frozenset"),
1481 nested_tuple, nested_frozenset)
1482 for value in values:
1483 with self.subTest(value=value):
1484 result = self.compile_constant(value)
1485 self.assertEqual(result, value)
1486
1487 def test_assign_to_constant(self):
1488 tree = ast.parse("x = 1")
1489
1490 target = tree.body[0].targets[0]
1491 new_target = ast.Constant(value=1)
1492 ast.copy_location(new_target, target)
1493 tree.body[0].targets[0] = new_target
1494
1495 with self.assertRaises(ValueError) as cm:
1496 compile(tree, "string", "exec")
1497 self.assertEqual(str(cm.exception),
1498 "expression which can't be assigned "
1499 "to in Store context")
1500
1501 def test_get_docstring(self):
1502 tree = ast.parse("'docstring'\nx = 1")
1503 self.assertEqual(ast.get_docstring(tree), 'docstring')
1504
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001505 def get_load_const(self, tree):
1506 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1507 # instructions
1508 co = compile(tree, '<string>', 'exec')
1509 consts = []
1510 for instr in dis.get_instructions(co):
1511 if instr.opname == 'LOAD_CONST':
1512 consts.append(instr.argval)
1513 return consts
1514
1515 @support.cpython_only
1516 def test_load_const(self):
1517 consts = [None,
1518 True, False,
1519 124,
1520 2.0,
1521 3j,
1522 "unicode",
1523 b'bytes',
1524 (1, 2, 3)]
1525
Victor Stinnera2724092016-02-08 18:17:58 +01001526 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1527 code += '\nx = ...'
1528 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001529
1530 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001531 self.assertEqual(self.get_load_const(tree),
1532 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001533
1534 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001535 for assign, const in zip(tree.body, consts):
1536 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001537 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001538 ast.copy_location(new_node, assign.value)
1539 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001540
Victor Stinnera2724092016-02-08 18:17:58 +01001541 self.assertEqual(self.get_load_const(tree),
1542 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001543
1544 def test_literal_eval(self):
1545 tree = ast.parse("1 + 2")
1546 binop = tree.body[0].value
1547
1548 new_left = ast.Constant(value=10)
1549 ast.copy_location(new_left, binop.left)
1550 binop.left = new_left
1551
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001552 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001553 ast.copy_location(new_right, binop.right)
1554 binop.right = new_right
1555
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001556 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001557
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001558 def test_string_kind(self):
1559 c = ast.parse('"x"', mode='eval').body
1560 self.assertEqual(c.value, "x")
1561 self.assertEqual(c.kind, None)
1562
1563 c = ast.parse('u"x"', mode='eval').body
1564 self.assertEqual(c.value, "x")
1565 self.assertEqual(c.kind, "u")
1566
1567 c = ast.parse('r"x"', mode='eval').body
1568 self.assertEqual(c.value, "x")
1569 self.assertEqual(c.kind, None)
1570
1571 c = ast.parse('b"x"', mode='eval').body
1572 self.assertEqual(c.value, b"x")
1573 self.assertEqual(c.kind, None)
1574
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001575
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001576class EndPositionTests(unittest.TestCase):
1577 """Tests for end position of AST nodes.
1578
1579 Testing end positions of nodes requires a bit of extra care
1580 because of how LL parsers work.
1581 """
1582 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1583 self.assertEqual(ast_node.end_lineno, end_lineno)
1584 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1585
1586 def _check_content(self, source, ast_node, content):
1587 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1588
1589 def _parse_value(self, s):
1590 # Use duck-typing to support both single expression
1591 # and a right hand side of an assignment statement.
1592 return ast.parse(s).body[0].value
1593
1594 def test_lambda(self):
1595 s = 'lambda x, *y: None'
1596 lam = self._parse_value(s)
1597 self._check_content(s, lam.body, 'None')
1598 self._check_content(s, lam.args.args[0], 'x')
1599 self._check_content(s, lam.args.vararg, 'y')
1600
1601 def test_func_def(self):
1602 s = dedent('''
1603 def func(x: int,
1604 *args: str,
1605 z: float = 0,
1606 **kwargs: Any) -> bool:
1607 return True
1608 ''').strip()
1609 fdef = ast.parse(s).body[0]
1610 self._check_end_pos(fdef, 5, 15)
1611 self._check_content(s, fdef.body[0], 'return True')
1612 self._check_content(s, fdef.args.args[0], 'x: int')
1613 self._check_content(s, fdef.args.args[0].annotation, 'int')
1614 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1615 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1616
1617 def test_call(self):
1618 s = 'func(x, y=2, **kw)'
1619 call = self._parse_value(s)
1620 self._check_content(s, call.func, 'func')
1621 self._check_content(s, call.keywords[0].value, '2')
1622 self._check_content(s, call.keywords[1].value, 'kw')
1623
1624 def test_call_noargs(self):
1625 s = 'x[0]()'
1626 call = self._parse_value(s)
1627 self._check_content(s, call.func, 'x[0]')
1628 self._check_end_pos(call, 1, 6)
1629
1630 def test_class_def(self):
1631 s = dedent('''
1632 class C(A, B):
1633 x: int = 0
1634 ''').strip()
1635 cdef = ast.parse(s).body[0]
1636 self._check_end_pos(cdef, 2, 14)
1637 self._check_content(s, cdef.bases[1], 'B')
1638 self._check_content(s, cdef.body[0], 'x: int = 0')
1639
1640 def test_class_kw(self):
1641 s = 'class S(metaclass=abc.ABCMeta): pass'
1642 cdef = ast.parse(s).body[0]
1643 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1644
1645 def test_multi_line_str(self):
1646 s = dedent('''
1647 x = """Some multi-line text.
1648
1649 It goes on starting from same indent."""
1650 ''').strip()
1651 assign = ast.parse(s).body[0]
1652 self._check_end_pos(assign, 3, 40)
1653 self._check_end_pos(assign.value, 3, 40)
1654
1655 def test_continued_str(self):
1656 s = dedent('''
1657 x = "first part" \\
1658 "second part"
1659 ''').strip()
1660 assign = ast.parse(s).body[0]
1661 self._check_end_pos(assign, 2, 13)
1662 self._check_end_pos(assign.value, 2, 13)
1663
1664 def test_suites(self):
1665 # We intentionally put these into the same string to check
1666 # that empty lines are not part of the suite.
1667 s = dedent('''
1668 while True:
1669 pass
1670
1671 if one():
1672 x = None
1673 elif other():
1674 y = None
1675 else:
1676 z = None
1677
1678 for x, y in stuff:
1679 assert True
1680
1681 try:
1682 raise RuntimeError
1683 except TypeError as e:
1684 pass
1685
1686 pass
1687 ''').strip()
1688 mod = ast.parse(s)
1689 while_loop = mod.body[0]
1690 if_stmt = mod.body[1]
1691 for_loop = mod.body[2]
1692 try_stmt = mod.body[3]
1693 pass_stmt = mod.body[4]
1694
1695 self._check_end_pos(while_loop, 2, 8)
1696 self._check_end_pos(if_stmt, 9, 12)
1697 self._check_end_pos(for_loop, 12, 15)
1698 self._check_end_pos(try_stmt, 17, 8)
1699 self._check_end_pos(pass_stmt, 19, 4)
1700
1701 self._check_content(s, while_loop.test, 'True')
1702 self._check_content(s, if_stmt.body[0], 'x = None')
1703 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1704 self._check_content(s, for_loop.target, 'x, y')
1705 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1706 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1707
1708 def test_fstring(self):
1709 s = 'x = f"abc {x + y} abc"'
1710 fstr = self._parse_value(s)
1711 binop = fstr.values[1].value
1712 self._check_content(s, binop, 'x + y')
1713
1714 def test_fstring_multi_line(self):
1715 s = dedent('''
1716 f"""Some multi-line text.
1717 {
1718 arg_one
1719 +
1720 arg_two
1721 }
1722 It goes on..."""
1723 ''').strip()
1724 fstr = self._parse_value(s)
1725 binop = fstr.values[1].value
1726 self._check_end_pos(binop, 5, 7)
1727 self._check_content(s, binop.left, 'arg_one')
1728 self._check_content(s, binop.right, 'arg_two')
1729
1730 def test_import_from_multi_line(self):
1731 s = dedent('''
1732 from x.y.z import (
1733 a, b, c as c
1734 )
1735 ''').strip()
1736 imp = ast.parse(s).body[0]
1737 self._check_end_pos(imp, 3, 1)
1738
1739 def test_slices(self):
1740 s1 = 'f()[1, 2] [0]'
1741 s2 = 'x[ a.b: c.d]'
1742 sm = dedent('''
1743 x[ a.b: f () ,
1744 g () : c.d
1745 ]
1746 ''').strip()
1747 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1748 self._check_content(s1, i1.value, 'f()[1, 2]')
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001749 self._check_content(s1, i1.value.slice, '1, 2')
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001750 self._check_content(s2, i2.slice.lower, 'a.b')
1751 self._check_content(s2, i2.slice.upper, 'c.d')
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001752 self._check_content(sm, im.slice.elts[0].upper, 'f ()')
1753 self._check_content(sm, im.slice.elts[1].lower, 'g ()')
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001754 self._check_end_pos(im, 3, 3)
1755
1756 def test_binop(self):
1757 s = dedent('''
1758 (1 * 2 + (3 ) +
1759 4
1760 )
1761 ''').strip()
1762 binop = self._parse_value(s)
1763 self._check_end_pos(binop, 2, 6)
1764 self._check_content(s, binop.right, '4')
1765 self._check_content(s, binop.left, '1 * 2 + (3 )')
1766 self._check_content(s, binop.left.right, '3')
1767
1768 def test_boolop(self):
1769 s = dedent('''
1770 if (one_condition and
1771 (other_condition or yet_another_one)):
1772 pass
1773 ''').strip()
1774 bop = ast.parse(s).body[0].test
1775 self._check_end_pos(bop, 2, 44)
1776 self._check_content(s, bop.values[1],
1777 'other_condition or yet_another_one')
1778
1779 def test_tuples(self):
1780 s1 = 'x = () ;'
1781 s2 = 'x = 1 , ;'
1782 s3 = 'x = (1 , 2 ) ;'
1783 sm = dedent('''
1784 x = (
1785 a, b,
1786 )
1787 ''').strip()
1788 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1789 self._check_content(s1, t1, '()')
1790 self._check_content(s2, t2, '1 ,')
1791 self._check_content(s3, t3, '(1 , 2 )')
1792 self._check_end_pos(tm, 3, 1)
1793
1794 def test_attribute_spaces(self):
1795 s = 'func(x. y .z)'
1796 call = self._parse_value(s)
1797 self._check_content(s, call, s)
1798 self._check_content(s, call.args[0], 'x. y .z')
1799
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02001800 def test_redundant_parenthesis(self):
1801 s = '( ( ( a + b ) ) )'
1802 v = ast.parse(s).body[0].value
1803 self.assertEqual(type(v).__name__, 'BinOp')
1804 self._check_content(s, v, 'a + b')
1805 s2 = 'await ' + s
1806 v = ast.parse(s2).body[0].value.value
1807 self.assertEqual(type(v).__name__, 'BinOp')
1808 self._check_content(s2, v, 'a + b')
1809
1810 def test_trailers_with_redundant_parenthesis(self):
1811 tests = (
1812 ('( ( ( a ) ) ) ( )', 'Call'),
1813 ('( ( ( a ) ) ) ( b )', 'Call'),
1814 ('( ( ( a ) ) ) [ b ]', 'Subscript'),
1815 ('( ( ( a ) ) ) . b', 'Attribute'),
1816 )
1817 for s, t in tests:
1818 with self.subTest(s):
1819 v = ast.parse(s).body[0].value
1820 self.assertEqual(type(v).__name__, t)
1821 self._check_content(s, v, s)
1822 s2 = 'await ' + s
1823 v = ast.parse(s2).body[0].value.value
1824 self.assertEqual(type(v).__name__, t)
1825 self._check_content(s2, v, s)
1826
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001827 def test_displays(self):
1828 s1 = '[{}, {1, }, {1, 2,} ]'
1829 s2 = '{a: b, f (): g () ,}'
1830 c1 = self._parse_value(s1)
1831 c2 = self._parse_value(s2)
1832 self._check_content(s1, c1.elts[0], '{}')
1833 self._check_content(s1, c1.elts[1], '{1, }')
1834 self._check_content(s1, c1.elts[2], '{1, 2,}')
1835 self._check_content(s2, c2.keys[1], 'f ()')
1836 self._check_content(s2, c2.values[1], 'g ()')
1837
1838 def test_comprehensions(self):
1839 s = dedent('''
1840 x = [{x for x, y in stuff
1841 if cond.x} for stuff in things]
1842 ''').strip()
1843 cmp = self._parse_value(s)
1844 self._check_end_pos(cmp, 2, 37)
1845 self._check_content(s, cmp.generators[0].iter, 'things')
1846 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1847 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1848 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1849
1850 def test_yield_await(self):
1851 s = dedent('''
1852 async def f():
1853 yield x
1854 await y
1855 ''').strip()
1856 fdef = ast.parse(s).body[0]
1857 self._check_content(s, fdef.body[0].value, 'yield x')
1858 self._check_content(s, fdef.body[1].value, 'await y')
1859
1860 def test_source_segment_multi(self):
1861 s_orig = dedent('''
1862 x = (
1863 a, b,
1864 ) + ()
1865 ''').strip()
1866 s_tuple = dedent('''
1867 (
1868 a, b,
1869 )
1870 ''').strip()
1871 binop = self._parse_value(s_orig)
1872 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1873
1874 def test_source_segment_padded(self):
1875 s_orig = dedent('''
1876 class C:
1877 def fun(self) -> None:
1878 "Đ–Đ–Đ–Đ–Đ–"
1879 ''').strip()
1880 s_method = ' def fun(self) -> None:\n' \
1881 ' "Đ–Đ–Đ–Đ–Đ–"'
1882 cdef = ast.parse(s_orig).body[0]
1883 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1884 s_method)
1885
1886 def test_source_segment_endings(self):
1887 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1888 v, w, x, y, z = ast.parse(s).body
1889 self._check_content(s, v, 'v = 1')
1890 self._check_content(s, w, 'w = 1')
1891 self._check_content(s, x, 'x = 1')
1892 self._check_content(s, y, 'y = 1')
1893 self._check_content(s, z, 'z = 1')
1894
1895 def test_source_segment_tabs(self):
1896 s = dedent('''
1897 class C:
1898 \t\f def fun(self) -> None:
1899 \t\f pass
1900 ''').strip()
1901 s_method = ' \t\f def fun(self) -> None:\n' \
1902 ' \t\f pass'
1903
1904 cdef = ast.parse(s).body[0]
1905 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1906
Irit Katriele6578a22020-05-18 19:14:12 +01001907 def test_source_segment_missing_info(self):
1908 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n'
1909 v, w, x, y = ast.parse(s).body
1910 del v.lineno
1911 del w.end_lineno
1912 del x.col_offset
1913 del y.end_col_offset
1914 self.assertIsNone(ast.get_source_segment(s, v))
1915 self.assertIsNone(ast.get_source_segment(s, w))
1916 self.assertIsNone(ast.get_source_segment(s, x))
1917 self.assertIsNone(ast.get_source_segment(s, y))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001918
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03001919class NodeVisitorTests(unittest.TestCase):
1920 def test_old_constant_nodes(self):
1921 class Visitor(ast.NodeVisitor):
1922 def visit_Num(self, node):
1923 log.append((node.lineno, 'Num', node.n))
1924 def visit_Str(self, node):
1925 log.append((node.lineno, 'Str', node.s))
1926 def visit_Bytes(self, node):
1927 log.append((node.lineno, 'Bytes', node.s))
1928 def visit_NameConstant(self, node):
1929 log.append((node.lineno, 'NameConstant', node.value))
1930 def visit_Ellipsis(self, node):
1931 log.append((node.lineno, 'Ellipsis', ...))
1932 mod = ast.parse(dedent('''\
1933 i = 42
1934 f = 4.25
1935 c = 4.25j
1936 s = 'string'
1937 b = b'bytes'
1938 t = True
1939 n = None
1940 e = ...
1941 '''))
1942 visitor = Visitor()
1943 log = []
1944 with warnings.catch_warnings(record=True) as wlog:
1945 warnings.filterwarnings('always', '', DeprecationWarning)
1946 visitor.visit(mod)
1947 self.assertEqual(log, [
1948 (1, 'Num', 42),
1949 (2, 'Num', 4.25),
1950 (3, 'Num', 4.25j),
1951 (4, 'Str', 'string'),
1952 (5, 'Bytes', b'bytes'),
1953 (6, 'NameConstant', True),
1954 (7, 'NameConstant', None),
1955 (8, 'Ellipsis', ...),
1956 ])
1957 self.assertEqual([str(w.message) for w in wlog], [
1958 'visit_Num is deprecated; add visit_Constant',
1959 'visit_Num is deprecated; add visit_Constant',
1960 'visit_Num is deprecated; add visit_Constant',
1961 'visit_Str is deprecated; add visit_Constant',
1962 'visit_Bytes is deprecated; add visit_Constant',
1963 'visit_NameConstant is deprecated; add visit_Constant',
1964 'visit_NameConstant is deprecated; add visit_Constant',
1965 'visit_Ellipsis is deprecated; add visit_Constant',
1966 ])
1967
1968
Victor Stinnere5fbe0c2020-09-15 18:03:34 +02001969@support.cpython_only
1970class ModuleStateTests(unittest.TestCase):
1971 # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state.
1972
1973 def check_ast_module(self):
1974 # Check that the _ast module still works as expected
1975 code = 'x + 1'
1976 filename = '<string>'
1977 mode = 'eval'
1978
1979 # Create _ast.AST subclasses instances
1980 ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST)
1981
1982 # Call PyAST_Check()
1983 code = compile(ast_tree, filename, mode)
1984 self.assertIsInstance(code, types.CodeType)
1985
1986 def test_reload_module(self):
1987 # bpo-41194: Importing the _ast module twice must not crash.
1988 with support.swap_item(sys.modules, '_ast', None):
1989 del sys.modules['_ast']
1990 import _ast as ast1
1991
1992 del sys.modules['_ast']
1993 import _ast as ast2
1994
1995 self.check_ast_module()
1996
1997 # Unloading the two _ast module instances must not crash.
1998 del ast1
1999 del ast2
2000 support.gc_collect()
2001
2002 self.check_ast_module()
2003
2004 def test_sys_modules(self):
2005 # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check()
2006 # imported the _ast module internally.
2007 lazy_mod = object()
2008
2009 def my_import(name, *args, **kw):
2010 sys.modules[name] = lazy_mod
2011 return lazy_mod
2012
2013 with support.swap_item(sys.modules, '_ast', None):
2014 del sys.modules['_ast']
2015
2016 with support.swap_attr(builtins, '__import__', my_import):
2017 # Test that compile() does not import the _ast module
2018 self.check_ast_module()
2019 self.assertNotIn('_ast', sys.modules)
2020
2021 # Sanity check of the test itself
2022 import _ast
2023 self.assertIs(_ast, lazy_mod)
2024
2025 def test_subinterpreter(self):
2026 # bpo-41631: Importing and using the _ast module in a subinterpreter
2027 # must not crash.
2028 code = dedent('''
2029 import _ast
2030 import ast
2031 import gc
2032 import sys
2033 import types
2034
2035 # Create _ast.AST subclasses instances and call PyAST_Check()
2036 ast_tree = compile('x+1', '<string>', 'eval',
2037 flags=ast.PyCF_ONLY_AST)
2038 code = compile(ast_tree, 'string', 'eval')
2039 if not isinstance(code, types.CodeType):
2040 raise AssertionError
2041
2042 # Unloading the _ast module must not crash.
2043 del ast, _ast
2044 del sys.modules['ast'], sys.modules['_ast']
2045 gc.collect()
2046 ''')
2047 res = support.run_in_subinterp(code)
2048 self.assertEqual(res, 0)
2049
2050
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002051def main():
2052 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002053 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002054 if sys.argv[1:] == ['-g']:
2055 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
2056 (eval_tests, "eval")):
2057 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01002058 for statement in statements:
2059 tree = ast.parse(statement, "?", kind)
2060 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002061 print("]")
2062 print("main()")
2063 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04002064 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00002065
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002066#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00002067exec_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002068('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []),
2069('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []),
2070('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []),
2071('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9, 1, 29), ('Constant', (1, 9, 1, 29), 'function docstring', None))], [], None, None)], []),
2072('Module', [('FunctionDef', (1, 0, 1, 14), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10, 1, 14))], [], None, None)], []),
2073('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 0, None)]), [('Pass', (1, 12, 1, 16))], [], None, None)], []),
2074('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []),
2075('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []),
2076('Module', [('FunctionDef', (1, 0, 1, 71), 'f', ('arguments', [], [('arg', (1, 6, 1, 7), 'a', None, None), ('arg', (1, 9, 1, 10), 'b', None, None), ('arg', (1, 14, 1, 15), 'c', None, None), ('arg', (1, 22, 1, 23), 'd', None, None), ('arg', (1, 28, 1, 29), 'e', None, None)], ('arg', (1, 35, 1, 39), 'args', None, None), [('arg', (1, 41, 1, 42), 'f', None, None)], [('Constant', (1, 43, 1, 45), 42, None)], ('arg', (1, 49, 1, 55), 'kwargs', None, None), [('Constant', (1, 11, 1, 12), 1, None), ('Constant', (1, 16, 1, 20), None, None), ('List', (1, 24, 1, 26), [], ('Load',)), ('Dict', (1, 30, 1, 32), [], [])]), [('Expr', (1, 58, 1, 71), ('Constant', (1, 58, 1, 71), 'doc for f()', None))], [], None, None)], []),
2077('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []),
2078('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []),
2079('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []),
2080('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []),
2081('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []),
2082('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []),
2083('Module', [('Assign', (1, 0, 1, 7), [('Tuple', (1, 0, 1, 3), [('Name', (1, 0, 1, 1), 'a', ('Store',)), ('Name', (1, 2, 1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 6, 1, 7), 'c', ('Load',)), None)], []),
2084('Module', [('Assign', (1, 0, 1, 9), [('Tuple', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []),
2085('Module', [('Assign', (1, 0, 1, 9), [('List', (1, 0, 1, 5), [('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Name', (1, 3, 1, 4), 'b', ('Store',))], ('Store',))], ('Name', (1, 8, 1, 9), 'c', ('Load',)), None)], []),
2086('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []),
2087('Module', [('For', (1, 0, 1, 15), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Pass', (1, 11, 1, 15))], [], None)], []),
2088('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []),
2089('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []),
2090('Module', [('If', (1, 0, 4, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 4, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [])])], []),
2091('Module', [('If', (1, 0, 6, 6), ('Name', (1, 3, 1, 4), 'a', ('Load',)), [('Pass', (2, 2, 2, 6))], [('If', (3, 0, 6, 6), ('Name', (3, 5, 3, 6), 'b', ('Load',)), [('Pass', (4, 2, 4, 6))], [('Pass', (6, 2, 6, 6))])])], []),
2092('Module', [('With', (1, 0, 1, 17), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',)))], [('Pass', (1, 13, 1, 17))], None)], []),
2093('Module', [('With', (1, 0, 1, 25), [('withitem', ('Name', (1, 5, 1, 6), 'x', ('Load',)), ('Name', (1, 10, 1, 11), 'y', ('Store',))), ('withitem', ('Name', (1, 13, 1, 14), 'z', ('Load',)), ('Name', (1, 18, 1, 19), 'q', ('Store',)))], [('Pass', (1, 21, 1, 25))], None)], []),
2094('Module', [('Raise', (1, 0, 1, 25), ('Call', (1, 6, 1, 25), ('Name', (1, 6, 1, 15), 'Exception', ('Load',)), [('Constant', (1, 16, 1, 24), 'string', None)], []), None)], []),
2095('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [('ExceptHandler', (3, 0, 4, 6), ('Name', (3, 7, 3, 16), 'Exception', ('Load',)), None, [('Pass', (4, 2, 4, 6))])], [], [])], []),
2096('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []),
2097('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []),
2098('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []),
2099('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []),
2100('Module', [('Global', (1, 0, 1, 8), ['v'])], []),
2101('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []),
2102('Module', [('Pass', (1, 0, 1, 4))], []),
2103('Module', [('For', (1, 0, 1, 16), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Break', (1, 11, 1, 16))], [], None)], []),
2104('Module', [('For', (1, 0, 1, 19), ('Name', (1, 4, 1, 5), 'v', ('Store',)), ('Name', (1, 9, 1, 10), 'v', ('Load',)), [('Continue', (1, 11, 1, 19))], [], None)], []),
2105('Module', [('For', (1, 0, 1, 18), ('Tuple', (1, 4, 1, 7), [('Name', (1, 4, 1, 5), 'a', ('Store',)), ('Name', (1, 6, 1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 11, 1, 12), 'c', ('Load',)), [('Pass', (1, 14, 1, 18))], [], None)], []),
2106('Module', [('For', (1, 0, 1, 20), ('Tuple', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []),
2107('Module', [('For', (1, 0, 1, 20), ('List', (1, 4, 1, 9), [('Name', (1, 5, 1, 6), 'a', ('Store',)), ('Name', (1, 7, 1, 8), 'b', ('Store',))], ('Store',)), ('Name', (1, 13, 1, 14), 'c', ('Load',)), [('Pass', (1, 16, 1, 20))], [], None)], []),
2108('Module', [('Expr', (1, 0, 11, 5), ('GeneratorExp', (1, 0, 11, 5), ('Tuple', (2, 4, 6, 5), [('Name', (3, 4, 3, 6), 'Aa', ('Load',)), ('Name', (5, 7, 5, 9), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4, 10, 6), [('Name', (8, 4, 8, 6), 'Aa', ('Store',)), ('Name', (10, 4, 10, 6), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10, 10, 12), 'Cc', ('Load',)), [], 0)]))], []),
2109('Module', [('Expr', (1, 0, 1, 34), ('DictComp', (1, 0, 1, 34), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Name', (1, 11, 1, 12), 'w', ('Store',)), ('Name', (1, 16, 1, 17), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22, 1, 23), 'm', ('Store',)), ('Name', (1, 27, 1, 28), 'p', ('Load',)), [('Name', (1, 32, 1, 33), 'g', ('Load',))], 0)]))], []),
2110('Module', [('Expr', (1, 0, 1, 20), ('DictComp', (1, 0, 1, 20), ('Name', (1, 1, 1, 2), 'a', ('Load',)), ('Name', (1, 5, 1, 6), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'v', ('Store',)), ('Name', (1, 13, 1, 14), 'w', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'x', ('Load',)), [], 0)]))], []),
2111('Module', [('Expr', (1, 0, 1, 19), ('SetComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 12, 1, 13), 'x', ('Load',)), [('Name', (1, 17, 1, 18), 'g', ('Load',))], 0)]))], []),
2112('Module', [('Expr', (1, 0, 1, 16), ('SetComp', (1, 0, 1, 16), ('Name', (1, 1, 1, 2), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7, 1, 10), [('Name', (1, 7, 1, 8), 'l', ('Store',)), ('Name', (1, 9, 1, 10), 'm', ('Store',))], ('Store',)), ('Name', (1, 14, 1, 15), 'x', ('Load',)), [], 0)]))], []),
2113('Module', [('AsyncFunctionDef', (1, 0, 3, 18), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 17), ('Constant', (2, 1, 2, 17), 'async function', None)), ('Expr', (3, 1, 3, 18), ('Await', (3, 1, 3, 18), ('Call', (3, 7, 3, 18), ('Name', (3, 7, 3, 16), 'something', ('Load',)), [], [])))], [], None, None)], []),
2114('Module', [('AsyncFunctionDef', (1, 0, 3, 8), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1, 3, 8), ('Name', (2, 11, 2, 12), 'e', ('Store',)), ('Name', (2, 16, 2, 17), 'i', ('Load',)), [('Expr', (2, 19, 2, 20), ('Constant', (2, 19, 2, 20), 1, None))], [('Expr', (3, 7, 3, 8), ('Constant', (3, 7, 3, 8), 2, None))], None)], [], None, None)], []),
2115('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1, 2, 21), [('withitem', ('Name', (2, 12, 2, 13), 'a', ('Load',)), ('Name', (2, 17, 2, 18), 'b', ('Store',)))], [('Expr', (2, 20, 2, 21), ('Constant', (2, 20, 2, 21), 1, None))], None)], [], None, None)], []),
2116('Module', [('Expr', (1, 0, 1, 14), ('Dict', (1, 0, 1, 14), [None, ('Constant', (1, 10, 1, 11), 2, None)], [('Dict', (1, 3, 1, 8), [('Constant', (1, 4, 1, 5), 1, None)], [('Constant', (1, 6, 1, 7), 2, None)]), ('Constant', (1, 12, 1, 13), 3, None)]))], []),
2117('Module', [('Expr', (1, 0, 1, 12), ('Set', (1, 0, 1, 12), [('Starred', (1, 1, 1, 8), ('Set', (1, 2, 1, 8), [('Constant', (1, 3, 1, 4), 1, None), ('Constant', (1, 6, 1, 7), 2, None)]), ('Load',)), ('Constant', (1, 10, 1, 11), 3, None)]))], []),
2118('Module', [('AsyncFunctionDef', (1, 0, 2, 21), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1, 2, 21), ('ListComp', (2, 1, 2, 21), ('Name', (2, 2, 2, 3), 'i', ('Load',)), [('comprehension', ('Name', (2, 14, 2, 15), 'b', ('Store',)), ('Name', (2, 19, 2, 20), 'c', ('Load',)), [], 1)]))], [], None, None)], []),
2119('Module', [('FunctionDef', (4, 0, 4, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []),
2120('Module', [('AsyncFunctionDef', (4, 0, 4, 19), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15, 4, 19))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])], None, None)], []),
2121('Module', [('ClassDef', (4, 0, 4, 13), 'C', [], [], [('Pass', (4, 9, 4, 13))], [('Name', (1, 1, 1, 6), 'deco1', ('Load',)), ('Call', (2, 1, 2, 8), ('Name', (2, 1, 2, 6), 'deco2', ('Load',)), [], []), ('Call', (3, 1, 3, 9), ('Name', (3, 1, 3, 6), 'deco3', ('Load',)), [('Constant', (3, 7, 3, 8), 1, None)], [])])], []),
2122('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Call', (1, 1, 1, 19), ('Name', (1, 1, 1, 5), 'deco', ('Load',)), [('GeneratorExp', (1, 5, 1, 19), ('Name', (1, 6, 1, 7), 'a', ('Load',)), [('comprehension', ('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 17, 1, 18), 'b', ('Load',)), [], 0)])], [])], None, None)], []),
Lysandros Nikolaoud2e10982020-02-08 00:36:32 +01002123('Module', [('FunctionDef', (2, 0, 2, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9, 2, 13))], [('Attribute', (1, 1, 1, 6), ('Attribute', (1, 1, 1, 4), ('Name', (1, 1, 1, 2), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []),
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002124('Module', [('Expr', (1, 0, 1, 8), ('NamedExpr', (1, 1, 1, 7), ('Name', (1, 1, 1, 2), 'a', ('Store',)), ('Constant', (1, 6, 1, 7), 1, None)))], []),
2125('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []),
2126('Module', [('FunctionDef', (1, 0, 1, 26), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None), ('arg', (1, 15, 1, 16), 'd', None, None), ('arg', (1, 18, 1, 19), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22, 1, 26))], [], None, None)], []),
2127('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25, 1, 29))], [], None, None)], []),
2128('Module', [('FunctionDef', (1, 0, 1, 39), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 12, 1, 13), 'c', None, None)], None, [('arg', (1, 18, 1, 19), 'd', None, None), ('arg', (1, 21, 1, 22), 'e', None, None)], [None, None], ('arg', (1, 26, 1, 32), 'kwargs', None, None), []), [('Pass', (1, 35, 1, 39))], [], None, None)], []),
2129('Module', [('FunctionDef', (1, 0, 1, 20), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None)]), [('Pass', (1, 16, 1, 20))], [], None, None)], []),
2130('Module', [('FunctionDef', (1, 0, 1, 29), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None), ('arg', (1, 19, 1, 20), 'c', None, None)], None, [], [], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None), ('Constant', (1, 21, 1, 22), 4, None)]), [('Pass', (1, 25, 1, 29))], [], None, None)], []),
2131('Module', [('FunctionDef', (1, 0, 1, 32), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 28, 1, 32))], [], None, None)], []),
2132('Module', [('FunctionDef', (1, 0, 1, 30), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], None, [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 26, 1, 30))], [], None, None)], []),
2133('Module', [('FunctionDef', (1, 0, 1, 42), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [('Constant', (1, 24, 1, 25), 4, None)], ('arg', (1, 29, 1, 35), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 38, 1, 42))], [], None, None)], []),
2134('Module', [('FunctionDef', (1, 0, 1, 40), 'f', ('arguments', [('arg', (1, 6, 1, 7), 'a', None, None)], [('arg', (1, 14, 1, 15), 'b', None, None)], None, [('arg', (1, 22, 1, 23), 'c', None, None)], [None], ('arg', (1, 27, 1, 33), 'kwargs', None, None), [('Constant', (1, 8, 1, 9), 1, None), ('Constant', (1, 16, 1, 17), 2, None)]), [('Pass', (1, 36, 1, 40))], [], None, None)], []),
Tim Peters400cbc32006-02-28 18:44:41 +00002135]
2136single_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002137('Interactive', [('Expr', (1, 0, 1, 3), ('BinOp', (1, 0, 1, 3), ('Constant', (1, 0, 1, 1), 1, None), ('Add',), ('Constant', (1, 2, 1, 3), 2, None)))]),
Tim Peters400cbc32006-02-28 18:44:41 +00002138]
2139eval_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002140('Expression', ('Constant', (1, 0, 1, 4), None, None)),
2141('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])),
2142('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))),
2143('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))),
2144('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))),
2145('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])),
2146('Expression', ('Dict', (1, 0, 1, 2), [], [])),
2147('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])),
2148('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])),
2149('Expression', ('ListComp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])),
2150('Expression', ('GeneratorExp', (1, 0, 1, 19), ('Name', (1, 1, 1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 7, 1, 8), 'b', ('Store',)), ('Name', (1, 12, 1, 13), 'c', ('Load',)), [('Name', (1, 17, 1, 18), 'd', ('Load',))], 0)])),
2151('Expression', ('ListComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])),
2152('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2153('Expression', ('ListComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2154('Expression', ('SetComp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])),
2155('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2156('Expression', ('SetComp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2157('Expression', ('GeneratorExp', (1, 0, 1, 20), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 14), [('Name', (1, 11, 1, 12), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 18, 1, 19), 'c', ('Load',)), [], 0)])),
2158('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2159('Expression', ('GeneratorExp', (1, 0, 1, 22), ('Tuple', (1, 1, 1, 6), [('Name', (1, 2, 1, 3), 'a', ('Load',)), ('Name', (1, 4, 1, 5), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11, 1, 16), [('Name', (1, 12, 1, 13), 'a', ('Store',)), ('Name', (1, 14, 1, 15), 'b', ('Store',))], ('Store',)), ('Name', (1, 20, 1, 21), 'c', ('Load',)), [], 0)])),
2160('Expression', ('Compare', (1, 0, 1, 9), ('Constant', (1, 0, 1, 1), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4, 1, 5), 2, None), ('Constant', (1, 8, 1, 9), 3, None)])),
Pablo Galindo40cf35c2020-04-03 21:02:26 +01002161('Expression', ('Call', (1, 0, 1, 17), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Constant', (1, 2, 1, 3), 1, None), ('Constant', (1, 4, 1, 5), 2, None), ('Starred', (1, 10, 1, 12), ('Name', (1, 11, 1, 12), 'd', ('Load',)), ('Load',))], [('keyword', (1, 6, 1, 9), 'c', ('Constant', (1, 8, 1, 9), 3, None)), ('keyword', (1, 13, 1, 16), None, ('Name', (1, 15, 1, 16), 'e', ('Load',)))])),
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002162('Expression', ('Call', (1, 0, 1, 10), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('Starred', (1, 2, 1, 9), ('List', (1, 3, 1, 9), [('Constant', (1, 4, 1, 5), 0, None), ('Constant', (1, 7, 1, 8), 1, None)], ('Load',)), ('Load',))], [])),
2163('Expression', ('Call', (1, 0, 1, 15), ('Name', (1, 0, 1, 1), 'f', ('Load',)), [('GeneratorExp', (1, 1, 1, 15), ('Name', (1, 2, 1, 3), 'a', ('Load',)), [('comprehension', ('Name', (1, 8, 1, 9), 'a', ('Store',)), ('Name', (1, 13, 1, 14), 'b', ('Load',)), [], 0)])], [])),
2164('Expression', ('Constant', (1, 0, 1, 2), 10, None)),
2165('Expression', ('Constant', (1, 0, 1, 8), 'string', None)),
2166('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))),
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02002167('Expression', ('Subscript', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Slice', (1, 2, 1, 5), ('Name', (1, 2, 1, 3), 'b', ('Load',)), ('Name', (1, 4, 1, 5), 'c', ('Load',)), None), ('Load',))),
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002168('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))),
2169('Expression', ('List', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))),
2170('Expression', ('List', (1, 0, 1, 2), [], ('Load',))),
2171('Expression', ('Tuple', (1, 0, 1, 5), [('Constant', (1, 0, 1, 1), 1, None), ('Constant', (1, 2, 1, 3), 2, None), ('Constant', (1, 4, 1, 5), 3, None)], ('Load',))),
2172('Expression', ('Tuple', (1, 0, 1, 7), [('Constant', (1, 1, 1, 2), 1, None), ('Constant', (1, 3, 1, 4), 2, None), ('Constant', (1, 5, 1, 6), 3, None)], ('Load',))),
2173('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))),
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02002174('Expression', ('Call', (1, 0, 1, 17), ('Attribute', (1, 0, 1, 7), ('Attribute', (1, 0, 1, 5), ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8, 1, 16), ('Attribute', (1, 8, 1, 11), ('Name', (1, 8, 1, 9), 'a', ('Load',)), 'b', ('Load',)), ('Slice', (1, 12, 1, 15), ('Constant', (1, 12, 1, 13), 1, None), ('Constant', (1, 14, 1, 15), 2, None), None), ('Load',))], [])),
Tim Peters400cbc32006-02-28 18:44:41 +00002175]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002176main()