blob: 47e259eb2656c7c331a9e07e293a43b0a1fe1445 [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
2import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003import os
4import sys
5import unittest
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03006import warnings
Benjamin Peterson9ed37432012-07-08 11:13:36 -07007import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07009
10from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000011
12def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000013 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000014 return t
15 elif isinstance(t, list):
16 return [to_tuple(e) for e in t]
17 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000018 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
19 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000020 if t._fields is None:
21 return tuple(result)
22 for f in t._fields:
23 result.append(to_tuple(getattr(t, f)))
24 return tuple(result)
25
Neal Norwitzee9b10a2008-03-31 05:29:39 +000026
Tim Peters400cbc32006-02-28 18:44:41 +000027# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030028# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000029exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050030 # None
31 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090032 # Module docstring
33 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000034 # FunctionDef
35 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090036 # FunctionDef with docstring
37 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050038 # FunctionDef with arg
39 "def f(a): pass",
40 # FunctionDef with arg and default value
41 "def f(a=0): pass",
42 # FunctionDef with varargs
43 "def f(*args): pass",
44 # FunctionDef with kwargs
45 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090046 # FunctionDef with all kind of args and docstring
47 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000048 # ClassDef
49 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090050 # ClassDef with docstring
51 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050052 # ClassDef, new style class
53 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000054 # Return
55 "def f():return 1",
56 # Delete
57 "del v",
58 # Assign
59 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020060 "a,b = c",
61 "(a,b) = c",
62 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000063 # AugAssign
64 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000065 # For
66 "for v in v:pass",
67 # While
68 "while v:pass",
69 # If
70 "if v:pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050071 # With
72 "with x as y: pass",
73 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000074 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000075 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000076 # TryExcept
77 "try:\n pass\nexcept Exception:\n pass",
78 # TryFinally
79 "try:\n pass\nfinally:\n pass",
80 # Assert
81 "assert v",
82 # Import
83 "import sys",
84 # ImportFrom
85 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000086 # Global
87 "global v",
88 # Expr
89 "1",
90 # Pass,
91 "pass",
92 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040093 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000094 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040095 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000096 # for statements with naked tuples (see http://bugs.python.org/issue6704)
97 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +020098 "for (a,b) in c: pass",
99 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500100 # Multiline generator expression (test for .lineno & .col_offset)
101 """(
102 (
103 Aa
104 ,
105 Bb
106 )
107 for
108 Aa
109 ,
110 Bb in Cc
111 )""",
112 # dictcomp
113 "{a : b for w in x for m in p if g}",
114 # dictcomp with naked tuple
115 "{a : b for v,w in x}",
116 # setcomp
117 "{r for l in x if g}",
118 # setcomp with naked tuple
119 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400120 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900121 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400122 # AsyncFor
123 "async def f():\n async for e in i: 1\n else: 2",
124 # AsyncWith
125 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400126 # PEP 448: Additional Unpacking Generalizations
127 "{**{1:2}, 2:3}",
128 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700129 # Asynchronous comprehensions
130 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200131 # Decorated FunctionDef
132 "@deco1\n@deco2()\ndef f(): pass",
133 # Decorated AsyncFunctionDef
134 "@deco1\n@deco2()\nasync def f(): pass",
135 # Decorated ClassDef
136 "@deco1\n@deco2()\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200137 # Decorator with generator argument
138 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000139 # Simple assignment expression
140 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100141 # Positional-only arguments
142 "def f(a, /,): pass",
143 "def f(a, /, c, d, e): pass",
144 "def f(a, /, c, *, d, e): pass",
145 "def f(a, /, c, *, d, e, **kwargs): pass",
146 # Positional-only arguments with defaults
147 "def f(a=1, /,): pass",
148 "def f(a=1, /, b=2, c=4): pass",
149 "def f(a=1, /, b=2, *, c=4): pass",
150 "def f(a=1, /, b=2, *, c): pass",
151 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
152 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000153
Tim Peters400cbc32006-02-28 18:44:41 +0000154]
155
156# These are compiled through "single"
157# because of overlap with "eval", it just tests what
158# can't be tested with "eval"
159single_tests = [
160 "1+2"
161]
162
163# These are compiled through "eval"
164# It should test all expressions
165eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500166 # None
167 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000168 # BoolOp
169 "a and b",
170 # BinOp
171 "a + b",
172 # UnaryOp
173 "not v",
174 # Lambda
175 "lambda:None",
176 # Dict
177 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500178 # Empty dict
179 "{}",
180 # Set
181 "{None,}",
182 # Multiline dict (test for .lineno & .col_offset)
183 """{
184 1
185 :
186 2
187 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000188 # ListComp
189 "[a for b in c if d]",
190 # GeneratorExp
191 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200192 # Comprehensions with multiple for targets
193 "[(a,b) for a,b in c]",
194 "[(a,b) for (a,b) in c]",
195 "[(a,b) for [a,b] in c]",
196 "{(a,b) for a,b in c}",
197 "{(a,b) for (a,b) in c}",
198 "{(a,b) for [a,b] in c}",
199 "((a,b) for a,b in c)",
200 "((a,b) for (a,b) in c)",
201 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000202 # Yield - yield expressions can't work outside a function
203 #
204 # Compare
205 "1 < 2 < 3",
206 # Call
207 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200208 # Call with a generator argument
209 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000210 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000211 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000212 # Str
213 "'string'",
214 # Attribute
215 "a.b",
216 # Subscript
217 "a[b:c]",
218 # Name
219 "v",
220 # List
221 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500222 # Empty list
223 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000224 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000225 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500226 # Tuple
227 "(1,2,3)",
228 # Empty tuple
229 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000230 # Combination
231 "a.b.c.d(a.b[1:2])",
232
Tim Peters400cbc32006-02-28 18:44:41 +0000233]
234
235# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
236# excepthandler, arguments, keywords, alias
237
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000238class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000239
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500240 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000241 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000242 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000243 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000244 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200245 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000246 parent_pos = (ast_node.lineno, ast_node.col_offset)
247 for name in ast_node._fields:
248 value = getattr(ast_node, name)
249 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200250 first_pos = parent_pos
251 if value and name == 'decorator_list':
252 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000253 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200254 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000255 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500256 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000257
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500258 def test_AST_objects(self):
259 x = ast.AST()
260 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700261 x.foobar = 42
262 self.assertEqual(x.foobar, 42)
263 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500264
265 with self.assertRaises(AttributeError):
266 x.vararg
267
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500268 with self.assertRaises(TypeError):
269 # "_ast.AST constructor takes 0 positional arguments"
270 ast.AST(2)
271
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700272 def test_AST_garbage_collection(self):
273 class X:
274 pass
275 a = ast.AST()
276 a.x = X()
277 a.x.a = a
278 ref = weakref.ref(a.x)
279 del a
280 support.gc_collect()
281 self.assertIsNone(ref())
282
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000283 def test_snippets(self):
284 for input, output, kind in ((exec_tests, exec_results, "exec"),
285 (single_tests, single_results, "single"),
286 (eval_tests, eval_results, "eval")):
287 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400288 with self.subTest(action="parsing", input=i):
289 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
290 self.assertEqual(to_tuple(ast_tree), o)
291 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100292 with self.subTest(action="compiling", input=i, kind=kind):
293 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000294
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000295 def test_ast_validation(self):
296 # compile() is the only function that calls PyAST_Validate
297 snippets_to_validate = exec_tests + single_tests + eval_tests
298 for snippet in snippets_to_validate:
299 tree = ast.parse(snippet)
300 compile(tree, '<string>', 'exec')
301
Benjamin Peterson78565b22009-06-28 19:19:51 +0000302 def test_slice(self):
303 slc = ast.parse("x[::]").body[0].value.slice
304 self.assertIsNone(slc.upper)
305 self.assertIsNone(slc.lower)
306 self.assertIsNone(slc.step)
307
308 def test_from_import(self):
309 im = ast.parse("from . import y").body[0]
310 self.assertIsNone(im.module)
311
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400312 def test_non_interned_future_from_ast(self):
313 mod = ast.parse("from __future__ import division")
314 self.assertIsInstance(mod.body[0], ast.ImportFrom)
315 mod.body[0].module = " __future__ ".strip()
316 compile(mod, "<test>", "exec")
317
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000318 def test_base_classes(self):
319 self.assertTrue(issubclass(ast.For, ast.stmt))
320 self.assertTrue(issubclass(ast.Name, ast.expr))
321 self.assertTrue(issubclass(ast.stmt, ast.AST))
322 self.assertTrue(issubclass(ast.expr, ast.AST))
323 self.assertTrue(issubclass(ast.comprehension, ast.AST))
324 self.assertTrue(issubclass(ast.Gt, ast.AST))
325
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500326 def test_field_attr_existence(self):
327 for name, item in ast.__dict__.items():
328 if isinstance(item, type) and name != 'AST' and name[0].isupper():
329 x = item()
330 if isinstance(x, ast.AST):
331 self.assertEqual(type(x._fields), tuple)
332
333 def test_arguments(self):
334 x = ast.arguments()
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200335 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
336 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500337
338 with self.assertRaises(AttributeError):
339 x.vararg
340
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100341 x = ast.arguments(*range(1, 8))
342 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500343
344 def test_field_attr_writable(self):
345 x = ast.Num()
346 # We can assign to _fields
347 x._fields = 666
348 self.assertEqual(x._fields, 666)
349
350 def test_classattrs(self):
351 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700352 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300353
354 with self.assertRaises(AttributeError):
355 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500356
357 with self.assertRaises(AttributeError):
358 x.n
359
360 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300361 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500362 self.assertEqual(x.n, 42)
363
364 with self.assertRaises(AttributeError):
365 x.lineno
366
367 with self.assertRaises(AttributeError):
368 x.foobar
369
370 x = ast.Num(lineno=2)
371 self.assertEqual(x.lineno, 2)
372
373 x = ast.Num(42, lineno=0)
374 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700375 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300376 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500377 self.assertEqual(x.n, 42)
378
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700379 self.assertRaises(TypeError, ast.Num, 1, None, 2)
380 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500381
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300382 self.assertEqual(ast.Num(42).n, 42)
383 self.assertEqual(ast.Num(4.25).n, 4.25)
384 self.assertEqual(ast.Num(4.25j).n, 4.25j)
385 self.assertEqual(ast.Str('42').s, '42')
386 self.assertEqual(ast.Bytes(b'42').s, b'42')
387 self.assertIs(ast.NameConstant(True).value, True)
388 self.assertIs(ast.NameConstant(False).value, False)
389 self.assertIs(ast.NameConstant(None).value, None)
390
391 self.assertEqual(ast.Constant(42).value, 42)
392 self.assertEqual(ast.Constant(4.25).value, 4.25)
393 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
394 self.assertEqual(ast.Constant('42').value, '42')
395 self.assertEqual(ast.Constant(b'42').value, b'42')
396 self.assertIs(ast.Constant(True).value, True)
397 self.assertIs(ast.Constant(False).value, False)
398 self.assertIs(ast.Constant(None).value, None)
399 self.assertIs(ast.Constant(...).value, ...)
400
401 def test_realtype(self):
402 self.assertEqual(type(ast.Num(42)), ast.Constant)
403 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
404 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
405 self.assertEqual(type(ast.Str('42')), ast.Constant)
406 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
407 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
408 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
409 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
410 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
411
412 def test_isinstance(self):
413 self.assertTrue(isinstance(ast.Num(42), ast.Num))
414 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
415 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
416 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
417 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
418 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
419 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
420 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
421 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
422
423 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
424 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
425 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
426 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
427 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
428 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
429 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
430 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
431 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
432
433 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
434 self.assertFalse(isinstance(ast.Num(42), ast.Str))
435 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
436 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
437 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800438 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
439 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300440
441 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
442 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
443 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
444 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
445 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800446 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
447 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300448
449 self.assertFalse(isinstance(ast.Constant(), ast.Num))
450 self.assertFalse(isinstance(ast.Constant(), ast.Str))
451 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
452 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
453 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
454
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200455 class S(str): pass
456 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
457 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
458
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300459 def test_subclasses(self):
460 class N(ast.Num):
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 self.z = 'spam'
464 class N2(ast.Num):
465 pass
466
467 n = N(42)
468 self.assertEqual(n.n, 42)
469 self.assertEqual(n.z, 'spam')
470 self.assertEqual(type(n), N)
471 self.assertTrue(isinstance(n, N))
472 self.assertTrue(isinstance(n, ast.Num))
473 self.assertFalse(isinstance(n, N2))
474 self.assertFalse(isinstance(ast.Num(42), N))
475 n = N(n=42)
476 self.assertEqual(n.n, 42)
477 self.assertEqual(type(n), N)
478
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500479 def test_module(self):
480 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800481 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500482 self.assertEqual(x.body, body)
483
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000484 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100485 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500486 x = ast.BinOp()
487 self.assertEqual(x._fields, ('left', 'op', 'right'))
488
489 # Random attribute allowed too
490 x.foobarbaz = 5
491 self.assertEqual(x.foobarbaz, 5)
492
493 n1 = ast.Num(1)
494 n3 = ast.Num(3)
495 addop = ast.Add()
496 x = ast.BinOp(n1, addop, n3)
497 self.assertEqual(x.left, n1)
498 self.assertEqual(x.op, addop)
499 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500500
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500501 x = ast.BinOp(1, 2, 3)
502 self.assertEqual(x.left, 1)
503 self.assertEqual(x.op, 2)
504 self.assertEqual(x.right, 3)
505
Georg Brandl0c77a822008-06-10 16:37:50 +0000506 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000507 self.assertEqual(x.left, 1)
508 self.assertEqual(x.op, 2)
509 self.assertEqual(x.right, 3)
510 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000511
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500512 # node raises exception when given too many arguments
513 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500514 # node raises exception when given too many arguments
515 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000516
517 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000518 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000519 self.assertEqual(x.left, 1)
520 self.assertEqual(x.op, 2)
521 self.assertEqual(x.right, 3)
522 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000523
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500524 # Random kwargs also allowed
525 x = ast.BinOp(1, 2, 3, foobarbaz=42)
526 self.assertEqual(x.foobarbaz, 42)
527
528 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000529 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000530 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500531 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000532
533 def test_pickling(self):
534 import pickle
535 mods = [pickle]
536 try:
537 import cPickle
538 mods.append(cPickle)
539 except ImportError:
540 pass
541 protocols = [0, 1, 2]
542 for mod in mods:
543 for protocol in protocols:
544 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
545 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000547
Benjamin Peterson5b066812010-11-20 01:38:49 +0000548 def test_invalid_sum(self):
549 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800550 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000551 with self.assertRaises(TypeError) as cm:
552 compile(m, "<test>", "exec")
553 self.assertIn("but got <_ast.expr", str(cm.exception))
554
Min ho Kimc4cacc82019-07-31 08:16:13 +1000555 def test_invalid_identifier(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800556 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500557 ast.fix_missing_locations(m)
558 with self.assertRaises(TypeError) as cm:
559 compile(m, "<test>", "exec")
560 self.assertIn("identifier must be of type str", str(cm.exception))
561
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000562 def test_empty_yield_from(self):
563 # Issue 16546: yield from value is not optional.
564 empty_yield_from = ast.parse("def f():\n yield from g()")
565 empty_yield_from.body[0].body[0].value.value = None
566 with self.assertRaises(ValueError) as cm:
567 compile(empty_yield_from, "<test>", "exec")
568 self.assertIn("field value is required", str(cm.exception))
569
Oren Milman7dc46d82017-09-30 20:16:24 +0300570 @support.cpython_only
571 def test_issue31592(self):
572 # There shouldn't be an assertion failure in case of a bad
573 # unicodedata.normalize().
574 import unicodedata
575 def bad_normalize(*args):
576 return None
577 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
578 self.assertRaises(TypeError, ast.parse, '\u03D5')
579
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200580 def test_issue18374_binop_col_offset(self):
581 tree = ast.parse('4+5+6+7')
582 parent_binop = tree.body[0].value
583 child_binop = parent_binop.left
584 grandchild_binop = child_binop.left
585 self.assertEqual(parent_binop.col_offset, 0)
586 self.assertEqual(parent_binop.end_col_offset, 7)
587 self.assertEqual(child_binop.col_offset, 0)
588 self.assertEqual(child_binop.end_col_offset, 5)
589 self.assertEqual(grandchild_binop.col_offset, 0)
590 self.assertEqual(grandchild_binop.end_col_offset, 3)
591
592 tree = ast.parse('4+5-\\\n 6-7')
593 parent_binop = tree.body[0].value
594 child_binop = parent_binop.left
595 grandchild_binop = child_binop.left
596 self.assertEqual(parent_binop.col_offset, 0)
597 self.assertEqual(parent_binop.lineno, 1)
598 self.assertEqual(parent_binop.end_col_offset, 4)
599 self.assertEqual(parent_binop.end_lineno, 2)
600
601 self.assertEqual(child_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200602 self.assertEqual(child_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200603 self.assertEqual(child_binop.end_col_offset, 2)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200604 self.assertEqual(child_binop.end_lineno, 2)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200605
606 self.assertEqual(grandchild_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200607 self.assertEqual(grandchild_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200608 self.assertEqual(grandchild_binop.end_col_offset, 3)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200609 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000610
611class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700612 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000613
614 def test_parse(self):
615 a = ast.parse('foo(1 + 1)')
616 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
617 self.assertEqual(ast.dump(a), ast.dump(b))
618
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400619 def test_parse_in_error(self):
620 try:
621 1/0
622 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400623 with self.assertRaises(SyntaxError) as e:
624 ast.literal_eval(r"'\U'")
625 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400626
Georg Brandl0c77a822008-06-10 16:37:50 +0000627 def test_dump(self):
628 node = ast.parse('spam(eggs, "and cheese")')
629 self.assertEqual(ast.dump(node),
630 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700631 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800632 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000633 )
634 self.assertEqual(ast.dump(node, annotate_fields=False),
635 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700636 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000637 )
638 self.assertEqual(ast.dump(node, include_attributes=True),
639 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000640 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
641 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700642 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000643 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
644 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800645 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000646 )
647
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300648 def test_dump_indent(self):
649 node = ast.parse('spam(eggs, "and cheese")')
650 self.assertEqual(ast.dump(node, indent=3), """\
651Module(
652 body=[
653 Expr(
654 value=Call(
655 func=Name(id='spam', ctx=Load()),
656 args=[
657 Name(id='eggs', ctx=Load()),
658 Constant(value='and cheese', kind=None)],
659 keywords=[]))],
660 type_ignores=[])""")
661 self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
662Module(
663\t[
664\t\tExpr(
665\t\t\tCall(
666\t\t\t\tName('spam', Load()),
667\t\t\t\t[
668\t\t\t\t\tName('eggs', Load()),
669\t\t\t\t\tConstant('and cheese', None)],
670\t\t\t\t[]))],
671\t[])""")
672 self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
673Module(
674 body=[
675 Expr(
676 value=Call(
677 func=Name(
678 id='spam',
679 ctx=Load(),
680 lineno=1,
681 col_offset=0,
682 end_lineno=1,
683 end_col_offset=4),
684 args=[
685 Name(
686 id='eggs',
687 ctx=Load(),
688 lineno=1,
689 col_offset=5,
690 end_lineno=1,
691 end_col_offset=9),
692 Constant(
693 value='and cheese',
694 kind=None,
695 lineno=1,
696 col_offset=11,
697 end_lineno=1,
698 end_col_offset=23)],
699 keywords=[],
700 lineno=1,
701 col_offset=0,
702 end_lineno=1,
703 end_col_offset=24),
704 lineno=1,
705 col_offset=0,
706 end_lineno=1,
707 end_col_offset=24)],
708 type_ignores=[])""")
709
Serhiy Storchakae64f9482019-08-29 09:30:23 +0300710 def test_dump_incomplete(self):
711 node = ast.Raise(lineno=3, col_offset=4)
712 self.assertEqual(ast.dump(node),
713 "Raise()"
714 )
715 self.assertEqual(ast.dump(node, include_attributes=True),
716 "Raise(lineno=3, col_offset=4)"
717 )
718 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
719 self.assertEqual(ast.dump(node),
720 "Raise(exc=Name(id='e', ctx=Load()))"
721 )
722 self.assertEqual(ast.dump(node, annotate_fields=False),
723 "Raise(Name('e', Load()))"
724 )
725 self.assertEqual(ast.dump(node, include_attributes=True),
726 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
727 )
728 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
729 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
730 )
731 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
732 self.assertEqual(ast.dump(node),
733 "Raise(cause=Name(id='e', ctx=Load()))"
734 )
735 self.assertEqual(ast.dump(node, annotate_fields=False),
736 "Raise(cause=Name('e', Load()))"
737 )
738
Georg Brandl0c77a822008-06-10 16:37:50 +0000739 def test_copy_location(self):
740 src = ast.parse('1 + 1', mode='eval')
741 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
742 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700743 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000744 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
745 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
746 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000747 )
748
749 def test_fix_missing_locations(self):
750 src = ast.parse('write("spam")')
751 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400752 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000753 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000754 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000755 self.assertEqual(ast.dump(src, include_attributes=True),
756 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000757 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700758 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000759 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
760 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
761 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
762 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
763 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
764 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800765 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
766 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000767 )
768
769 def test_increment_lineno(self):
770 src = ast.parse('1 + 1', mode='eval')
771 self.assertEqual(ast.increment_lineno(src, n=3), src)
772 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700773 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
774 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000775 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
776 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000777 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000778 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000779 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000780 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
781 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700782 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
783 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000784 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
785 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000786 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000787
788 def test_iter_fields(self):
789 node = ast.parse('foo()', mode='eval')
790 d = dict(ast.iter_fields(node.body))
791 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400792 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000793
794 def test_iter_child_nodes(self):
795 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
796 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
797 iterator = ast.iter_child_nodes(node.body)
798 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300799 self.assertEqual(next(iterator).value, 23)
800 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000801 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700802 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000803 )
804
805 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300806 node = ast.parse('"""line one\n line two"""')
807 self.assertEqual(ast.get_docstring(node),
808 'line one\nline two')
809
810 node = ast.parse('class foo:\n """line one\n line two"""')
811 self.assertEqual(ast.get_docstring(node.body[0]),
812 'line one\nline two')
813
Georg Brandl0c77a822008-06-10 16:37:50 +0000814 node = ast.parse('def foo():\n """line one\n line two"""')
815 self.assertEqual(ast.get_docstring(node.body[0]),
816 'line one\nline two')
817
Yury Selivanov2f07a662015-07-23 08:54:35 +0300818 node = ast.parse('async def foo():\n """spam\n ham"""')
819 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300820
821 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800822 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300823 node = ast.parse('x = "not docstring"')
824 self.assertIsNone(ast.get_docstring(node))
825 node = ast.parse('def foo():\n pass')
826 self.assertIsNone(ast.get_docstring(node))
827
828 node = ast.parse('class foo:\n pass')
829 self.assertIsNone(ast.get_docstring(node.body[0]))
830 node = ast.parse('class foo:\n x = "not docstring"')
831 self.assertIsNone(ast.get_docstring(node.body[0]))
832 node = ast.parse('class foo:\n def bar(self): pass')
833 self.assertIsNone(ast.get_docstring(node.body[0]))
834
835 node = ast.parse('def foo():\n pass')
836 self.assertIsNone(ast.get_docstring(node.body[0]))
837 node = ast.parse('def foo():\n x = "not docstring"')
838 self.assertIsNone(ast.get_docstring(node.body[0]))
839
840 node = ast.parse('async def foo():\n pass')
841 self.assertIsNone(ast.get_docstring(node.body[0]))
842 node = ast.parse('async def foo():\n x = "not docstring"')
843 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300844
Anthony Sottile995d9b92019-01-12 20:05:13 -0800845 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
846 node = ast.parse(
847 '"""line one\nline two"""\n\n'
848 'def foo():\n """line one\n line two"""\n\n'
849 ' def bar():\n """line one\n line two"""\n'
850 ' """line one\n line two"""\n'
851 '"""line one\nline two"""\n\n'
852 )
853 self.assertEqual(node.body[0].col_offset, 0)
854 self.assertEqual(node.body[0].lineno, 1)
855 self.assertEqual(node.body[1].body[0].col_offset, 2)
856 self.assertEqual(node.body[1].body[0].lineno, 5)
857 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
858 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
859 self.assertEqual(node.body[1].body[2].col_offset, 2)
860 self.assertEqual(node.body[1].body[2].lineno, 11)
861 self.assertEqual(node.body[2].col_offset, 0)
862 self.assertEqual(node.body[2].lineno, 13)
863
Georg Brandl0c77a822008-06-10 16:37:50 +0000864 def test_literal_eval(self):
865 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
866 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
867 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000868 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000869 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000870 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200871 self.assertEqual(ast.literal_eval('6'), 6)
872 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000873 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000874 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200875 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
876 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
877 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
878 self.assertRaises(ValueError, ast.literal_eval, '++6')
879 self.assertRaises(ValueError, ast.literal_eval, '+True')
880 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000881
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200882 def test_literal_eval_complex(self):
883 # Issue #4907
884 self.assertEqual(ast.literal_eval('6j'), 6j)
885 self.assertEqual(ast.literal_eval('-6j'), -6j)
886 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
887 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
888 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
889 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
890 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
891 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
892 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
893 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
894 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
895 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
896 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
897 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
898 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
899 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
900 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
901 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000902
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100903 def test_bad_integer(self):
904 # issue13436: Bad error message with invalid numeric values
905 body = [ast.ImportFrom(module='time',
906 names=[ast.alias(name='sleep')],
907 level=None,
908 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800909 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100910 with self.assertRaises(ValueError) as cm:
911 compile(mod, 'test', 'exec')
912 self.assertIn("invalid integer value: None", str(cm.exception))
913
Berker Peksag0a5bd512016-04-29 19:50:02 +0300914 def test_level_as_none(self):
915 body = [ast.ImportFrom(module='time',
916 names=[ast.alias(name='sleep')],
917 level=None,
918 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800919 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300920 code = compile(mod, 'test', 'exec')
921 ns = {}
922 exec(code, ns)
923 self.assertIn('sleep', ns)
924
Georg Brandl0c77a822008-06-10 16:37:50 +0000925
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500926class ASTValidatorTests(unittest.TestCase):
927
928 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
929 mod.lineno = mod.col_offset = 0
930 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300931 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500932 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300933 else:
934 with self.assertRaises(exc) as cm:
935 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500936 self.assertIn(msg, str(cm.exception))
937
938 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800939 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500940 self.mod(mod, msg, exc=exc)
941
942 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800943 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500944 self.mod(mod, msg)
945
946 def test_module(self):
947 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
948 self.mod(m, "must have Load context", "single")
949 m = ast.Expression(ast.Name("x", ast.Store()))
950 self.mod(m, "must have Load context", "eval")
951
952 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100953 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700954 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500955 defaults=None, kw_defaults=None):
956 if args is None:
957 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100958 if posonlyargs is None:
959 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500960 if kwonlyargs is None:
961 kwonlyargs = []
962 if defaults is None:
963 defaults = []
964 if kw_defaults is None:
965 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100966 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
967 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500968 return fac(args)
969 args = [ast.arg("x", ast.Name("x", ast.Store()))]
970 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100971 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500972 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500973 check(arguments(defaults=[ast.Num(3)]),
974 "more positional defaults than args")
975 check(arguments(kw_defaults=[ast.Num(4)]),
976 "length of kwonlyargs is not the same as kw_defaults")
977 args = [ast.arg("x", ast.Name("x", ast.Load()))]
978 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
979 "must have Load context")
980 args = [ast.arg("a", ast.Name("x", ast.Load())),
981 ast.arg("b", ast.Name("y", ast.Load()))]
982 check(arguments(kwonlyargs=args,
983 kw_defaults=[None, ast.Name("x", ast.Store())]),
984 "must have Load context")
985
986 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100987 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300988 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500989 self.stmt(f, "empty body on FunctionDef")
990 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300991 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500992 self.stmt(f, "must have Load context")
993 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300994 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500995 self.stmt(f, "must have Load context")
996 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300997 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500998 self._check_arguments(fac, self.stmt)
999
1000 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001001 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001002 if bases is None:
1003 bases = []
1004 if keywords is None:
1005 keywords = []
1006 if body is None:
1007 body = [ast.Pass()]
1008 if decorator_list is None:
1009 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001010 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001011 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001012 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1013 "must have Load context")
1014 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1015 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001016 self.stmt(cls(body=[]), "empty body on ClassDef")
1017 self.stmt(cls(body=[None]), "None disallowed")
1018 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1019 "must have Load context")
1020
1021 def test_delete(self):
1022 self.stmt(ast.Delete([]), "empty targets on Delete")
1023 self.stmt(ast.Delete([None]), "None disallowed")
1024 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1025 "must have Del context")
1026
1027 def test_assign(self):
1028 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1029 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1030 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1031 "must have Store context")
1032 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1033 ast.Name("y", ast.Store())),
1034 "must have Load context")
1035
1036 def test_augassign(self):
1037 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1038 ast.Name("y", ast.Load()))
1039 self.stmt(aug, "must have Store context")
1040 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1041 ast.Name("y", ast.Store()))
1042 self.stmt(aug, "must have Load context")
1043
1044 def test_for(self):
1045 x = ast.Name("x", ast.Store())
1046 y = ast.Name("y", ast.Load())
1047 p = ast.Pass()
1048 self.stmt(ast.For(x, y, [], []), "empty body on For")
1049 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1050 "must have Store context")
1051 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1052 "must have Load context")
1053 e = ast.Expr(ast.Name("x", ast.Store()))
1054 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1055 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1056
1057 def test_while(self):
1058 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1059 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1060 "must have Load context")
1061 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1062 [ast.Expr(ast.Name("x", ast.Store()))]),
1063 "must have Load context")
1064
1065 def test_if(self):
1066 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1067 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1068 self.stmt(i, "must have Load context")
1069 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1070 self.stmt(i, "must have Load context")
1071 i = ast.If(ast.Num(3), [ast.Pass()],
1072 [ast.Expr(ast.Name("x", ast.Store()))])
1073 self.stmt(i, "must have Load context")
1074
1075 def test_with(self):
1076 p = ast.Pass()
1077 self.stmt(ast.With([], [p]), "empty items on With")
1078 i = ast.withitem(ast.Num(3), None)
1079 self.stmt(ast.With([i], []), "empty body on With")
1080 i = ast.withitem(ast.Name("x", ast.Store()), None)
1081 self.stmt(ast.With([i], [p]), "must have Load context")
1082 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1083 self.stmt(ast.With([i], [p]), "must have Store context")
1084
1085 def test_raise(self):
1086 r = ast.Raise(None, ast.Num(3))
1087 self.stmt(r, "Raise with cause but no exception")
1088 r = ast.Raise(ast.Name("x", ast.Store()), None)
1089 self.stmt(r, "must have Load context")
1090 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1091 self.stmt(r, "must have Load context")
1092
1093 def test_try(self):
1094 p = ast.Pass()
1095 t = ast.Try([], [], [], [p])
1096 self.stmt(t, "empty body on Try")
1097 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1098 self.stmt(t, "must have Load context")
1099 t = ast.Try([p], [], [], [])
1100 self.stmt(t, "Try has neither except handlers nor finalbody")
1101 t = ast.Try([p], [], [p], [p])
1102 self.stmt(t, "Try has orelse but no except handlers")
1103 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1104 self.stmt(t, "empty body on ExceptHandler")
1105 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1106 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1107 e = [ast.ExceptHandler(None, "x", [p])]
1108 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1109 self.stmt(t, "must have Load context")
1110 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1111 self.stmt(t, "must have Load context")
1112
1113 def test_assert(self):
1114 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1115 "must have Load context")
1116 assrt = ast.Assert(ast.Name("x", ast.Load()),
1117 ast.Name("y", ast.Store()))
1118 self.stmt(assrt, "must have Load context")
1119
1120 def test_import(self):
1121 self.stmt(ast.Import([]), "empty names on Import")
1122
1123 def test_importfrom(self):
1124 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001125 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001126 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1127
1128 def test_global(self):
1129 self.stmt(ast.Global([]), "empty names on Global")
1130
1131 def test_nonlocal(self):
1132 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1133
1134 def test_expr(self):
1135 e = ast.Expr(ast.Name("x", ast.Store()))
1136 self.stmt(e, "must have Load context")
1137
1138 def test_boolop(self):
1139 b = ast.BoolOp(ast.And(), [])
1140 self.expr(b, "less than 2 values")
1141 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1142 self.expr(b, "less than 2 values")
1143 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1144 self.expr(b, "None disallowed")
1145 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1146 self.expr(b, "must have Load context")
1147
1148 def test_unaryop(self):
1149 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1150 self.expr(u, "must have Load context")
1151
1152 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001153 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001154 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1155 "must have Load context")
1156 def fac(args):
1157 return ast.Lambda(args, ast.Name("x", ast.Load()))
1158 self._check_arguments(fac, self.expr)
1159
1160 def test_ifexp(self):
1161 l = ast.Name("x", ast.Load())
1162 s = ast.Name("y", ast.Store())
1163 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001164 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001165
1166 def test_dict(self):
1167 d = ast.Dict([], [ast.Name("x", ast.Load())])
1168 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001169 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1170 self.expr(d, "None disallowed")
1171
1172 def test_set(self):
1173 self.expr(ast.Set([None]), "None disallowed")
1174 s = ast.Set([ast.Name("x", ast.Store())])
1175 self.expr(s, "must have Load context")
1176
1177 def _check_comprehension(self, fac):
1178 self.expr(fac([]), "comprehension with no generators")
1179 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001180 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001181 self.expr(fac([g]), "must have Store context")
1182 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001183 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001184 self.expr(fac([g]), "must have Load context")
1185 x = ast.Name("x", ast.Store())
1186 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001187 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001188 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001189 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001190 self.expr(fac([g]), "must have Load context")
1191
1192 def _simple_comp(self, fac):
1193 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001194 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001195 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1196 "must have Load context")
1197 def wrap(gens):
1198 return fac(ast.Name("x", ast.Store()), gens)
1199 self._check_comprehension(wrap)
1200
1201 def test_listcomp(self):
1202 self._simple_comp(ast.ListComp)
1203
1204 def test_setcomp(self):
1205 self._simple_comp(ast.SetComp)
1206
1207 def test_generatorexp(self):
1208 self._simple_comp(ast.GeneratorExp)
1209
1210 def test_dictcomp(self):
1211 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001212 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001213 c = ast.DictComp(ast.Name("x", ast.Store()),
1214 ast.Name("y", ast.Load()), [g])
1215 self.expr(c, "must have Load context")
1216 c = ast.DictComp(ast.Name("x", ast.Load()),
1217 ast.Name("y", ast.Store()), [g])
1218 self.expr(c, "must have Load context")
1219 def factory(comps):
1220 k = ast.Name("x", ast.Load())
1221 v = ast.Name("y", ast.Load())
1222 return ast.DictComp(k, v, comps)
1223 self._check_comprehension(factory)
1224
1225 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001226 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1227 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001228
1229 def test_compare(self):
1230 left = ast.Name("x", ast.Load())
1231 comp = ast.Compare(left, [ast.In()], [])
1232 self.expr(comp, "no comparators")
1233 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1234 self.expr(comp, "different number of comparators and operands")
1235 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001236 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001237 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001238 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001239
1240 def test_call(self):
1241 func = ast.Name("x", ast.Load())
1242 args = [ast.Name("y", ast.Load())]
1243 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001244 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001245 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001246 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001247 self.expr(call, "None disallowed")
1248 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001249 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001250 self.expr(call, "must have Load context")
1251
1252 def test_num(self):
1253 class subint(int):
1254 pass
1255 class subfloat(float):
1256 pass
1257 class subcomplex(complex):
1258 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001259 for obj in "0", "hello":
1260 self.expr(ast.Num(obj))
1261 for obj in subint(), subfloat(), subcomplex():
1262 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001263
1264 def test_attribute(self):
1265 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1266 self.expr(attr, "must have Load context")
1267
1268 def test_subscript(self):
1269 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1270 ast.Load())
1271 self.expr(sub, "must have Load context")
1272 x = ast.Name("x", ast.Load())
1273 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1274 ast.Load())
1275 self.expr(sub, "must have Load context")
1276 s = ast.Name("x", ast.Store())
1277 for args in (s, None, None), (None, s, None), (None, None, s):
1278 sl = ast.Slice(*args)
1279 self.expr(ast.Subscript(x, sl, ast.Load()),
1280 "must have Load context")
1281 sl = ast.ExtSlice([])
1282 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1283 sl = ast.ExtSlice([ast.Index(s)])
1284 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1285
1286 def test_starred(self):
1287 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1288 ast.Store())
1289 assign = ast.Assign([left], ast.Num(4))
1290 self.stmt(assign, "must have Store context")
1291
1292 def _sequence(self, fac):
1293 self.expr(fac([None], ast.Load()), "None disallowed")
1294 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1295 "must have Load context")
1296
1297 def test_list(self):
1298 self._sequence(ast.List)
1299
1300 def test_tuple(self):
1301 self._sequence(ast.Tuple)
1302
Benjamin Peterson442f2092012-12-06 17:41:04 -05001303 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001304 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001305
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001306 def test_stdlib_validates(self):
1307 stdlib = os.path.dirname(ast.__file__)
1308 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1309 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1310 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001311 with self.subTest(module):
1312 fn = os.path.join(stdlib, module)
1313 with open(fn, "r", encoding="utf-8") as fp:
1314 source = fp.read()
1315 mod = ast.parse(source, fn)
1316 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001317
1318
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001319class ConstantTests(unittest.TestCase):
1320 """Tests on the ast.Constant node type."""
1321
1322 def compile_constant(self, value):
1323 tree = ast.parse("x = 123")
1324
1325 node = tree.body[0].value
1326 new_node = ast.Constant(value=value)
1327 ast.copy_location(new_node, node)
1328 tree.body[0].value = new_node
1329
1330 code = compile(tree, "<string>", "exec")
1331
1332 ns = {}
1333 exec(code, ns)
1334 return ns['x']
1335
Victor Stinnerbe59d142016-01-27 00:39:12 +01001336 def test_validation(self):
1337 with self.assertRaises(TypeError) as cm:
1338 self.compile_constant([1, 2, 3])
1339 self.assertEqual(str(cm.exception),
1340 "got an invalid type in Constant: list")
1341
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001342 def test_singletons(self):
1343 for const in (None, False, True, Ellipsis, b'', frozenset()):
1344 with self.subTest(const=const):
1345 value = self.compile_constant(const)
1346 self.assertIs(value, const)
1347
1348 def test_values(self):
1349 nested_tuple = (1,)
1350 nested_frozenset = frozenset({1})
1351 for level in range(3):
1352 nested_tuple = (nested_tuple, 2)
1353 nested_frozenset = frozenset({nested_frozenset, 2})
1354 values = (123, 123.0, 123j,
1355 "unicode", b'bytes',
1356 tuple("tuple"), frozenset("frozenset"),
1357 nested_tuple, nested_frozenset)
1358 for value in values:
1359 with self.subTest(value=value):
1360 result = self.compile_constant(value)
1361 self.assertEqual(result, value)
1362
1363 def test_assign_to_constant(self):
1364 tree = ast.parse("x = 1")
1365
1366 target = tree.body[0].targets[0]
1367 new_target = ast.Constant(value=1)
1368 ast.copy_location(new_target, target)
1369 tree.body[0].targets[0] = new_target
1370
1371 with self.assertRaises(ValueError) as cm:
1372 compile(tree, "string", "exec")
1373 self.assertEqual(str(cm.exception),
1374 "expression which can't be assigned "
1375 "to in Store context")
1376
1377 def test_get_docstring(self):
1378 tree = ast.parse("'docstring'\nx = 1")
1379 self.assertEqual(ast.get_docstring(tree), 'docstring')
1380
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001381 def get_load_const(self, tree):
1382 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1383 # instructions
1384 co = compile(tree, '<string>', 'exec')
1385 consts = []
1386 for instr in dis.get_instructions(co):
1387 if instr.opname == 'LOAD_CONST':
1388 consts.append(instr.argval)
1389 return consts
1390
1391 @support.cpython_only
1392 def test_load_const(self):
1393 consts = [None,
1394 True, False,
1395 124,
1396 2.0,
1397 3j,
1398 "unicode",
1399 b'bytes',
1400 (1, 2, 3)]
1401
Victor Stinnera2724092016-02-08 18:17:58 +01001402 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1403 code += '\nx = ...'
1404 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001405
1406 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001407 self.assertEqual(self.get_load_const(tree),
1408 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001409
1410 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001411 for assign, const in zip(tree.body, consts):
1412 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001413 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001414 ast.copy_location(new_node, assign.value)
1415 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001416
Victor Stinnera2724092016-02-08 18:17:58 +01001417 self.assertEqual(self.get_load_const(tree),
1418 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001419
1420 def test_literal_eval(self):
1421 tree = ast.parse("1 + 2")
1422 binop = tree.body[0].value
1423
1424 new_left = ast.Constant(value=10)
1425 ast.copy_location(new_left, binop.left)
1426 binop.left = new_left
1427
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001428 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001429 ast.copy_location(new_right, binop.right)
1430 binop.right = new_right
1431
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001432 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001433
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001434 def test_string_kind(self):
1435 c = ast.parse('"x"', mode='eval').body
1436 self.assertEqual(c.value, "x")
1437 self.assertEqual(c.kind, None)
1438
1439 c = ast.parse('u"x"', mode='eval').body
1440 self.assertEqual(c.value, "x")
1441 self.assertEqual(c.kind, "u")
1442
1443 c = ast.parse('r"x"', mode='eval').body
1444 self.assertEqual(c.value, "x")
1445 self.assertEqual(c.kind, None)
1446
1447 c = ast.parse('b"x"', mode='eval').body
1448 self.assertEqual(c.value, b"x")
1449 self.assertEqual(c.kind, None)
1450
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001451
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001452class EndPositionTests(unittest.TestCase):
1453 """Tests for end position of AST nodes.
1454
1455 Testing end positions of nodes requires a bit of extra care
1456 because of how LL parsers work.
1457 """
1458 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1459 self.assertEqual(ast_node.end_lineno, end_lineno)
1460 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1461
1462 def _check_content(self, source, ast_node, content):
1463 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1464
1465 def _parse_value(self, s):
1466 # Use duck-typing to support both single expression
1467 # and a right hand side of an assignment statement.
1468 return ast.parse(s).body[0].value
1469
1470 def test_lambda(self):
1471 s = 'lambda x, *y: None'
1472 lam = self._parse_value(s)
1473 self._check_content(s, lam.body, 'None')
1474 self._check_content(s, lam.args.args[0], 'x')
1475 self._check_content(s, lam.args.vararg, 'y')
1476
1477 def test_func_def(self):
1478 s = dedent('''
1479 def func(x: int,
1480 *args: str,
1481 z: float = 0,
1482 **kwargs: Any) -> bool:
1483 return True
1484 ''').strip()
1485 fdef = ast.parse(s).body[0]
1486 self._check_end_pos(fdef, 5, 15)
1487 self._check_content(s, fdef.body[0], 'return True')
1488 self._check_content(s, fdef.args.args[0], 'x: int')
1489 self._check_content(s, fdef.args.args[0].annotation, 'int')
1490 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1491 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1492
1493 def test_call(self):
1494 s = 'func(x, y=2, **kw)'
1495 call = self._parse_value(s)
1496 self._check_content(s, call.func, 'func')
1497 self._check_content(s, call.keywords[0].value, '2')
1498 self._check_content(s, call.keywords[1].value, 'kw')
1499
1500 def test_call_noargs(self):
1501 s = 'x[0]()'
1502 call = self._parse_value(s)
1503 self._check_content(s, call.func, 'x[0]')
1504 self._check_end_pos(call, 1, 6)
1505
1506 def test_class_def(self):
1507 s = dedent('''
1508 class C(A, B):
1509 x: int = 0
1510 ''').strip()
1511 cdef = ast.parse(s).body[0]
1512 self._check_end_pos(cdef, 2, 14)
1513 self._check_content(s, cdef.bases[1], 'B')
1514 self._check_content(s, cdef.body[0], 'x: int = 0')
1515
1516 def test_class_kw(self):
1517 s = 'class S(metaclass=abc.ABCMeta): pass'
1518 cdef = ast.parse(s).body[0]
1519 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1520
1521 def test_multi_line_str(self):
1522 s = dedent('''
1523 x = """Some multi-line text.
1524
1525 It goes on starting from same indent."""
1526 ''').strip()
1527 assign = ast.parse(s).body[0]
1528 self._check_end_pos(assign, 3, 40)
1529 self._check_end_pos(assign.value, 3, 40)
1530
1531 def test_continued_str(self):
1532 s = dedent('''
1533 x = "first part" \\
1534 "second part"
1535 ''').strip()
1536 assign = ast.parse(s).body[0]
1537 self._check_end_pos(assign, 2, 13)
1538 self._check_end_pos(assign.value, 2, 13)
1539
1540 def test_suites(self):
1541 # We intentionally put these into the same string to check
1542 # that empty lines are not part of the suite.
1543 s = dedent('''
1544 while True:
1545 pass
1546
1547 if one():
1548 x = None
1549 elif other():
1550 y = None
1551 else:
1552 z = None
1553
1554 for x, y in stuff:
1555 assert True
1556
1557 try:
1558 raise RuntimeError
1559 except TypeError as e:
1560 pass
1561
1562 pass
1563 ''').strip()
1564 mod = ast.parse(s)
1565 while_loop = mod.body[0]
1566 if_stmt = mod.body[1]
1567 for_loop = mod.body[2]
1568 try_stmt = mod.body[3]
1569 pass_stmt = mod.body[4]
1570
1571 self._check_end_pos(while_loop, 2, 8)
1572 self._check_end_pos(if_stmt, 9, 12)
1573 self._check_end_pos(for_loop, 12, 15)
1574 self._check_end_pos(try_stmt, 17, 8)
1575 self._check_end_pos(pass_stmt, 19, 4)
1576
1577 self._check_content(s, while_loop.test, 'True')
1578 self._check_content(s, if_stmt.body[0], 'x = None')
1579 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1580 self._check_content(s, for_loop.target, 'x, y')
1581 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1582 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1583
1584 def test_fstring(self):
1585 s = 'x = f"abc {x + y} abc"'
1586 fstr = self._parse_value(s)
1587 binop = fstr.values[1].value
1588 self._check_content(s, binop, 'x + y')
1589
1590 def test_fstring_multi_line(self):
1591 s = dedent('''
1592 f"""Some multi-line text.
1593 {
1594 arg_one
1595 +
1596 arg_two
1597 }
1598 It goes on..."""
1599 ''').strip()
1600 fstr = self._parse_value(s)
1601 binop = fstr.values[1].value
1602 self._check_end_pos(binop, 5, 7)
1603 self._check_content(s, binop.left, 'arg_one')
1604 self._check_content(s, binop.right, 'arg_two')
1605
1606 def test_import_from_multi_line(self):
1607 s = dedent('''
1608 from x.y.z import (
1609 a, b, c as c
1610 )
1611 ''').strip()
1612 imp = ast.parse(s).body[0]
1613 self._check_end_pos(imp, 3, 1)
1614
1615 def test_slices(self):
1616 s1 = 'f()[1, 2] [0]'
1617 s2 = 'x[ a.b: c.d]'
1618 sm = dedent('''
1619 x[ a.b: f () ,
1620 g () : c.d
1621 ]
1622 ''').strip()
1623 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1624 self._check_content(s1, i1.value, 'f()[1, 2]')
1625 self._check_content(s1, i1.value.slice.value, '1, 2')
1626 self._check_content(s2, i2.slice.lower, 'a.b')
1627 self._check_content(s2, i2.slice.upper, 'c.d')
1628 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1629 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1630 self._check_end_pos(im, 3, 3)
1631
1632 def test_binop(self):
1633 s = dedent('''
1634 (1 * 2 + (3 ) +
1635 4
1636 )
1637 ''').strip()
1638 binop = self._parse_value(s)
1639 self._check_end_pos(binop, 2, 6)
1640 self._check_content(s, binop.right, '4')
1641 self._check_content(s, binop.left, '1 * 2 + (3 )')
1642 self._check_content(s, binop.left.right, '3')
1643
1644 def test_boolop(self):
1645 s = dedent('''
1646 if (one_condition and
1647 (other_condition or yet_another_one)):
1648 pass
1649 ''').strip()
1650 bop = ast.parse(s).body[0].test
1651 self._check_end_pos(bop, 2, 44)
1652 self._check_content(s, bop.values[1],
1653 'other_condition or yet_another_one')
1654
1655 def test_tuples(self):
1656 s1 = 'x = () ;'
1657 s2 = 'x = 1 , ;'
1658 s3 = 'x = (1 , 2 ) ;'
1659 sm = dedent('''
1660 x = (
1661 a, b,
1662 )
1663 ''').strip()
1664 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1665 self._check_content(s1, t1, '()')
1666 self._check_content(s2, t2, '1 ,')
1667 self._check_content(s3, t3, '(1 , 2 )')
1668 self._check_end_pos(tm, 3, 1)
1669
1670 def test_attribute_spaces(self):
1671 s = 'func(x. y .z)'
1672 call = self._parse_value(s)
1673 self._check_content(s, call, s)
1674 self._check_content(s, call.args[0], 'x. y .z')
1675
1676 def test_displays(self):
1677 s1 = '[{}, {1, }, {1, 2,} ]'
1678 s2 = '{a: b, f (): g () ,}'
1679 c1 = self._parse_value(s1)
1680 c2 = self._parse_value(s2)
1681 self._check_content(s1, c1.elts[0], '{}')
1682 self._check_content(s1, c1.elts[1], '{1, }')
1683 self._check_content(s1, c1.elts[2], '{1, 2,}')
1684 self._check_content(s2, c2.keys[1], 'f ()')
1685 self._check_content(s2, c2.values[1], 'g ()')
1686
1687 def test_comprehensions(self):
1688 s = dedent('''
1689 x = [{x for x, y in stuff
1690 if cond.x} for stuff in things]
1691 ''').strip()
1692 cmp = self._parse_value(s)
1693 self._check_end_pos(cmp, 2, 37)
1694 self._check_content(s, cmp.generators[0].iter, 'things')
1695 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1696 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1697 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1698
1699 def test_yield_await(self):
1700 s = dedent('''
1701 async def f():
1702 yield x
1703 await y
1704 ''').strip()
1705 fdef = ast.parse(s).body[0]
1706 self._check_content(s, fdef.body[0].value, 'yield x')
1707 self._check_content(s, fdef.body[1].value, 'await y')
1708
1709 def test_source_segment_multi(self):
1710 s_orig = dedent('''
1711 x = (
1712 a, b,
1713 ) + ()
1714 ''').strip()
1715 s_tuple = dedent('''
1716 (
1717 a, b,
1718 )
1719 ''').strip()
1720 binop = self._parse_value(s_orig)
1721 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1722
1723 def test_source_segment_padded(self):
1724 s_orig = dedent('''
1725 class C:
1726 def fun(self) -> None:
1727 "ЖЖЖЖЖ"
1728 ''').strip()
1729 s_method = ' def fun(self) -> None:\n' \
1730 ' "ЖЖЖЖЖ"'
1731 cdef = ast.parse(s_orig).body[0]
1732 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1733 s_method)
1734
1735 def test_source_segment_endings(self):
1736 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1737 v, w, x, y, z = ast.parse(s).body
1738 self._check_content(s, v, 'v = 1')
1739 self._check_content(s, w, 'w = 1')
1740 self._check_content(s, x, 'x = 1')
1741 self._check_content(s, y, 'y = 1')
1742 self._check_content(s, z, 'z = 1')
1743
1744 def test_source_segment_tabs(self):
1745 s = dedent('''
1746 class C:
1747 \t\f def fun(self) -> None:
1748 \t\f pass
1749 ''').strip()
1750 s_method = ' \t\f def fun(self) -> None:\n' \
1751 ' \t\f pass'
1752
1753 cdef = ast.parse(s).body[0]
1754 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1755
1756
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03001757class NodeVisitorTests(unittest.TestCase):
1758 def test_old_constant_nodes(self):
1759 class Visitor(ast.NodeVisitor):
1760 def visit_Num(self, node):
1761 log.append((node.lineno, 'Num', node.n))
1762 def visit_Str(self, node):
1763 log.append((node.lineno, 'Str', node.s))
1764 def visit_Bytes(self, node):
1765 log.append((node.lineno, 'Bytes', node.s))
1766 def visit_NameConstant(self, node):
1767 log.append((node.lineno, 'NameConstant', node.value))
1768 def visit_Ellipsis(self, node):
1769 log.append((node.lineno, 'Ellipsis', ...))
1770 mod = ast.parse(dedent('''\
1771 i = 42
1772 f = 4.25
1773 c = 4.25j
1774 s = 'string'
1775 b = b'bytes'
1776 t = True
1777 n = None
1778 e = ...
1779 '''))
1780 visitor = Visitor()
1781 log = []
1782 with warnings.catch_warnings(record=True) as wlog:
1783 warnings.filterwarnings('always', '', DeprecationWarning)
1784 visitor.visit(mod)
1785 self.assertEqual(log, [
1786 (1, 'Num', 42),
1787 (2, 'Num', 4.25),
1788 (3, 'Num', 4.25j),
1789 (4, 'Str', 'string'),
1790 (5, 'Bytes', b'bytes'),
1791 (6, 'NameConstant', True),
1792 (7, 'NameConstant', None),
1793 (8, 'Ellipsis', ...),
1794 ])
1795 self.assertEqual([str(w.message) for w in wlog], [
1796 'visit_Num is deprecated; add visit_Constant',
1797 'visit_Num is deprecated; add visit_Constant',
1798 'visit_Num is deprecated; add visit_Constant',
1799 'visit_Str is deprecated; add visit_Constant',
1800 'visit_Bytes is deprecated; add visit_Constant',
1801 'visit_NameConstant is deprecated; add visit_Constant',
1802 'visit_NameConstant is deprecated; add visit_Constant',
1803 'visit_Ellipsis is deprecated; add visit_Constant',
1804 ])
1805
1806
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001807def main():
1808 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001809 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001810 if sys.argv[1:] == ['-g']:
1811 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1812 (eval_tests, "eval")):
1813 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001814 for statement in statements:
1815 tree = ast.parse(statement, "?", kind)
1816 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001817 print("]")
1818 print("main()")
1819 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001820 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001821
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001822#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001823exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001824('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1825('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001826('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1827('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001828('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1829('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001830('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1831('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001832('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42, None)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1, None), ('Constant', (1, 16), None, None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()', None))], [], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001833('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001834('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001835('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001836('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1, None))], [], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001837('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001838('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001839('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1840('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1841('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001842('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001843('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1844('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1845('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1846('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1847('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001848('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string', None)], []), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001849('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1850('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1851('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1852('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1853('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1854('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001855('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001856('Module', [('Pass', (1, 0))], []),
1857('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1858('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1859('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []),
1860('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []),
1861('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []),
1862('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []),
1863('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []),
1864('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []),
1865('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []),
1866('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001867('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function', None)), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []),
1868('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1, None))], [('Expr', (3, 7), ('Constant', (3, 7), 2, None))], None)], [], None, None)], []),
1869('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001870('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []),
1871('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001872('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []),
1873('Module', [('FunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
1874('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001875('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001876('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []),
Pablo Galindo0c9258a2019-03-18 13:51:53 +00001877('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001878('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1879('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []),
1880('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []),
1881('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []),
1882('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1883('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []),
1884('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []),
1885('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []),
1886('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []),
1887('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []),
Tim Peters400cbc32006-02-28 18:44:41 +00001888]
1889single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001890('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1, None), ('Add',), ('Constant', (1, 2), 2, None)))]),
Tim Peters400cbc32006-02-28 18:44:41 +00001891]
1892eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001893('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001894('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1895('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1896('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001897('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001898('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001899('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001900('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1901('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001902('Expression', ('ListComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
1903('Expression', ('GeneratorExp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
1904('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])),
1905('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
1906('Expression', ('ListComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
1907('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])),
1908('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
1909('Expression', ('SetComp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
1910('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [], 0)])),
1911('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
1912('Expression', ('GeneratorExp', (1, 0), ('Tuple', (1, 1), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('List', (1, 11), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001913('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1914('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001915('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('GeneratorExp', (1, 1), ('Name', (1, 2), 'a', ('Load',)), [('comprehension', ('Name', (1, 8), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Load',)), [], 0)])], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001916('Expression', ('Constant', (1, 0), 10, None)),
1917('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001918('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1919('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001920('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001921('Expression', ('List', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001922('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001923('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1924('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1, None), ('Constant', (1, 3), 2, None), ('Constant', (1, 5), 3, None)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001925('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001926('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Constant', (1, 12), 1, None), ('Constant', (1, 14), 2, None), None), ('Load',))], [])),
Tim Peters400cbc32006-02-28 18:44:41 +00001927]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001928main()