blob: 451f40d1f884d73b0d9a970bc3370fdb6c26dfd9 [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)
Tim Peters5ddfe412006-03-01 23:02:57 +0000276
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500277 def test_AST_objects(self):
278 x = ast.AST()
279 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700280 x.foobar = 42
281 self.assertEqual(x.foobar, 42)
282 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500283
284 with self.assertRaises(AttributeError):
285 x.vararg
286
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500287 with self.assertRaises(TypeError):
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200288 # "ast.AST constructor takes 0 positional arguments"
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500289 ast.AST(2)
290
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700291 def test_AST_garbage_collection(self):
292 class X:
293 pass
294 a = ast.AST()
295 a.x = X()
296 a.x.a = a
297 ref = weakref.ref(a.x)
298 del a
299 support.gc_collect()
300 self.assertIsNone(ref())
301
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000302 def test_snippets(self):
303 for input, output, kind in ((exec_tests, exec_results, "exec"),
304 (single_tests, single_results, "single"),
305 (eval_tests, eval_results, "eval")):
306 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400307 with self.subTest(action="parsing", input=i):
308 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
309 self.assertEqual(to_tuple(ast_tree), o)
310 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100311 with self.subTest(action="compiling", input=i, kind=kind):
312 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000313
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000314 def test_ast_validation(self):
315 # compile() is the only function that calls PyAST_Validate
316 snippets_to_validate = exec_tests + single_tests + eval_tests
317 for snippet in snippets_to_validate:
318 tree = ast.parse(snippet)
319 compile(tree, '<string>', 'exec')
320
Benjamin Peterson78565b22009-06-28 19:19:51 +0000321 def test_slice(self):
322 slc = ast.parse("x[::]").body[0].value.slice
323 self.assertIsNone(slc.upper)
324 self.assertIsNone(slc.lower)
325 self.assertIsNone(slc.step)
326
327 def test_from_import(self):
328 im = ast.parse("from . import y").body[0]
329 self.assertIsNone(im.module)
330
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400331 def test_non_interned_future_from_ast(self):
332 mod = ast.parse("from __future__ import division")
333 self.assertIsInstance(mod.body[0], ast.ImportFrom)
334 mod.body[0].module = " __future__ ".strip()
335 compile(mod, "<test>", "exec")
336
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000337 def test_base_classes(self):
338 self.assertTrue(issubclass(ast.For, ast.stmt))
339 self.assertTrue(issubclass(ast.Name, ast.expr))
340 self.assertTrue(issubclass(ast.stmt, ast.AST))
341 self.assertTrue(issubclass(ast.expr, ast.AST))
342 self.assertTrue(issubclass(ast.comprehension, ast.AST))
343 self.assertTrue(issubclass(ast.Gt, ast.AST))
344
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500345 def test_field_attr_existence(self):
346 for name, item in ast.__dict__.items():
Batuhan TaĹźkaya397b96f2020-03-01 23:12:17 +0300347 if self._is_ast_node(name, item):
Serhiy Storchaka13d52c22020-03-10 18:52:34 +0200348 if name == 'Index':
349 # Index(value) just returns value now.
350 # The argument is required.
351 continue
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500352 x = item()
353 if isinstance(x, ast.AST):
354 self.assertEqual(type(x._fields), tuple)
355
356 def test_arguments(self):
357 x = ast.arguments()
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200358 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
359 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500360
361 with self.assertRaises(AttributeError):
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200362 x.args
363 self.assertIsNone(x.vararg)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500364
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100365 x = ast.arguments(*range(1, 8))
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200366 self.assertEqual(x.args, 2)
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100367 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500368
369 def test_field_attr_writable(self):
370 x = ast.Num()
371 # We can assign to _fields
372 x._fields = 666
373 self.assertEqual(x._fields, 666)
374
375 def test_classattrs(self):
376 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700377 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300378
379 with self.assertRaises(AttributeError):
380 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500381
382 with self.assertRaises(AttributeError):
383 x.n
384
385 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300386 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500387 self.assertEqual(x.n, 42)
388
389 with self.assertRaises(AttributeError):
390 x.lineno
391
392 with self.assertRaises(AttributeError):
393 x.foobar
394
395 x = ast.Num(lineno=2)
396 self.assertEqual(x.lineno, 2)
397
398 x = ast.Num(42, lineno=0)
399 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700400 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300401 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500402 self.assertEqual(x.n, 42)
403
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700404 self.assertRaises(TypeError, ast.Num, 1, None, 2)
405 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500406
Rémi Lapeyrec73914a2020-05-24 23:12:57 +0200407 # Arbitrary keyword arguments are supported
408 self.assertEqual(ast.Constant(1, foo='bar').foo, 'bar')
409 self.assertEqual(ast.Num(1, foo='bar').foo, 'bar')
410
411 with self.assertRaisesRegex(TypeError, "Num got multiple values for argument 'n'"):
412 ast.Num(1, n=2)
413 with self.assertRaisesRegex(TypeError, "Constant got multiple values for argument 'value'"):
414 ast.Constant(1, value=2)
415
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300416 self.assertEqual(ast.Num(42).n, 42)
417 self.assertEqual(ast.Num(4.25).n, 4.25)
418 self.assertEqual(ast.Num(4.25j).n, 4.25j)
419 self.assertEqual(ast.Str('42').s, '42')
420 self.assertEqual(ast.Bytes(b'42').s, b'42')
421 self.assertIs(ast.NameConstant(True).value, True)
422 self.assertIs(ast.NameConstant(False).value, False)
423 self.assertIs(ast.NameConstant(None).value, None)
424
425 self.assertEqual(ast.Constant(42).value, 42)
426 self.assertEqual(ast.Constant(4.25).value, 4.25)
427 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
428 self.assertEqual(ast.Constant('42').value, '42')
429 self.assertEqual(ast.Constant(b'42').value, b'42')
430 self.assertIs(ast.Constant(True).value, True)
431 self.assertIs(ast.Constant(False).value, False)
432 self.assertIs(ast.Constant(None).value, None)
433 self.assertIs(ast.Constant(...).value, ...)
434
435 def test_realtype(self):
436 self.assertEqual(type(ast.Num(42)), ast.Constant)
437 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
438 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
439 self.assertEqual(type(ast.Str('42')), ast.Constant)
440 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
441 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
442 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
443 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
444 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
445
446 def test_isinstance(self):
447 self.assertTrue(isinstance(ast.Num(42), ast.Num))
448 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
449 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
450 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
451 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
452 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
453 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
454 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
455 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
456
457 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
458 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
459 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
460 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
461 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
462 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
463 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
464 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
465 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
466
467 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
468 self.assertFalse(isinstance(ast.Num(42), ast.Str))
469 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
470 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
471 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800472 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
473 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300474
475 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
476 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
477 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
478 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
479 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800480 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
481 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300482
483 self.assertFalse(isinstance(ast.Constant(), ast.Num))
484 self.assertFalse(isinstance(ast.Constant(), ast.Str))
485 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
486 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
487 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
488
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200489 class S(str): pass
490 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
491 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
492
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300493 def test_subclasses(self):
494 class N(ast.Num):
495 def __init__(self, *args, **kwargs):
496 super().__init__(*args, **kwargs)
497 self.z = 'spam'
498 class N2(ast.Num):
499 pass
500
501 n = N(42)
502 self.assertEqual(n.n, 42)
503 self.assertEqual(n.z, 'spam')
504 self.assertEqual(type(n), N)
505 self.assertTrue(isinstance(n, N))
506 self.assertTrue(isinstance(n, ast.Num))
507 self.assertFalse(isinstance(n, N2))
508 self.assertFalse(isinstance(ast.Num(42), N))
509 n = N(n=42)
510 self.assertEqual(n.n, 42)
511 self.assertEqual(type(n), N)
512
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500513 def test_module(self):
514 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800515 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500516 self.assertEqual(x.body, body)
517
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000518 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100519 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500520 x = ast.BinOp()
521 self.assertEqual(x._fields, ('left', 'op', 'right'))
522
523 # Random attribute allowed too
524 x.foobarbaz = 5
525 self.assertEqual(x.foobarbaz, 5)
526
527 n1 = ast.Num(1)
528 n3 = ast.Num(3)
529 addop = ast.Add()
530 x = ast.BinOp(n1, addop, n3)
531 self.assertEqual(x.left, n1)
532 self.assertEqual(x.op, addop)
533 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500534
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500535 x = ast.BinOp(1, 2, 3)
536 self.assertEqual(x.left, 1)
537 self.assertEqual(x.op, 2)
538 self.assertEqual(x.right, 3)
539
Georg Brandl0c77a822008-06-10 16:37:50 +0000540 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000541 self.assertEqual(x.left, 1)
542 self.assertEqual(x.op, 2)
543 self.assertEqual(x.right, 3)
544 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000545
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500546 # node raises exception when given too many arguments
547 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500548 # node raises exception when given too many arguments
549 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000550
551 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000552 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000553 self.assertEqual(x.left, 1)
554 self.assertEqual(x.op, 2)
555 self.assertEqual(x.right, 3)
556 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000557
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500558 # Random kwargs also allowed
559 x = ast.BinOp(1, 2, 3, foobarbaz=42)
560 self.assertEqual(x.foobarbaz, 42)
561
562 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000563 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000564 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500565 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000566
567 def test_pickling(self):
568 import pickle
569 mods = [pickle]
570 try:
571 import cPickle
572 mods.append(cPickle)
573 except ImportError:
574 pass
575 protocols = [0, 1, 2]
576 for mod in mods:
577 for protocol in protocols:
578 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
579 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000580 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000581
Benjamin Peterson5b066812010-11-20 01:38:49 +0000582 def test_invalid_sum(self):
583 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800584 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000585 with self.assertRaises(TypeError) as cm:
586 compile(m, "<test>", "exec")
Serhiy Storchakabace59d2020-03-22 20:33:34 +0200587 self.assertIn("but got <ast.expr", str(cm.exception))
Benjamin Peterson5b066812010-11-20 01:38:49 +0000588
Min ho Kimc4cacc82019-07-31 08:16:13 +1000589 def test_invalid_identifier(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800590 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500591 ast.fix_missing_locations(m)
592 with self.assertRaises(TypeError) as cm:
593 compile(m, "<test>", "exec")
594 self.assertIn("identifier must be of type str", str(cm.exception))
595
Batuhan TaĹźkaya0ac59f92020-03-19 14:32:28 +0300596 def test_invalid_constant(self):
597 for invalid_constant in int, (1, 2, int), frozenset((1, 2, int)):
598 e = ast.Expression(body=ast.Constant(invalid_constant))
599 ast.fix_missing_locations(e)
600 with self.assertRaisesRegex(
601 TypeError, "invalid type in Constant: type"
602 ):
603 compile(e, "<test>", "eval")
604
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000605 def test_empty_yield_from(self):
606 # Issue 16546: yield from value is not optional.
607 empty_yield_from = ast.parse("def f():\n yield from g()")
608 empty_yield_from.body[0].body[0].value.value = None
609 with self.assertRaises(ValueError) as cm:
610 compile(empty_yield_from, "<test>", "exec")
Batuhan Taskaya091951a2020-05-06 17:29:32 +0300611 self.assertIn("field 'value' is required", str(cm.exception))
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000612
Oren Milman7dc46d82017-09-30 20:16:24 +0300613 @support.cpython_only
614 def test_issue31592(self):
615 # There shouldn't be an assertion failure in case of a bad
616 # unicodedata.normalize().
617 import unicodedata
618 def bad_normalize(*args):
619 return None
620 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
621 self.assertRaises(TypeError, ast.parse, '\u03D5')
622
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200623 def test_issue18374_binop_col_offset(self):
624 tree = ast.parse('4+5+6+7')
625 parent_binop = tree.body[0].value
626 child_binop = parent_binop.left
627 grandchild_binop = child_binop.left
628 self.assertEqual(parent_binop.col_offset, 0)
629 self.assertEqual(parent_binop.end_col_offset, 7)
630 self.assertEqual(child_binop.col_offset, 0)
631 self.assertEqual(child_binop.end_col_offset, 5)
632 self.assertEqual(grandchild_binop.col_offset, 0)
633 self.assertEqual(grandchild_binop.end_col_offset, 3)
634
635 tree = ast.parse('4+5-\\\n 6-7')
636 parent_binop = tree.body[0].value
637 child_binop = parent_binop.left
638 grandchild_binop = child_binop.left
639 self.assertEqual(parent_binop.col_offset, 0)
640 self.assertEqual(parent_binop.lineno, 1)
641 self.assertEqual(parent_binop.end_col_offset, 4)
642 self.assertEqual(parent_binop.end_lineno, 2)
643
644 self.assertEqual(child_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200645 self.assertEqual(child_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200646 self.assertEqual(child_binop.end_col_offset, 2)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200647 self.assertEqual(child_binop.end_lineno, 2)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200648
649 self.assertEqual(grandchild_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200650 self.assertEqual(grandchild_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200651 self.assertEqual(grandchild_binop.end_col_offset, 3)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200652 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000653
Lysandros Nikolaoud2e10982020-02-08 00:36:32 +0100654 def test_issue39579_dotted_name_end_col_offset(self):
655 tree = ast.parse('@a.b.c\ndef f(): pass')
656 attr_b = tree.body[0].decorator_list[0].value
657 self.assertEqual(attr_b.end_col_offset, 4)
658
Batuhan TaĹźkaya4ab362c2020-03-16 11:12:53 +0300659 def test_ast_asdl_signature(self):
660 self.assertEqual(ast.withitem.__doc__, "withitem(expr context_expr, expr? optional_vars)")
661 self.assertEqual(ast.GtE.__doc__, "GtE")
662 self.assertEqual(ast.Name.__doc__, "Name(identifier id, expr_context ctx)")
663 self.assertEqual(ast.cmpop.__doc__, "cmpop = Eq | NotEq | Lt | LtE | Gt | GtE | Is | IsNot | In | NotIn")
664 expressions = [f" | {node.__doc__}" for node in ast.expr.__subclasses__()]
665 expressions[0] = f"expr = {ast.expr.__subclasses__()[0].__doc__}"
666 self.assertCountEqual(ast.expr.__doc__.split("\n"), expressions)
667
Shantanuc116c942020-05-27 13:30:38 -0700668 def test_issue40614_feature_version(self):
669 ast.parse('f"{x=}"', feature_version=(3, 8))
670 with self.assertRaises(SyntaxError):
671 ast.parse('f"{x=}"', feature_version=(3, 7))
672
Batuhan Taskaya68874a82020-06-06 15:44:16 +0300673 def test_constant_as_name(self):
674 for constant in "True", "False", "None":
675 expr = ast.Expression(ast.Name(constant, ast.Load()))
676 ast.fix_missing_locations(expr)
677 with self.assertRaisesRegex(ValueError, f"Name node can't be used with '{constant}' constant"):
678 compile(expr, "<test>", "eval")
679
Batuhan TaĹźkaya4ab362c2020-03-16 11:12:53 +0300680
Georg Brandl0c77a822008-06-10 16:37:50 +0000681class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700682 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000683
684 def test_parse(self):
685 a = ast.parse('foo(1 + 1)')
686 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
687 self.assertEqual(ast.dump(a), ast.dump(b))
688
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400689 def test_parse_in_error(self):
690 try:
691 1/0
692 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400693 with self.assertRaises(SyntaxError) as e:
694 ast.literal_eval(r"'\U'")
695 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400696
Georg Brandl0c77a822008-06-10 16:37:50 +0000697 def test_dump(self):
698 node = ast.parse('spam(eggs, "and cheese")')
699 self.assertEqual(ast.dump(node),
700 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200701 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800702 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000703 )
704 self.assertEqual(ast.dump(node, annotate_fields=False),
705 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200706 "Constant('and cheese')], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000707 )
708 self.assertEqual(ast.dump(node, include_attributes=True),
709 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000710 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
711 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200712 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000713 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
714 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800715 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000716 )
717
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300718 def test_dump_indent(self):
719 node = ast.parse('spam(eggs, "and cheese")')
720 self.assertEqual(ast.dump(node, indent=3), """\
721Module(
722 body=[
723 Expr(
724 value=Call(
725 func=Name(id='spam', ctx=Load()),
726 args=[
727 Name(id='eggs', ctx=Load()),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200728 Constant(value='and cheese')],
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300729 keywords=[]))],
730 type_ignores=[])""")
731 self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
732Module(
733\t[
734\t\tExpr(
735\t\t\tCall(
736\t\t\t\tName('spam', Load()),
737\t\t\t\t[
738\t\t\t\t\tName('eggs', Load()),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200739\t\t\t\t\tConstant('and cheese')],
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300740\t\t\t\t[]))],
741\t[])""")
742 self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
743Module(
744 body=[
745 Expr(
746 value=Call(
747 func=Name(
748 id='spam',
749 ctx=Load(),
750 lineno=1,
751 col_offset=0,
752 end_lineno=1,
753 end_col_offset=4),
754 args=[
755 Name(
756 id='eggs',
757 ctx=Load(),
758 lineno=1,
759 col_offset=5,
760 end_lineno=1,
761 end_col_offset=9),
762 Constant(
763 value='and cheese',
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300764 lineno=1,
765 col_offset=11,
766 end_lineno=1,
767 end_col_offset=23)],
768 keywords=[],
769 lineno=1,
770 col_offset=0,
771 end_lineno=1,
772 end_col_offset=24),
773 lineno=1,
774 col_offset=0,
775 end_lineno=1,
776 end_col_offset=24)],
777 type_ignores=[])""")
778
Serhiy Storchakae64f9482019-08-29 09:30:23 +0300779 def test_dump_incomplete(self):
780 node = ast.Raise(lineno=3, col_offset=4)
781 self.assertEqual(ast.dump(node),
782 "Raise()"
783 )
784 self.assertEqual(ast.dump(node, include_attributes=True),
785 "Raise(lineno=3, col_offset=4)"
786 )
787 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
788 self.assertEqual(ast.dump(node),
789 "Raise(exc=Name(id='e', ctx=Load()))"
790 )
791 self.assertEqual(ast.dump(node, annotate_fields=False),
792 "Raise(Name('e', Load()))"
793 )
794 self.assertEqual(ast.dump(node, include_attributes=True),
795 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
796 )
797 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
798 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
799 )
800 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
801 self.assertEqual(ast.dump(node),
802 "Raise(cause=Name(id='e', ctx=Load()))"
803 )
804 self.assertEqual(ast.dump(node, annotate_fields=False),
805 "Raise(cause=Name('e', Load()))"
806 )
807
Georg Brandl0c77a822008-06-10 16:37:50 +0000808 def test_copy_location(self):
809 src = ast.parse('1 + 1', mode='eval')
810 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
811 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200812 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000813 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
814 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
815 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000816 )
Batuhan Taskaya8f4380d2020-08-05 16:32:32 +0300817 src = ast.Call(col_offset=1, lineno=1, end_lineno=1, end_col_offset=1)
818 new = ast.copy_location(src, ast.Call(col_offset=None, lineno=None))
819 self.assertIsNone(new.end_lineno)
820 self.assertIsNone(new.end_col_offset)
821 self.assertEqual(new.lineno, 1)
822 self.assertEqual(new.col_offset, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000823
824 def test_fix_missing_locations(self):
825 src = ast.parse('write("spam")')
826 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400827 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000828 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000829 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000830 self.assertEqual(ast.dump(src, include_attributes=True),
831 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000832 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200833 "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000834 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
835 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
836 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
837 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
838 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
839 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800840 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
841 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000842 )
843
844 def test_increment_lineno(self):
845 src = ast.parse('1 + 1', mode='eval')
846 self.assertEqual(ast.increment_lineno(src, n=3), src)
847 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200848 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
849 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000850 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
851 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000852 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000853 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000854 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000855 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
856 self.assertEqual(ast.dump(src, include_attributes=True),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200857 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
858 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000859 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
860 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000861 )
Batuhan Taskaya8f4380d2020-08-05 16:32:32 +0300862 src = ast.Call(
863 func=ast.Name("test", ast.Load()), args=[], keywords=[], lineno=1
864 )
865 self.assertEqual(ast.increment_lineno(src).lineno, 2)
866 self.assertIsNone(ast.increment_lineno(src).end_lineno)
Georg Brandl0c77a822008-06-10 16:37:50 +0000867
868 def test_iter_fields(self):
869 node = ast.parse('foo()', mode='eval')
870 d = dict(ast.iter_fields(node.body))
871 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400872 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000873
874 def test_iter_child_nodes(self):
875 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
876 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
877 iterator = ast.iter_child_nodes(node.body)
878 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300879 self.assertEqual(next(iterator).value, 23)
880 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000881 self.assertEqual(ast.dump(next(iterator)),
Serhiy Storchakab7e95252020-03-10 00:07:47 +0200882 "keyword(arg='eggs', value=Constant(value='leek'))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000883 )
884
885 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300886 node = ast.parse('"""line one\n line two"""')
887 self.assertEqual(ast.get_docstring(node),
888 'line one\nline two')
889
890 node = ast.parse('class foo:\n """line one\n line two"""')
891 self.assertEqual(ast.get_docstring(node.body[0]),
892 'line one\nline two')
893
Georg Brandl0c77a822008-06-10 16:37:50 +0000894 node = ast.parse('def foo():\n """line one\n line two"""')
895 self.assertEqual(ast.get_docstring(node.body[0]),
896 'line one\nline two')
897
Yury Selivanov2f07a662015-07-23 08:54:35 +0300898 node = ast.parse('async def foo():\n """spam\n ham"""')
899 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300900
901 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800902 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300903 node = ast.parse('x = "not docstring"')
904 self.assertIsNone(ast.get_docstring(node))
905 node = ast.parse('def foo():\n pass')
906 self.assertIsNone(ast.get_docstring(node))
907
908 node = ast.parse('class foo:\n pass')
909 self.assertIsNone(ast.get_docstring(node.body[0]))
910 node = ast.parse('class foo:\n x = "not docstring"')
911 self.assertIsNone(ast.get_docstring(node.body[0]))
912 node = ast.parse('class foo:\n def bar(self): pass')
913 self.assertIsNone(ast.get_docstring(node.body[0]))
914
915 node = ast.parse('def foo():\n pass')
916 self.assertIsNone(ast.get_docstring(node.body[0]))
917 node = ast.parse('def foo():\n x = "not docstring"')
918 self.assertIsNone(ast.get_docstring(node.body[0]))
919
920 node = ast.parse('async def foo():\n pass')
921 self.assertIsNone(ast.get_docstring(node.body[0]))
922 node = ast.parse('async def foo():\n x = "not docstring"')
923 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300924
Anthony Sottile995d9b92019-01-12 20:05:13 -0800925 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
926 node = ast.parse(
927 '"""line one\nline two"""\n\n'
928 'def foo():\n """line one\n line two"""\n\n'
929 ' def bar():\n """line one\n line two"""\n'
930 ' """line one\n line two"""\n'
931 '"""line one\nline two"""\n\n'
932 )
933 self.assertEqual(node.body[0].col_offset, 0)
934 self.assertEqual(node.body[0].lineno, 1)
935 self.assertEqual(node.body[1].body[0].col_offset, 2)
936 self.assertEqual(node.body[1].body[0].lineno, 5)
937 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
938 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
939 self.assertEqual(node.body[1].body[2].col_offset, 2)
940 self.assertEqual(node.body[1].body[2].lineno, 11)
941 self.assertEqual(node.body[2].col_offset, 0)
942 self.assertEqual(node.body[2].lineno, 13)
943
Lysandros Nikolaou025a6022019-12-12 22:40:21 +0100944 def test_elif_stmt_start_position(self):
945 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
946 elif_stmt = node.body[0].orelse[0]
947 self.assertEqual(elif_stmt.lineno, 3)
948 self.assertEqual(elif_stmt.col_offset, 0)
949
Lysandros Nikolaou5936a4c2019-12-14 11:24:57 +0100950 def test_elif_stmt_start_position_with_else(self):
951 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
952 elif_stmt = node.body[0].orelse[0]
953 self.assertEqual(elif_stmt.lineno, 3)
954 self.assertEqual(elif_stmt.col_offset, 0)
955
Lysandros Nikolaou50d4f122019-12-18 01:20:55 +0100956 def test_starred_expr_end_position_within_call(self):
957 node = ast.parse('f(*[0, 1])')
958 starred_expr = node.body[0].value.args[0]
959 self.assertEqual(starred_expr.end_lineno, 1)
960 self.assertEqual(starred_expr.end_col_offset, 9)
961
Georg Brandl0c77a822008-06-10 16:37:50 +0000962 def test_literal_eval(self):
963 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
964 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
965 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000966 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000967 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Raymond Hettinger4fcf5c12020-01-02 22:21:18 -0700968 self.assertEqual(ast.literal_eval('set()'), set())
Georg Brandl0c77a822008-06-10 16:37:50 +0000969 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200970 self.assertEqual(ast.literal_eval('6'), 6)
971 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000972 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000973 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200974 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
975 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
976 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
977 self.assertRaises(ValueError, ast.literal_eval, '++6')
978 self.assertRaises(ValueError, ast.literal_eval, '+True')
979 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000980
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200981 def test_literal_eval_complex(self):
982 # Issue #4907
983 self.assertEqual(ast.literal_eval('6j'), 6j)
984 self.assertEqual(ast.literal_eval('-6j'), -6j)
985 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
986 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
987 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
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.25+6.75j'), 3.25+6.75j)
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+6j)'), 3+6j)
996 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
997 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
998 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
999 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
1000 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +00001001
Curtis Bucherc21c5122020-05-05 12:40:56 -07001002 def test_literal_eval_malformed_dict_nodes(self):
1003 malformed = ast.Dict(keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)])
1004 self.assertRaises(ValueError, ast.literal_eval, malformed)
1005 malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)])
1006 self.assertRaises(ValueError, ast.literal_eval, malformed)
1007
Batuhan Taskayae799aa82020-10-04 03:46:44 +03001008 def test_literal_eval_trailing_ws(self):
1009 self.assertEqual(ast.literal_eval(" -1"), -1)
1010 self.assertEqual(ast.literal_eval("\t\t-1"), -1)
1011 self.assertEqual(ast.literal_eval(" \t -1"), -1)
1012 self.assertRaises(IndentationError, ast.literal_eval, "\n -1")
1013
Irit Katriel586f3db2020-12-25 17:04:31 +00001014 def test_literal_eval_malformed_lineno(self):
1015 msg = r'malformed node or string on line 3:'
1016 with self.assertRaisesRegex(ValueError, msg):
1017 ast.literal_eval("{'a': 1,\n'b':2,\n'c':++3,\n'd':4}")
1018
1019 node = ast.UnaryOp(
1020 ast.UAdd(), ast.UnaryOp(ast.UAdd(), ast.Constant(6)))
1021 self.assertIsNone(getattr(node, 'lineno', None))
1022 msg = r'malformed node or string:'
1023 with self.assertRaisesRegex(ValueError, msg):
1024 ast.literal_eval(node)
1025
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +01001026 def test_bad_integer(self):
1027 # issue13436: Bad error message with invalid numeric values
1028 body = [ast.ImportFrom(module='time',
1029 names=[ast.alias(name='sleep')],
1030 level=None,
1031 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001032 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +01001033 with self.assertRaises(ValueError) as cm:
1034 compile(mod, 'test', 'exec')
1035 self.assertIn("invalid integer value: None", str(cm.exception))
1036
Berker Peksag0a5bd512016-04-29 19:50:02 +03001037 def test_level_as_none(self):
1038 body = [ast.ImportFrom(module='time',
1039 names=[ast.alias(name='sleep')],
1040 level=None,
1041 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001042 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +03001043 code = compile(mod, 'test', 'exec')
1044 ns = {}
1045 exec(code, ns)
1046 self.assertIn('sleep', ns)
1047
Georg Brandl0c77a822008-06-10 16:37:50 +00001048
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001049class ASTValidatorTests(unittest.TestCase):
1050
1051 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
1052 mod.lineno = mod.col_offset = 0
1053 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001054 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001055 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001056 else:
1057 with self.assertRaises(exc) as cm:
1058 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001059 self.assertIn(msg, str(cm.exception))
1060
1061 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001062 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001063 self.mod(mod, msg, exc=exc)
1064
1065 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001066 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001067 self.mod(mod, msg)
1068
1069 def test_module(self):
1070 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
1071 self.mod(m, "must have Load context", "single")
1072 m = ast.Expression(ast.Name("x", ast.Store()))
1073 self.mod(m, "must have Load context", "eval")
1074
1075 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001076 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001077 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001078 defaults=None, kw_defaults=None):
1079 if args is None:
1080 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001081 if posonlyargs is None:
1082 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001083 if kwonlyargs is None:
1084 kwonlyargs = []
1085 if defaults is None:
1086 defaults = []
1087 if kw_defaults is None:
1088 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001089 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
1090 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001091 return fac(args)
1092 args = [ast.arg("x", ast.Name("x", ast.Store()))]
1093 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001094 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001095 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001096 check(arguments(defaults=[ast.Num(3)]),
1097 "more positional defaults than args")
1098 check(arguments(kw_defaults=[ast.Num(4)]),
1099 "length of kwonlyargs is not the same as kw_defaults")
1100 args = [ast.arg("x", ast.Name("x", ast.Load()))]
1101 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
1102 "must have Load context")
1103 args = [ast.arg("a", ast.Name("x", ast.Load())),
1104 ast.arg("b", ast.Name("y", ast.Load()))]
1105 check(arguments(kwonlyargs=args,
1106 kw_defaults=[None, ast.Name("x", ast.Store())]),
1107 "must have Load context")
1108
1109 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001110 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001111 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001112 self.stmt(f, "empty body on FunctionDef")
1113 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001114 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001115 self.stmt(f, "must have Load context")
1116 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001117 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001118 self.stmt(f, "must have Load context")
1119 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001120 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001121 self._check_arguments(fac, self.stmt)
1122
1123 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001124 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001125 if bases is None:
1126 bases = []
1127 if keywords is None:
1128 keywords = []
1129 if body is None:
1130 body = [ast.Pass()]
1131 if decorator_list is None:
1132 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001133 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001134 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001135 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1136 "must have Load context")
1137 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1138 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001139 self.stmt(cls(body=[]), "empty body on ClassDef")
1140 self.stmt(cls(body=[None]), "None disallowed")
1141 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1142 "must have Load context")
1143
1144 def test_delete(self):
1145 self.stmt(ast.Delete([]), "empty targets on Delete")
1146 self.stmt(ast.Delete([None]), "None disallowed")
1147 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1148 "must have Del context")
1149
1150 def test_assign(self):
1151 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1152 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1153 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1154 "must have Store context")
1155 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1156 ast.Name("y", ast.Store())),
1157 "must have Load context")
1158
1159 def test_augassign(self):
1160 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1161 ast.Name("y", ast.Load()))
1162 self.stmt(aug, "must have Store context")
1163 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1164 ast.Name("y", ast.Store()))
1165 self.stmt(aug, "must have Load context")
1166
1167 def test_for(self):
1168 x = ast.Name("x", ast.Store())
1169 y = ast.Name("y", ast.Load())
1170 p = ast.Pass()
1171 self.stmt(ast.For(x, y, [], []), "empty body on For")
1172 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1173 "must have Store context")
1174 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1175 "must have Load context")
1176 e = ast.Expr(ast.Name("x", ast.Store()))
1177 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1178 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1179
1180 def test_while(self):
1181 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1182 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1183 "must have Load context")
1184 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1185 [ast.Expr(ast.Name("x", ast.Store()))]),
1186 "must have Load context")
1187
1188 def test_if(self):
1189 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1190 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1191 self.stmt(i, "must have Load context")
1192 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1193 self.stmt(i, "must have Load context")
1194 i = ast.If(ast.Num(3), [ast.Pass()],
1195 [ast.Expr(ast.Name("x", ast.Store()))])
1196 self.stmt(i, "must have Load context")
1197
1198 def test_with(self):
1199 p = ast.Pass()
1200 self.stmt(ast.With([], [p]), "empty items on With")
1201 i = ast.withitem(ast.Num(3), None)
1202 self.stmt(ast.With([i], []), "empty body on With")
1203 i = ast.withitem(ast.Name("x", ast.Store()), None)
1204 self.stmt(ast.With([i], [p]), "must have Load context")
1205 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1206 self.stmt(ast.With([i], [p]), "must have Store context")
1207
1208 def test_raise(self):
1209 r = ast.Raise(None, ast.Num(3))
1210 self.stmt(r, "Raise with cause but no exception")
1211 r = ast.Raise(ast.Name("x", ast.Store()), None)
1212 self.stmt(r, "must have Load context")
1213 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1214 self.stmt(r, "must have Load context")
1215
1216 def test_try(self):
1217 p = ast.Pass()
1218 t = ast.Try([], [], [], [p])
1219 self.stmt(t, "empty body on Try")
1220 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1221 self.stmt(t, "must have Load context")
1222 t = ast.Try([p], [], [], [])
1223 self.stmt(t, "Try has neither except handlers nor finalbody")
1224 t = ast.Try([p], [], [p], [p])
1225 self.stmt(t, "Try has orelse but no except handlers")
1226 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1227 self.stmt(t, "empty body on ExceptHandler")
1228 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1229 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1230 e = [ast.ExceptHandler(None, "x", [p])]
1231 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1232 self.stmt(t, "must have Load context")
1233 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1234 self.stmt(t, "must have Load context")
1235
1236 def test_assert(self):
1237 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1238 "must have Load context")
1239 assrt = ast.Assert(ast.Name("x", ast.Load()),
1240 ast.Name("y", ast.Store()))
1241 self.stmt(assrt, "must have Load context")
1242
1243 def test_import(self):
1244 self.stmt(ast.Import([]), "empty names on Import")
1245
1246 def test_importfrom(self):
1247 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001248 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001249 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1250
1251 def test_global(self):
1252 self.stmt(ast.Global([]), "empty names on Global")
1253
1254 def test_nonlocal(self):
1255 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1256
1257 def test_expr(self):
1258 e = ast.Expr(ast.Name("x", ast.Store()))
1259 self.stmt(e, "must have Load context")
1260
1261 def test_boolop(self):
1262 b = ast.BoolOp(ast.And(), [])
1263 self.expr(b, "less than 2 values")
1264 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1265 self.expr(b, "less than 2 values")
1266 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1267 self.expr(b, "None disallowed")
1268 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1269 self.expr(b, "must have Load context")
1270
1271 def test_unaryop(self):
1272 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1273 self.expr(u, "must have Load context")
1274
1275 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001276 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001277 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1278 "must have Load context")
1279 def fac(args):
1280 return ast.Lambda(args, ast.Name("x", ast.Load()))
1281 self._check_arguments(fac, self.expr)
1282
1283 def test_ifexp(self):
1284 l = ast.Name("x", ast.Load())
1285 s = ast.Name("y", ast.Store())
1286 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001287 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001288
1289 def test_dict(self):
1290 d = ast.Dict([], [ast.Name("x", ast.Load())])
1291 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001292 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1293 self.expr(d, "None disallowed")
1294
1295 def test_set(self):
1296 self.expr(ast.Set([None]), "None disallowed")
1297 s = ast.Set([ast.Name("x", ast.Store())])
1298 self.expr(s, "must have Load context")
1299
1300 def _check_comprehension(self, fac):
1301 self.expr(fac([]), "comprehension with no generators")
1302 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001303 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001304 self.expr(fac([g]), "must have Store context")
1305 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001306 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001307 self.expr(fac([g]), "must have Load context")
1308 x = ast.Name("x", ast.Store())
1309 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001310 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001311 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001312 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001313 self.expr(fac([g]), "must have Load context")
1314
1315 def _simple_comp(self, fac):
1316 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001317 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001318 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1319 "must have Load context")
1320 def wrap(gens):
1321 return fac(ast.Name("x", ast.Store()), gens)
1322 self._check_comprehension(wrap)
1323
1324 def test_listcomp(self):
1325 self._simple_comp(ast.ListComp)
1326
1327 def test_setcomp(self):
1328 self._simple_comp(ast.SetComp)
1329
1330 def test_generatorexp(self):
1331 self._simple_comp(ast.GeneratorExp)
1332
1333 def test_dictcomp(self):
1334 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001335 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001336 c = ast.DictComp(ast.Name("x", ast.Store()),
1337 ast.Name("y", ast.Load()), [g])
1338 self.expr(c, "must have Load context")
1339 c = ast.DictComp(ast.Name("x", ast.Load()),
1340 ast.Name("y", ast.Store()), [g])
1341 self.expr(c, "must have Load context")
1342 def factory(comps):
1343 k = ast.Name("x", ast.Load())
1344 v = ast.Name("y", ast.Load())
1345 return ast.DictComp(k, v, comps)
1346 self._check_comprehension(factory)
1347
1348 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001349 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1350 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001351
1352 def test_compare(self):
1353 left = ast.Name("x", ast.Load())
1354 comp = ast.Compare(left, [ast.In()], [])
1355 self.expr(comp, "no comparators")
1356 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1357 self.expr(comp, "different number of comparators and operands")
1358 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001359 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001360 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001361 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001362
1363 def test_call(self):
1364 func = ast.Name("x", ast.Load())
1365 args = [ast.Name("y", ast.Load())]
1366 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001367 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001368 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001369 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001370 self.expr(call, "None disallowed")
1371 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001372 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001373 self.expr(call, "must have Load context")
1374
1375 def test_num(self):
1376 class subint(int):
1377 pass
1378 class subfloat(float):
1379 pass
1380 class subcomplex(complex):
1381 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001382 for obj in "0", "hello":
1383 self.expr(ast.Num(obj))
1384 for obj in subint(), subfloat(), subcomplex():
1385 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001386
1387 def test_attribute(self):
1388 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1389 self.expr(attr, "must have Load context")
1390
1391 def test_subscript(self):
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001392 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Num(3),
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001393 ast.Load())
1394 self.expr(sub, "must have Load context")
1395 x = ast.Name("x", ast.Load())
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001396 sub = ast.Subscript(x, ast.Name("y", ast.Store()),
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001397 ast.Load())
1398 self.expr(sub, "must have Load context")
1399 s = ast.Name("x", ast.Store())
1400 for args in (s, None, None), (None, s, None), (None, None, s):
1401 sl = ast.Slice(*args)
1402 self.expr(ast.Subscript(x, sl, ast.Load()),
1403 "must have Load context")
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001404 sl = ast.Tuple([], ast.Load())
1405 self.expr(ast.Subscript(x, sl, ast.Load()))
1406 sl = ast.Tuple([s], ast.Load())
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001407 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1408
1409 def test_starred(self):
1410 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1411 ast.Store())
1412 assign = ast.Assign([left], ast.Num(4))
1413 self.stmt(assign, "must have Store context")
1414
1415 def _sequence(self, fac):
1416 self.expr(fac([None], ast.Load()), "None disallowed")
1417 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1418 "must have Load context")
1419
1420 def test_list(self):
1421 self._sequence(ast.List)
1422
1423 def test_tuple(self):
1424 self._sequence(ast.Tuple)
1425
Benjamin Peterson442f2092012-12-06 17:41:04 -05001426 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001427 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001428
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001429 def test_stdlib_validates(self):
1430 stdlib = os.path.dirname(ast.__file__)
1431 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1432 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1433 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001434 with self.subTest(module):
1435 fn = os.path.join(stdlib, module)
1436 with open(fn, "r", encoding="utf-8") as fp:
1437 source = fp.read()
1438 mod = ast.parse(source, fn)
1439 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001440
1441
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001442class ConstantTests(unittest.TestCase):
1443 """Tests on the ast.Constant node type."""
1444
1445 def compile_constant(self, value):
1446 tree = ast.parse("x = 123")
1447
1448 node = tree.body[0].value
1449 new_node = ast.Constant(value=value)
1450 ast.copy_location(new_node, node)
1451 tree.body[0].value = new_node
1452
1453 code = compile(tree, "<string>", "exec")
1454
1455 ns = {}
1456 exec(code, ns)
1457 return ns['x']
1458
Victor Stinnerbe59d142016-01-27 00:39:12 +01001459 def test_validation(self):
1460 with self.assertRaises(TypeError) as cm:
1461 self.compile_constant([1, 2, 3])
1462 self.assertEqual(str(cm.exception),
1463 "got an invalid type in Constant: list")
1464
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001465 def test_singletons(self):
1466 for const in (None, False, True, Ellipsis, b'', frozenset()):
1467 with self.subTest(const=const):
1468 value = self.compile_constant(const)
1469 self.assertIs(value, const)
1470
1471 def test_values(self):
1472 nested_tuple = (1,)
1473 nested_frozenset = frozenset({1})
1474 for level in range(3):
1475 nested_tuple = (nested_tuple, 2)
1476 nested_frozenset = frozenset({nested_frozenset, 2})
1477 values = (123, 123.0, 123j,
1478 "unicode", b'bytes',
1479 tuple("tuple"), frozenset("frozenset"),
1480 nested_tuple, nested_frozenset)
1481 for value in values:
1482 with self.subTest(value=value):
1483 result = self.compile_constant(value)
1484 self.assertEqual(result, value)
1485
1486 def test_assign_to_constant(self):
1487 tree = ast.parse("x = 1")
1488
1489 target = tree.body[0].targets[0]
1490 new_target = ast.Constant(value=1)
1491 ast.copy_location(new_target, target)
1492 tree.body[0].targets[0] = new_target
1493
1494 with self.assertRaises(ValueError) as cm:
1495 compile(tree, "string", "exec")
1496 self.assertEqual(str(cm.exception),
1497 "expression which can't be assigned "
1498 "to in Store context")
1499
1500 def test_get_docstring(self):
1501 tree = ast.parse("'docstring'\nx = 1")
1502 self.assertEqual(ast.get_docstring(tree), 'docstring')
1503
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001504 def get_load_const(self, tree):
1505 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1506 # instructions
1507 co = compile(tree, '<string>', 'exec')
1508 consts = []
1509 for instr in dis.get_instructions(co):
1510 if instr.opname == 'LOAD_CONST':
1511 consts.append(instr.argval)
1512 return consts
1513
1514 @support.cpython_only
1515 def test_load_const(self):
1516 consts = [None,
1517 True, False,
1518 124,
1519 2.0,
1520 3j,
1521 "unicode",
1522 b'bytes',
1523 (1, 2, 3)]
1524
Victor Stinnera2724092016-02-08 18:17:58 +01001525 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1526 code += '\nx = ...'
1527 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001528
1529 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001530 self.assertEqual(self.get_load_const(tree),
1531 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001532
1533 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001534 for assign, const in zip(tree.body, consts):
1535 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001536 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001537 ast.copy_location(new_node, assign.value)
1538 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001539
Victor Stinnera2724092016-02-08 18:17:58 +01001540 self.assertEqual(self.get_load_const(tree),
1541 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001542
1543 def test_literal_eval(self):
1544 tree = ast.parse("1 + 2")
1545 binop = tree.body[0].value
1546
1547 new_left = ast.Constant(value=10)
1548 ast.copy_location(new_left, binop.left)
1549 binop.left = new_left
1550
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001551 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001552 ast.copy_location(new_right, binop.right)
1553 binop.right = new_right
1554
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001555 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001556
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001557 def test_string_kind(self):
1558 c = ast.parse('"x"', mode='eval').body
1559 self.assertEqual(c.value, "x")
1560 self.assertEqual(c.kind, None)
1561
1562 c = ast.parse('u"x"', mode='eval').body
1563 self.assertEqual(c.value, "x")
1564 self.assertEqual(c.kind, "u")
1565
1566 c = ast.parse('r"x"', mode='eval').body
1567 self.assertEqual(c.value, "x")
1568 self.assertEqual(c.kind, None)
1569
1570 c = ast.parse('b"x"', mode='eval').body
1571 self.assertEqual(c.value, b"x")
1572 self.assertEqual(c.kind, None)
1573
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001574
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001575class EndPositionTests(unittest.TestCase):
1576 """Tests for end position of AST nodes.
1577
1578 Testing end positions of nodes requires a bit of extra care
1579 because of how LL parsers work.
1580 """
1581 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1582 self.assertEqual(ast_node.end_lineno, end_lineno)
1583 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1584
1585 def _check_content(self, source, ast_node, content):
1586 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1587
1588 def _parse_value(self, s):
1589 # Use duck-typing to support both single expression
1590 # and a right hand side of an assignment statement.
1591 return ast.parse(s).body[0].value
1592
1593 def test_lambda(self):
1594 s = 'lambda x, *y: None'
1595 lam = self._parse_value(s)
1596 self._check_content(s, lam.body, 'None')
1597 self._check_content(s, lam.args.args[0], 'x')
1598 self._check_content(s, lam.args.vararg, 'y')
1599
1600 def test_func_def(self):
1601 s = dedent('''
1602 def func(x: int,
1603 *args: str,
1604 z: float = 0,
1605 **kwargs: Any) -> bool:
1606 return True
1607 ''').strip()
1608 fdef = ast.parse(s).body[0]
1609 self._check_end_pos(fdef, 5, 15)
1610 self._check_content(s, fdef.body[0], 'return True')
1611 self._check_content(s, fdef.args.args[0], 'x: int')
1612 self._check_content(s, fdef.args.args[0].annotation, 'int')
1613 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1614 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1615
1616 def test_call(self):
1617 s = 'func(x, y=2, **kw)'
1618 call = self._parse_value(s)
1619 self._check_content(s, call.func, 'func')
1620 self._check_content(s, call.keywords[0].value, '2')
1621 self._check_content(s, call.keywords[1].value, 'kw')
1622
1623 def test_call_noargs(self):
1624 s = 'x[0]()'
1625 call = self._parse_value(s)
1626 self._check_content(s, call.func, 'x[0]')
1627 self._check_end_pos(call, 1, 6)
1628
1629 def test_class_def(self):
1630 s = dedent('''
1631 class C(A, B):
1632 x: int = 0
1633 ''').strip()
1634 cdef = ast.parse(s).body[0]
1635 self._check_end_pos(cdef, 2, 14)
1636 self._check_content(s, cdef.bases[1], 'B')
1637 self._check_content(s, cdef.body[0], 'x: int = 0')
1638
1639 def test_class_kw(self):
1640 s = 'class S(metaclass=abc.ABCMeta): pass'
1641 cdef = ast.parse(s).body[0]
1642 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1643
1644 def test_multi_line_str(self):
1645 s = dedent('''
1646 x = """Some multi-line text.
1647
1648 It goes on starting from same indent."""
1649 ''').strip()
1650 assign = ast.parse(s).body[0]
1651 self._check_end_pos(assign, 3, 40)
1652 self._check_end_pos(assign.value, 3, 40)
1653
1654 def test_continued_str(self):
1655 s = dedent('''
1656 x = "first part" \\
1657 "second part"
1658 ''').strip()
1659 assign = ast.parse(s).body[0]
1660 self._check_end_pos(assign, 2, 13)
1661 self._check_end_pos(assign.value, 2, 13)
1662
1663 def test_suites(self):
1664 # We intentionally put these into the same string to check
1665 # that empty lines are not part of the suite.
1666 s = dedent('''
1667 while True:
1668 pass
1669
1670 if one():
1671 x = None
1672 elif other():
1673 y = None
1674 else:
1675 z = None
1676
1677 for x, y in stuff:
1678 assert True
1679
1680 try:
1681 raise RuntimeError
1682 except TypeError as e:
1683 pass
1684
1685 pass
1686 ''').strip()
1687 mod = ast.parse(s)
1688 while_loop = mod.body[0]
1689 if_stmt = mod.body[1]
1690 for_loop = mod.body[2]
1691 try_stmt = mod.body[3]
1692 pass_stmt = mod.body[4]
1693
1694 self._check_end_pos(while_loop, 2, 8)
1695 self._check_end_pos(if_stmt, 9, 12)
1696 self._check_end_pos(for_loop, 12, 15)
1697 self._check_end_pos(try_stmt, 17, 8)
1698 self._check_end_pos(pass_stmt, 19, 4)
1699
1700 self._check_content(s, while_loop.test, 'True')
1701 self._check_content(s, if_stmt.body[0], 'x = None')
1702 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1703 self._check_content(s, for_loop.target, 'x, y')
1704 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1705 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1706
1707 def test_fstring(self):
1708 s = 'x = f"abc {x + y} abc"'
1709 fstr = self._parse_value(s)
1710 binop = fstr.values[1].value
1711 self._check_content(s, binop, 'x + y')
1712
1713 def test_fstring_multi_line(self):
1714 s = dedent('''
1715 f"""Some multi-line text.
1716 {
1717 arg_one
1718 +
1719 arg_two
1720 }
1721 It goes on..."""
1722 ''').strip()
1723 fstr = self._parse_value(s)
1724 binop = fstr.values[1].value
1725 self._check_end_pos(binop, 5, 7)
1726 self._check_content(s, binop.left, 'arg_one')
1727 self._check_content(s, binop.right, 'arg_two')
1728
1729 def test_import_from_multi_line(self):
1730 s = dedent('''
1731 from x.y.z import (
1732 a, b, c as c
1733 )
1734 ''').strip()
1735 imp = ast.parse(s).body[0]
1736 self._check_end_pos(imp, 3, 1)
1737
1738 def test_slices(self):
1739 s1 = 'f()[1, 2] [0]'
1740 s2 = 'x[ a.b: c.d]'
1741 sm = dedent('''
1742 x[ a.b: f () ,
1743 g () : c.d
1744 ]
1745 ''').strip()
1746 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1747 self._check_content(s1, i1.value, 'f()[1, 2]')
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001748 self._check_content(s1, i1.value.slice, '1, 2')
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001749 self._check_content(s2, i2.slice.lower, 'a.b')
1750 self._check_content(s2, i2.slice.upper, 'c.d')
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02001751 self._check_content(sm, im.slice.elts[0].upper, 'f ()')
1752 self._check_content(sm, im.slice.elts[1].lower, 'g ()')
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001753 self._check_end_pos(im, 3, 3)
1754
1755 def test_binop(self):
1756 s = dedent('''
1757 (1 * 2 + (3 ) +
1758 4
1759 )
1760 ''').strip()
1761 binop = self._parse_value(s)
1762 self._check_end_pos(binop, 2, 6)
1763 self._check_content(s, binop.right, '4')
1764 self._check_content(s, binop.left, '1 * 2 + (3 )')
1765 self._check_content(s, binop.left.right, '3')
1766
1767 def test_boolop(self):
1768 s = dedent('''
1769 if (one_condition and
1770 (other_condition or yet_another_one)):
1771 pass
1772 ''').strip()
1773 bop = ast.parse(s).body[0].test
1774 self._check_end_pos(bop, 2, 44)
1775 self._check_content(s, bop.values[1],
1776 'other_condition or yet_another_one')
1777
1778 def test_tuples(self):
1779 s1 = 'x = () ;'
1780 s2 = 'x = 1 , ;'
1781 s3 = 'x = (1 , 2 ) ;'
1782 sm = dedent('''
1783 x = (
1784 a, b,
1785 )
1786 ''').strip()
1787 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1788 self._check_content(s1, t1, '()')
1789 self._check_content(s2, t2, '1 ,')
1790 self._check_content(s3, t3, '(1 , 2 )')
1791 self._check_end_pos(tm, 3, 1)
1792
1793 def test_attribute_spaces(self):
1794 s = 'func(x. y .z)'
1795 call = self._parse_value(s)
1796 self._check_content(s, call, s)
1797 self._check_content(s, call.args[0], 'x. y .z')
1798
Serhiy Storchaka6e619c42020-02-12 22:37:49 +02001799 def test_redundant_parenthesis(self):
1800 s = '( ( ( a + b ) ) )'
1801 v = ast.parse(s).body[0].value
1802 self.assertEqual(type(v).__name__, 'BinOp')
1803 self._check_content(s, v, 'a + b')
1804 s2 = 'await ' + s
1805 v = ast.parse(s2).body[0].value.value
1806 self.assertEqual(type(v).__name__, 'BinOp')
1807 self._check_content(s2, v, 'a + b')
1808
1809 def test_trailers_with_redundant_parenthesis(self):
1810 tests = (
1811 ('( ( ( a ) ) ) ( )', 'Call'),
1812 ('( ( ( a ) ) ) ( b )', 'Call'),
1813 ('( ( ( a ) ) ) [ b ]', 'Subscript'),
1814 ('( ( ( a ) ) ) . b', 'Attribute'),
1815 )
1816 for s, t in tests:
1817 with self.subTest(s):
1818 v = ast.parse(s).body[0].value
1819 self.assertEqual(type(v).__name__, t)
1820 self._check_content(s, v, s)
1821 s2 = 'await ' + s
1822 v = ast.parse(s2).body[0].value.value
1823 self.assertEqual(type(v).__name__, t)
1824 self._check_content(s2, v, s)
1825
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001826 def test_displays(self):
1827 s1 = '[{}, {1, }, {1, 2,} ]'
1828 s2 = '{a: b, f (): g () ,}'
1829 c1 = self._parse_value(s1)
1830 c2 = self._parse_value(s2)
1831 self._check_content(s1, c1.elts[0], '{}')
1832 self._check_content(s1, c1.elts[1], '{1, }')
1833 self._check_content(s1, c1.elts[2], '{1, 2,}')
1834 self._check_content(s2, c2.keys[1], 'f ()')
1835 self._check_content(s2, c2.values[1], 'g ()')
1836
1837 def test_comprehensions(self):
1838 s = dedent('''
1839 x = [{x for x, y in stuff
1840 if cond.x} for stuff in things]
1841 ''').strip()
1842 cmp = self._parse_value(s)
1843 self._check_end_pos(cmp, 2, 37)
1844 self._check_content(s, cmp.generators[0].iter, 'things')
1845 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1846 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1847 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1848
1849 def test_yield_await(self):
1850 s = dedent('''
1851 async def f():
1852 yield x
1853 await y
1854 ''').strip()
1855 fdef = ast.parse(s).body[0]
1856 self._check_content(s, fdef.body[0].value, 'yield x')
1857 self._check_content(s, fdef.body[1].value, 'await y')
1858
1859 def test_source_segment_multi(self):
1860 s_orig = dedent('''
1861 x = (
1862 a, b,
1863 ) + ()
1864 ''').strip()
1865 s_tuple = dedent('''
1866 (
1867 a, b,
1868 )
1869 ''').strip()
1870 binop = self._parse_value(s_orig)
1871 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1872
1873 def test_source_segment_padded(self):
1874 s_orig = dedent('''
1875 class C:
1876 def fun(self) -> None:
1877 "Đ–Đ–Đ–Đ–Đ–"
1878 ''').strip()
1879 s_method = ' def fun(self) -> None:\n' \
1880 ' "Đ–Đ–Đ–Đ–Đ–"'
1881 cdef = ast.parse(s_orig).body[0]
1882 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1883 s_method)
1884
1885 def test_source_segment_endings(self):
1886 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1887 v, w, x, y, z = ast.parse(s).body
1888 self._check_content(s, v, 'v = 1')
1889 self._check_content(s, w, 'w = 1')
1890 self._check_content(s, x, 'x = 1')
1891 self._check_content(s, y, 'y = 1')
1892 self._check_content(s, z, 'z = 1')
1893
1894 def test_source_segment_tabs(self):
1895 s = dedent('''
1896 class C:
1897 \t\f def fun(self) -> None:
1898 \t\f pass
1899 ''').strip()
1900 s_method = ' \t\f def fun(self) -> None:\n' \
1901 ' \t\f pass'
1902
1903 cdef = ast.parse(s).body[0]
1904 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1905
Irit Katriele6578a22020-05-18 19:14:12 +01001906 def test_source_segment_missing_info(self):
1907 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n'
1908 v, w, x, y = ast.parse(s).body
1909 del v.lineno
1910 del w.end_lineno
1911 del x.col_offset
1912 del y.end_col_offset
1913 self.assertIsNone(ast.get_source_segment(s, v))
1914 self.assertIsNone(ast.get_source_segment(s, w))
1915 self.assertIsNone(ast.get_source_segment(s, x))
1916 self.assertIsNone(ast.get_source_segment(s, y))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001917
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03001918class NodeVisitorTests(unittest.TestCase):
1919 def test_old_constant_nodes(self):
1920 class Visitor(ast.NodeVisitor):
1921 def visit_Num(self, node):
1922 log.append((node.lineno, 'Num', node.n))
1923 def visit_Str(self, node):
1924 log.append((node.lineno, 'Str', node.s))
1925 def visit_Bytes(self, node):
1926 log.append((node.lineno, 'Bytes', node.s))
1927 def visit_NameConstant(self, node):
1928 log.append((node.lineno, 'NameConstant', node.value))
1929 def visit_Ellipsis(self, node):
1930 log.append((node.lineno, 'Ellipsis', ...))
1931 mod = ast.parse(dedent('''\
1932 i = 42
1933 f = 4.25
1934 c = 4.25j
1935 s = 'string'
1936 b = b'bytes'
1937 t = True
1938 n = None
1939 e = ...
1940 '''))
1941 visitor = Visitor()
1942 log = []
1943 with warnings.catch_warnings(record=True) as wlog:
1944 warnings.filterwarnings('always', '', DeprecationWarning)
1945 visitor.visit(mod)
1946 self.assertEqual(log, [
1947 (1, 'Num', 42),
1948 (2, 'Num', 4.25),
1949 (3, 'Num', 4.25j),
1950 (4, 'Str', 'string'),
1951 (5, 'Bytes', b'bytes'),
1952 (6, 'NameConstant', True),
1953 (7, 'NameConstant', None),
1954 (8, 'Ellipsis', ...),
1955 ])
1956 self.assertEqual([str(w.message) for w in wlog], [
1957 'visit_Num is deprecated; add visit_Constant',
1958 'visit_Num is deprecated; add visit_Constant',
1959 'visit_Num is deprecated; add visit_Constant',
1960 'visit_Str is deprecated; add visit_Constant',
1961 'visit_Bytes is deprecated; add visit_Constant',
1962 'visit_NameConstant is deprecated; add visit_Constant',
1963 'visit_NameConstant is deprecated; add visit_Constant',
1964 'visit_Ellipsis is deprecated; add visit_Constant',
1965 ])
1966
1967
Victor Stinnere5fbe0c2020-09-15 18:03:34 +02001968@support.cpython_only
1969class ModuleStateTests(unittest.TestCase):
1970 # bpo-41194, bpo-41261, bpo-41631: The _ast module uses a global state.
1971
1972 def check_ast_module(self):
1973 # Check that the _ast module still works as expected
1974 code = 'x + 1'
1975 filename = '<string>'
1976 mode = 'eval'
1977
1978 # Create _ast.AST subclasses instances
1979 ast_tree = compile(code, filename, mode, flags=ast.PyCF_ONLY_AST)
1980
1981 # Call PyAST_Check()
1982 code = compile(ast_tree, filename, mode)
1983 self.assertIsInstance(code, types.CodeType)
1984
1985 def test_reload_module(self):
1986 # bpo-41194: Importing the _ast module twice must not crash.
1987 with support.swap_item(sys.modules, '_ast', None):
1988 del sys.modules['_ast']
1989 import _ast as ast1
1990
1991 del sys.modules['_ast']
1992 import _ast as ast2
1993
1994 self.check_ast_module()
1995
1996 # Unloading the two _ast module instances must not crash.
1997 del ast1
1998 del ast2
1999 support.gc_collect()
2000
2001 self.check_ast_module()
2002
2003 def test_sys_modules(self):
2004 # bpo-41631: Test reproducing a Mercurial crash when PyAST_Check()
2005 # imported the _ast module internally.
2006 lazy_mod = object()
2007
2008 def my_import(name, *args, **kw):
2009 sys.modules[name] = lazy_mod
2010 return lazy_mod
2011
2012 with support.swap_item(sys.modules, '_ast', None):
2013 del sys.modules['_ast']
2014
2015 with support.swap_attr(builtins, '__import__', my_import):
2016 # Test that compile() does not import the _ast module
2017 self.check_ast_module()
2018 self.assertNotIn('_ast', sys.modules)
2019
2020 # Sanity check of the test itself
2021 import _ast
2022 self.assertIs(_ast, lazy_mod)
2023
2024 def test_subinterpreter(self):
2025 # bpo-41631: Importing and using the _ast module in a subinterpreter
2026 # must not crash.
2027 code = dedent('''
2028 import _ast
2029 import ast
2030 import gc
2031 import sys
2032 import types
2033
2034 # Create _ast.AST subclasses instances and call PyAST_Check()
2035 ast_tree = compile('x+1', '<string>', 'eval',
2036 flags=ast.PyCF_ONLY_AST)
2037 code = compile(ast_tree, 'string', 'eval')
2038 if not isinstance(code, types.CodeType):
2039 raise AssertionError
2040
2041 # Unloading the _ast module must not crash.
2042 del ast, _ast
2043 del sys.modules['ast'], sys.modules['_ast']
2044 gc.collect()
2045 ''')
2046 res = support.run_in_subinterp(code)
2047 self.assertEqual(res, 0)
2048
2049
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002050def main():
2051 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00002052 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002053 if sys.argv[1:] == ['-g']:
2054 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
2055 (eval_tests, "eval")):
2056 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01002057 for statement in statements:
2058 tree = ast.parse(statement, "?", kind)
2059 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002060 print("]")
2061 print("main()")
2062 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04002063 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00002064
Guido van Rossumdcfcd142019-01-31 03:40:27 -08002065#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00002066exec_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002067('Module', [('Expr', (1, 0, 1, 4), ('Constant', (1, 0, 1, 4), None, None))], []),
2068('Module', [('Expr', (1, 0, 1, 18), ('Constant', (1, 0, 1, 18), 'module docstring', None))], []),
2069('Module', [('FunctionDef', (1, 0, 1, 13), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9, 1, 13))], [], None, None)], []),
2070('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)], []),
2071('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)], []),
2072('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)], []),
2073('Module', [('FunctionDef', (1, 0, 1, 18), 'f', ('arguments', [], [], ('arg', (1, 7, 1, 11), 'args', None, None), [], [], None, []), [('Pass', (1, 14, 1, 18))], [], None, None)], []),
2074('Module', [('FunctionDef', (1, 0, 1, 21), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8, 1, 14), 'kwargs', None, None), []), [('Pass', (1, 17, 1, 21))], [], None, None)], []),
2075('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)], []),
2076('Module', [('ClassDef', (1, 0, 1, 12), 'C', [], [], [('Pass', (1, 8, 1, 12))], [])], []),
2077('Module', [('ClassDef', (1, 0, 1, 32), 'C', [], [], [('Expr', (1, 9, 1, 32), ('Constant', (1, 9, 1, 32), 'docstring for class C', None))], [])], []),
2078('Module', [('ClassDef', (1, 0, 1, 21), 'C', [('Name', (1, 8, 1, 14), 'object', ('Load',))], [], [('Pass', (1, 17, 1, 21))], [])], []),
2079('Module', [('FunctionDef', (1, 0, 1, 16), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8, 1, 16), ('Constant', (1, 15, 1, 16), 1, None))], [], None, None)], []),
2080('Module', [('Delete', (1, 0, 1, 5), [('Name', (1, 4, 1, 5), 'v', ('Del',))])], []),
2081('Module', [('Assign', (1, 0, 1, 5), [('Name', (1, 0, 1, 1), 'v', ('Store',))], ('Constant', (1, 4, 1, 5), 1, None), None)], []),
2082('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)], []),
2083('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)], []),
2084('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)], []),
2085('Module', [('AugAssign', (1, 0, 1, 6), ('Name', (1, 0, 1, 1), 'v', ('Store',)), ('Add',), ('Constant', (1, 5, 1, 6), 1, None))], []),
2086('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)], []),
2087('Module', [('While', (1, 0, 1, 12), ('Name', (1, 6, 1, 7), 'v', ('Load',)), [('Pass', (1, 8, 1, 12))], [])], []),
2088('Module', [('If', (1, 0, 1, 9), ('Name', (1, 3, 1, 4), 'v', ('Load',)), [('Pass', (1, 5, 1, 9))], [])], []),
2089('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))], [])])], []),
2090('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))])])], []),
2091('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)], []),
2092('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)], []),
2093('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)], []),
2094('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))])], [], [])], []),
2095('Module', [('Try', (1, 0, 4, 6), [('Pass', (2, 2, 2, 6))], [], [], [('Pass', (4, 2, 4, 6))])], []),
2096('Module', [('Assert', (1, 0, 1, 8), ('Name', (1, 7, 1, 8), 'v', ('Load',)), None)], []),
2097('Module', [('Import', (1, 0, 1, 10), [('alias', 'sys', None)])], []),
2098('Module', [('ImportFrom', (1, 0, 1, 17), 'sys', [('alias', 'v', None)], 0)], []),
2099('Module', [('Global', (1, 0, 1, 8), ['v'])], []),
2100('Module', [('Expr', (1, 0, 1, 1), ('Constant', (1, 0, 1, 1), 1, None))], []),
2101('Module', [('Pass', (1, 0, 1, 4))], []),
2102('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)], []),
2103('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)], []),
2104('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)], []),
2105('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)], []),
2106('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)], []),
2107('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)]))], []),
2108('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)]))], []),
2109('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)]))], []),
2110('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)]))], []),
2111('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)]))], []),
2112('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)], []),
2113('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)], []),
2114('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)], []),
2115('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)]))], []),
2116('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)]))], []),
2117('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)], []),
2118('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)], []),
2119('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)], []),
2120('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)], [])])], []),
2121('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 +01002122('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 +02002123('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)))], []),
2124('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)], []),
2125('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)], []),
2126('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)], []),
2127('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)], []),
2128('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)], []),
2129('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)], []),
2130('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)], []),
2131('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)], []),
2132('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)], []),
2133('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 +00002134]
2135single_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002136('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 +00002137]
2138eval_results = [
Serhiy Storchaka850a8852020-01-10 10:12:55 +02002139('Expression', ('Constant', (1, 0, 1, 4), None, None)),
2140('Expression', ('BoolOp', (1, 0, 1, 7), ('And',), [('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Name', (1, 6, 1, 7), 'b', ('Load',))])),
2141('Expression', ('BinOp', (1, 0, 1, 5), ('Name', (1, 0, 1, 1), 'a', ('Load',)), ('Add',), ('Name', (1, 4, 1, 5), 'b', ('Load',)))),
2142('Expression', ('UnaryOp', (1, 0, 1, 5), ('Not',), ('Name', (1, 4, 1, 5), 'v', ('Load',)))),
2143('Expression', ('Lambda', (1, 0, 1, 11), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7, 1, 11), None, None))),
2144('Expression', ('Dict', (1, 0, 1, 7), [('Constant', (1, 2, 1, 3), 1, None)], [('Constant', (1, 4, 1, 5), 2, None)])),
2145('Expression', ('Dict', (1, 0, 1, 2), [], [])),
2146('Expression', ('Set', (1, 0, 1, 7), [('Constant', (1, 1, 1, 5), None, None)])),
2147('Expression', ('Dict', (1, 0, 5, 6), [('Constant', (2, 6, 2, 7), 1, None)], [('Constant', (4, 10, 4, 11), 2, None)])),
2148('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)])),
2149('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)])),
2150('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)])),
2151('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)])),
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', ('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)])),
2153('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)])),
2154('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)])),
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', ('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)])),
2156('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)])),
2157('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)])),
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', ('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)])),
2159('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 +01002160('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 +02002161('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',))], [])),
2162('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)])], [])),
2163('Expression', ('Constant', (1, 0, 1, 2), 10, None)),
2164('Expression', ('Constant', (1, 0, 1, 8), 'string', None)),
2165('Expression', ('Attribute', (1, 0, 1, 3), ('Name', (1, 0, 1, 1), 'a', ('Load',)), 'b', ('Load',))),
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02002166('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 +02002167('Expression', ('Name', (1, 0, 1, 1), 'v', ('Load',))),
2168('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',))),
2169('Expression', ('List', (1, 0, 1, 2), [], ('Load',))),
2170('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',))),
2171('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',))),
2172('Expression', ('Tuple', (1, 0, 1, 2), [], ('Load',))),
Serhiy Storchaka13d52c22020-03-10 18:52:34 +02002173('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 +00002174]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00002175main()