blob: caea84f80f6a4bd033fdf6e6f29a997ced54d640 [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
Miss Islington (bot)522a3942019-08-26 00:43:33 -07006import 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",
Miss Islington (bot)3b18b172019-12-13 08:21:54 -080071 # If-Elif
72 "if a:\n pass\nelif b:\n pass",
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -080073 # If-Elif-Else
74 "if a:\n pass\nelif b:\n pass\nelse:\n pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050075 # With
76 "with x as y: pass",
77 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000078 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000079 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000080 # TryExcept
81 "try:\n pass\nexcept Exception:\n pass",
82 # TryFinally
83 "try:\n pass\nfinally:\n pass",
84 # Assert
85 "assert v",
86 # Import
87 "import sys",
88 # ImportFrom
89 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000090 # Global
91 "global v",
92 # Expr
93 "1",
94 # Pass,
95 "pass",
96 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040097 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000098 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040099 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +0000100 # for statements with naked tuples (see http://bugs.python.org/issue6704)
101 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200102 "for (a,b) in c: pass",
103 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500104 # Multiline generator expression (test for .lineno & .col_offset)
105 """(
106 (
107 Aa
108 ,
109 Bb
110 )
111 for
112 Aa
113 ,
114 Bb in Cc
115 )""",
116 # dictcomp
117 "{a : b for w in x for m in p if g}",
118 # dictcomp with naked tuple
119 "{a : b for v,w in x}",
120 # setcomp
121 "{r for l in x if g}",
122 # setcomp with naked tuple
123 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400124 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900125 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400126 # AsyncFor
127 "async def f():\n async for e in i: 1\n else: 2",
128 # AsyncWith
129 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400130 # PEP 448: Additional Unpacking Generalizations
131 "{**{1:2}, 2:3}",
132 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700133 # Asynchronous comprehensions
134 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200135 # Decorated FunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700136 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200137 # Decorated AsyncFunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700138 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200139 # Decorated ClassDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700140 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200141 # Decorator with generator argument
142 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000143 # Simple assignment expression
144 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100145 # Positional-only arguments
146 "def f(a, /,): pass",
147 "def f(a, /, c, d, e): pass",
148 "def f(a, /, c, *, d, e): pass",
149 "def f(a, /, c, *, d, e, **kwargs): pass",
150 # Positional-only arguments with defaults
151 "def f(a=1, /,): pass",
152 "def f(a=1, /, b=2, c=4): pass",
153 "def f(a=1, /, b=2, *, c=4): pass",
154 "def f(a=1, /, b=2, *, c): pass",
155 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
156 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000157
Tim Peters400cbc32006-02-28 18:44:41 +0000158]
159
160# These are compiled through "single"
161# because of overlap with "eval", it just tests what
162# can't be tested with "eval"
163single_tests = [
164 "1+2"
165]
166
167# These are compiled through "eval"
168# It should test all expressions
169eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500170 # None
171 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000172 # BoolOp
173 "a and b",
174 # BinOp
175 "a + b",
176 # UnaryOp
177 "not v",
178 # Lambda
179 "lambda:None",
180 # Dict
181 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500182 # Empty dict
183 "{}",
184 # Set
185 "{None,}",
186 # Multiline dict (test for .lineno & .col_offset)
187 """{
188 1
189 :
190 2
191 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000192 # ListComp
193 "[a for b in c if d]",
194 # GeneratorExp
195 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200196 # Comprehensions with multiple for targets
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}",
202 "{(a,b) for [a,b] in c}",
203 "((a,b) for a,b in c)",
204 "((a,b) for (a,b) in c)",
205 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000206 # Yield - yield expressions can't work outside a function
207 #
208 # Compare
209 "1 < 2 < 3",
210 # Call
211 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200212 # Call with a generator argument
213 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000214 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000215 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000216 # Str
217 "'string'",
218 # Attribute
219 "a.b",
220 # Subscript
221 "a[b:c]",
222 # Name
223 "v",
224 # List
225 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500226 # Empty list
227 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000228 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000229 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500230 # Tuple
231 "(1,2,3)",
232 # Empty tuple
233 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000234 # Combination
235 "a.b.c.d(a.b[1:2])",
236
Tim Peters400cbc32006-02-28 18:44:41 +0000237]
238
239# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
240# excepthandler, arguments, keywords, alias
241
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000242class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000243
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500244 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000245 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000246 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000247 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000248 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200249 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000250 parent_pos = (ast_node.lineno, ast_node.col_offset)
251 for name in ast_node._fields:
252 value = getattr(ast_node, name)
253 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200254 first_pos = parent_pos
255 if value and name == 'decorator_list':
256 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000257 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200258 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000259 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500260 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000261
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500262 def test_AST_objects(self):
263 x = ast.AST()
264 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700265 x.foobar = 42
266 self.assertEqual(x.foobar, 42)
267 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500268
269 with self.assertRaises(AttributeError):
270 x.vararg
271
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500272 with self.assertRaises(TypeError):
273 # "_ast.AST constructor takes 0 positional arguments"
274 ast.AST(2)
275
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700276 def test_AST_garbage_collection(self):
277 class X:
278 pass
279 a = ast.AST()
280 a.x = X()
281 a.x.a = a
282 ref = weakref.ref(a.x)
283 del a
284 support.gc_collect()
285 self.assertIsNone(ref())
286
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000287 def test_snippets(self):
288 for input, output, kind in ((exec_tests, exec_results, "exec"),
289 (single_tests, single_results, "single"),
290 (eval_tests, eval_results, "eval")):
291 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400292 with self.subTest(action="parsing", input=i):
293 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
294 self.assertEqual(to_tuple(ast_tree), o)
295 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100296 with self.subTest(action="compiling", input=i, kind=kind):
297 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000298
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000299 def test_ast_validation(self):
300 # compile() is the only function that calls PyAST_Validate
301 snippets_to_validate = exec_tests + single_tests + eval_tests
302 for snippet in snippets_to_validate:
303 tree = ast.parse(snippet)
304 compile(tree, '<string>', 'exec')
305
Benjamin Peterson78565b22009-06-28 19:19:51 +0000306 def test_slice(self):
307 slc = ast.parse("x[::]").body[0].value.slice
308 self.assertIsNone(slc.upper)
309 self.assertIsNone(slc.lower)
310 self.assertIsNone(slc.step)
311
312 def test_from_import(self):
313 im = ast.parse("from . import y").body[0]
314 self.assertIsNone(im.module)
315
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400316 def test_non_interned_future_from_ast(self):
317 mod = ast.parse("from __future__ import division")
318 self.assertIsInstance(mod.body[0], ast.ImportFrom)
319 mod.body[0].module = " __future__ ".strip()
320 compile(mod, "<test>", "exec")
321
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000322 def test_base_classes(self):
323 self.assertTrue(issubclass(ast.For, ast.stmt))
324 self.assertTrue(issubclass(ast.Name, ast.expr))
325 self.assertTrue(issubclass(ast.stmt, ast.AST))
326 self.assertTrue(issubclass(ast.expr, ast.AST))
327 self.assertTrue(issubclass(ast.comprehension, ast.AST))
328 self.assertTrue(issubclass(ast.Gt, ast.AST))
329
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500330 def test_field_attr_existence(self):
331 for name, item in ast.__dict__.items():
332 if isinstance(item, type) and name != 'AST' and name[0].isupper():
333 x = item()
334 if isinstance(x, ast.AST):
335 self.assertEqual(type(x._fields), tuple)
336
337 def test_arguments(self):
338 x = ast.arguments()
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -0700339 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
340 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500341
342 with self.assertRaises(AttributeError):
343 x.vararg
344
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100345 x = ast.arguments(*range(1, 8))
346 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500347
348 def test_field_attr_writable(self):
349 x = ast.Num()
350 # We can assign to _fields
351 x._fields = 666
352 self.assertEqual(x._fields, 666)
353
354 def test_classattrs(self):
355 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700356 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300357
358 with self.assertRaises(AttributeError):
359 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500360
361 with self.assertRaises(AttributeError):
362 x.n
363
364 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300365 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500366 self.assertEqual(x.n, 42)
367
368 with self.assertRaises(AttributeError):
369 x.lineno
370
371 with self.assertRaises(AttributeError):
372 x.foobar
373
374 x = ast.Num(lineno=2)
375 self.assertEqual(x.lineno, 2)
376
377 x = ast.Num(42, lineno=0)
378 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700379 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300380 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500381 self.assertEqual(x.n, 42)
382
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700383 self.assertRaises(TypeError, ast.Num, 1, None, 2)
384 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500385
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300386 self.assertEqual(ast.Num(42).n, 42)
387 self.assertEqual(ast.Num(4.25).n, 4.25)
388 self.assertEqual(ast.Num(4.25j).n, 4.25j)
389 self.assertEqual(ast.Str('42').s, '42')
390 self.assertEqual(ast.Bytes(b'42').s, b'42')
391 self.assertIs(ast.NameConstant(True).value, True)
392 self.assertIs(ast.NameConstant(False).value, False)
393 self.assertIs(ast.NameConstant(None).value, None)
394
395 self.assertEqual(ast.Constant(42).value, 42)
396 self.assertEqual(ast.Constant(4.25).value, 4.25)
397 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
398 self.assertEqual(ast.Constant('42').value, '42')
399 self.assertEqual(ast.Constant(b'42').value, b'42')
400 self.assertIs(ast.Constant(True).value, True)
401 self.assertIs(ast.Constant(False).value, False)
402 self.assertIs(ast.Constant(None).value, None)
403 self.assertIs(ast.Constant(...).value, ...)
404
405 def test_realtype(self):
406 self.assertEqual(type(ast.Num(42)), ast.Constant)
407 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
408 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
409 self.assertEqual(type(ast.Str('42')), ast.Constant)
410 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
411 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
412 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
413 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
414 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
415
416 def test_isinstance(self):
417 self.assertTrue(isinstance(ast.Num(42), ast.Num))
418 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
419 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
420 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
421 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
422 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
423 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
424 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
425 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
426
427 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
428 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
429 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
430 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
431 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
432 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
433 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
434 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
435 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
436
437 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
438 self.assertFalse(isinstance(ast.Num(42), ast.Str))
439 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
440 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
441 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800442 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
443 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300444
445 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
446 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
447 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
448 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
449 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800450 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
451 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300452
453 self.assertFalse(isinstance(ast.Constant(), ast.Num))
454 self.assertFalse(isinstance(ast.Constant(), ast.Str))
455 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
456 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
457 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
458
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200459 class S(str): pass
460 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
461 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
462
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300463 def test_subclasses(self):
464 class N(ast.Num):
465 def __init__(self, *args, **kwargs):
466 super().__init__(*args, **kwargs)
467 self.z = 'spam'
468 class N2(ast.Num):
469 pass
470
471 n = N(42)
472 self.assertEqual(n.n, 42)
473 self.assertEqual(n.z, 'spam')
474 self.assertEqual(type(n), N)
475 self.assertTrue(isinstance(n, N))
476 self.assertTrue(isinstance(n, ast.Num))
477 self.assertFalse(isinstance(n, N2))
478 self.assertFalse(isinstance(ast.Num(42), N))
479 n = N(n=42)
480 self.assertEqual(n.n, 42)
481 self.assertEqual(type(n), N)
482
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500483 def test_module(self):
484 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800485 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500486 self.assertEqual(x.body, body)
487
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000488 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100489 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500490 x = ast.BinOp()
491 self.assertEqual(x._fields, ('left', 'op', 'right'))
492
493 # Random attribute allowed too
494 x.foobarbaz = 5
495 self.assertEqual(x.foobarbaz, 5)
496
497 n1 = ast.Num(1)
498 n3 = ast.Num(3)
499 addop = ast.Add()
500 x = ast.BinOp(n1, addop, n3)
501 self.assertEqual(x.left, n1)
502 self.assertEqual(x.op, addop)
503 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500504
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500505 x = ast.BinOp(1, 2, 3)
506 self.assertEqual(x.left, 1)
507 self.assertEqual(x.op, 2)
508 self.assertEqual(x.right, 3)
509
Georg Brandl0c77a822008-06-10 16:37:50 +0000510 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000511 self.assertEqual(x.left, 1)
512 self.assertEqual(x.op, 2)
513 self.assertEqual(x.right, 3)
514 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000515
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500516 # node raises exception when given too many arguments
517 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500518 # node raises exception when given too many arguments
519 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000520
521 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000522 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000523 self.assertEqual(x.left, 1)
524 self.assertEqual(x.op, 2)
525 self.assertEqual(x.right, 3)
526 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000527
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500528 # Random kwargs also allowed
529 x = ast.BinOp(1, 2, 3, foobarbaz=42)
530 self.assertEqual(x.foobarbaz, 42)
531
532 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000533 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000534 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500535 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000536
537 def test_pickling(self):
538 import pickle
539 mods = [pickle]
540 try:
541 import cPickle
542 mods.append(cPickle)
543 except ImportError:
544 pass
545 protocols = [0, 1, 2]
546 for mod in mods:
547 for protocol in protocols:
548 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
549 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000550 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000551
Benjamin Peterson5b066812010-11-20 01:38:49 +0000552 def test_invalid_sum(self):
553 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800554 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000555 with self.assertRaises(TypeError) as cm:
556 compile(m, "<test>", "exec")
557 self.assertIn("but got <_ast.expr", str(cm.exception))
558
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500559 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800560 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500561 ast.fix_missing_locations(m)
562 with self.assertRaises(TypeError) as cm:
563 compile(m, "<test>", "exec")
564 self.assertIn("identifier must be of type str", str(cm.exception))
565
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000566 def test_empty_yield_from(self):
567 # Issue 16546: yield from value is not optional.
568 empty_yield_from = ast.parse("def f():\n yield from g()")
569 empty_yield_from.body[0].body[0].value.value = None
570 with self.assertRaises(ValueError) as cm:
571 compile(empty_yield_from, "<test>", "exec")
572 self.assertIn("field value is required", str(cm.exception))
573
Oren Milman7dc46d82017-09-30 20:16:24 +0300574 @support.cpython_only
575 def test_issue31592(self):
576 # There shouldn't be an assertion failure in case of a bad
577 # unicodedata.normalize().
578 import unicodedata
579 def bad_normalize(*args):
580 return None
581 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
582 self.assertRaises(TypeError, ast.parse, '\u03D5')
583
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700584 def test_issue18374_binop_col_offset(self):
585 tree = ast.parse('4+5+6+7')
586 parent_binop = tree.body[0].value
587 child_binop = parent_binop.left
588 grandchild_binop = child_binop.left
589 self.assertEqual(parent_binop.col_offset, 0)
590 self.assertEqual(parent_binop.end_col_offset, 7)
591 self.assertEqual(child_binop.col_offset, 0)
592 self.assertEqual(child_binop.end_col_offset, 5)
593 self.assertEqual(grandchild_binop.col_offset, 0)
594 self.assertEqual(grandchild_binop.end_col_offset, 3)
595
596 tree = ast.parse('4+5-\\\n 6-7')
597 parent_binop = tree.body[0].value
598 child_binop = parent_binop.left
599 grandchild_binop = child_binop.left
600 self.assertEqual(parent_binop.col_offset, 0)
601 self.assertEqual(parent_binop.lineno, 1)
602 self.assertEqual(parent_binop.end_col_offset, 4)
603 self.assertEqual(parent_binop.end_lineno, 2)
604
605 self.assertEqual(child_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700606 self.assertEqual(child_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700607 self.assertEqual(child_binop.end_col_offset, 2)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700608 self.assertEqual(child_binop.end_lineno, 2)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700609
610 self.assertEqual(grandchild_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700611 self.assertEqual(grandchild_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700612 self.assertEqual(grandchild_binop.end_col_offset, 3)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700613 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000614
615class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700616 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000617
618 def test_parse(self):
619 a = ast.parse('foo(1 + 1)')
620 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
621 self.assertEqual(ast.dump(a), ast.dump(b))
622
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400623 def test_parse_in_error(self):
624 try:
625 1/0
626 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400627 with self.assertRaises(SyntaxError) as e:
628 ast.literal_eval(r"'\U'")
629 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400630
Georg Brandl0c77a822008-06-10 16:37:50 +0000631 def test_dump(self):
632 node = ast.parse('spam(eggs, "and cheese")')
633 self.assertEqual(ast.dump(node),
634 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700635 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800636 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000637 )
638 self.assertEqual(ast.dump(node, annotate_fields=False),
639 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700640 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000641 )
642 self.assertEqual(ast.dump(node, include_attributes=True),
643 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000644 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
645 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700646 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000647 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
648 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800649 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000650 )
651
Serhiy Storchaka097eae52019-08-29 10:50:28 +0300652 def test_dump_incomplete(self):
653 node = ast.Raise(lineno=3, col_offset=4)
654 self.assertEqual(ast.dump(node),
655 "Raise()"
656 )
657 self.assertEqual(ast.dump(node, include_attributes=True),
658 "Raise(lineno=3, col_offset=4)"
659 )
660 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
661 self.assertEqual(ast.dump(node),
662 "Raise(exc=Name(id='e', ctx=Load()))"
663 )
664 self.assertEqual(ast.dump(node, annotate_fields=False),
665 "Raise(Name('e', Load()))"
666 )
667 self.assertEqual(ast.dump(node, include_attributes=True),
668 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
669 )
670 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
671 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
672 )
673 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
674 self.assertEqual(ast.dump(node),
675 "Raise(cause=Name(id='e', ctx=Load()))"
676 )
677 self.assertEqual(ast.dump(node, annotate_fields=False),
678 "Raise(cause=Name('e', Load()))"
679 )
680
Georg Brandl0c77a822008-06-10 16:37:50 +0000681 def test_copy_location(self):
682 src = ast.parse('1 + 1', mode='eval')
683 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
684 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700685 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000686 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
687 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
688 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000689 )
690
691 def test_fix_missing_locations(self):
692 src = ast.parse('write("spam")')
693 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400694 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000695 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000696 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000697 self.assertEqual(ast.dump(src, include_attributes=True),
698 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000699 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700700 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000701 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
702 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
703 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
704 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
705 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
706 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800707 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
708 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000709 )
710
711 def test_increment_lineno(self):
712 src = ast.parse('1 + 1', mode='eval')
713 self.assertEqual(ast.increment_lineno(src, n=3), src)
714 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700715 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
716 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000717 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
718 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000719 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000720 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000721 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000722 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
723 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700724 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
725 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000726 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
727 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000728 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000729
730 def test_iter_fields(self):
731 node = ast.parse('foo()', mode='eval')
732 d = dict(ast.iter_fields(node.body))
733 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400734 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000735
736 def test_iter_child_nodes(self):
737 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
738 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
739 iterator = ast.iter_child_nodes(node.body)
740 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300741 self.assertEqual(next(iterator).value, 23)
742 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000743 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700744 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000745 )
746
747 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300748 node = ast.parse('"""line one\n line two"""')
749 self.assertEqual(ast.get_docstring(node),
750 'line one\nline two')
751
752 node = ast.parse('class foo:\n """line one\n line two"""')
753 self.assertEqual(ast.get_docstring(node.body[0]),
754 'line one\nline two')
755
Georg Brandl0c77a822008-06-10 16:37:50 +0000756 node = ast.parse('def foo():\n """line one\n line two"""')
757 self.assertEqual(ast.get_docstring(node.body[0]),
758 'line one\nline two')
759
Yury Selivanov2f07a662015-07-23 08:54:35 +0300760 node = ast.parse('async def foo():\n """spam\n ham"""')
761 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300762
763 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800764 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300765 node = ast.parse('x = "not docstring"')
766 self.assertIsNone(ast.get_docstring(node))
767 node = ast.parse('def foo():\n pass')
768 self.assertIsNone(ast.get_docstring(node))
769
770 node = ast.parse('class foo:\n pass')
771 self.assertIsNone(ast.get_docstring(node.body[0]))
772 node = ast.parse('class foo:\n x = "not docstring"')
773 self.assertIsNone(ast.get_docstring(node.body[0]))
774 node = ast.parse('class foo:\n def bar(self): pass')
775 self.assertIsNone(ast.get_docstring(node.body[0]))
776
777 node = ast.parse('def foo():\n pass')
778 self.assertIsNone(ast.get_docstring(node.body[0]))
779 node = ast.parse('def foo():\n x = "not docstring"')
780 self.assertIsNone(ast.get_docstring(node.body[0]))
781
782 node = ast.parse('async def foo():\n pass')
783 self.assertIsNone(ast.get_docstring(node.body[0]))
784 node = ast.parse('async def foo():\n x = "not docstring"')
785 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300786
Anthony Sottile995d9b92019-01-12 20:05:13 -0800787 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
788 node = ast.parse(
789 '"""line one\nline two"""\n\n'
790 'def foo():\n """line one\n line two"""\n\n'
791 ' def bar():\n """line one\n line two"""\n'
792 ' """line one\n line two"""\n'
793 '"""line one\nline two"""\n\n'
794 )
795 self.assertEqual(node.body[0].col_offset, 0)
796 self.assertEqual(node.body[0].lineno, 1)
797 self.assertEqual(node.body[1].body[0].col_offset, 2)
798 self.assertEqual(node.body[1].body[0].lineno, 5)
799 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
800 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
801 self.assertEqual(node.body[1].body[2].col_offset, 2)
802 self.assertEqual(node.body[1].body[2].lineno, 11)
803 self.assertEqual(node.body[2].col_offset, 0)
804 self.assertEqual(node.body[2].lineno, 13)
805
Miss Islington (bot)3b18b172019-12-13 08:21:54 -0800806 def test_elif_stmt_start_position(self):
807 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
808 elif_stmt = node.body[0].orelse[0]
809 self.assertEqual(elif_stmt.lineno, 3)
810 self.assertEqual(elif_stmt.col_offset, 0)
811
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -0800812 def test_elif_stmt_start_position_with_else(self):
813 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
814 elif_stmt = node.body[0].orelse[0]
815 self.assertEqual(elif_stmt.lineno, 3)
816 self.assertEqual(elif_stmt.col_offset, 0)
817
Georg Brandl0c77a822008-06-10 16:37:50 +0000818 def test_literal_eval(self):
819 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
820 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
821 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000822 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000823 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000824 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200825 self.assertEqual(ast.literal_eval('6'), 6)
826 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000827 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000828 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200829 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
830 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
831 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
832 self.assertRaises(ValueError, ast.literal_eval, '++6')
833 self.assertRaises(ValueError, ast.literal_eval, '+True')
834 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000835
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200836 def test_literal_eval_complex(self):
837 # Issue #4907
838 self.assertEqual(ast.literal_eval('6j'), 6j)
839 self.assertEqual(ast.literal_eval('-6j'), -6j)
840 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
841 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
842 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
843 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
844 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
845 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
846 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
847 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
848 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
849 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
850 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
851 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
852 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
853 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
854 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
855 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000856
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100857 def test_bad_integer(self):
858 # issue13436: Bad error message with invalid numeric values
859 body = [ast.ImportFrom(module='time',
860 names=[ast.alias(name='sleep')],
861 level=None,
862 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800863 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100864 with self.assertRaises(ValueError) as cm:
865 compile(mod, 'test', 'exec')
866 self.assertIn("invalid integer value: None", str(cm.exception))
867
Berker Peksag0a5bd512016-04-29 19:50:02 +0300868 def test_level_as_none(self):
869 body = [ast.ImportFrom(module='time',
870 names=[ast.alias(name='sleep')],
871 level=None,
872 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800873 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300874 code = compile(mod, 'test', 'exec')
875 ns = {}
876 exec(code, ns)
877 self.assertIn('sleep', ns)
878
Georg Brandl0c77a822008-06-10 16:37:50 +0000879
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500880class ASTValidatorTests(unittest.TestCase):
881
882 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
883 mod.lineno = mod.col_offset = 0
884 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300885 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500886 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300887 else:
888 with self.assertRaises(exc) as cm:
889 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500890 self.assertIn(msg, str(cm.exception))
891
892 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800893 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500894 self.mod(mod, msg, exc=exc)
895
896 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800897 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500898 self.mod(mod, msg)
899
900 def test_module(self):
901 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
902 self.mod(m, "must have Load context", "single")
903 m = ast.Expression(ast.Name("x", ast.Store()))
904 self.mod(m, "must have Load context", "eval")
905
906 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100907 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700908 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500909 defaults=None, kw_defaults=None):
910 if args is None:
911 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100912 if posonlyargs is None:
913 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500914 if kwonlyargs is None:
915 kwonlyargs = []
916 if defaults is None:
917 defaults = []
918 if kw_defaults is None:
919 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100920 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
921 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500922 return fac(args)
923 args = [ast.arg("x", ast.Name("x", ast.Store()))]
924 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100925 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500926 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500927 check(arguments(defaults=[ast.Num(3)]),
928 "more positional defaults than args")
929 check(arguments(kw_defaults=[ast.Num(4)]),
930 "length of kwonlyargs is not the same as kw_defaults")
931 args = [ast.arg("x", ast.Name("x", ast.Load()))]
932 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
933 "must have Load context")
934 args = [ast.arg("a", ast.Name("x", ast.Load())),
935 ast.arg("b", ast.Name("y", ast.Load()))]
936 check(arguments(kwonlyargs=args,
937 kw_defaults=[None, ast.Name("x", ast.Store())]),
938 "must have Load context")
939
940 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100941 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300942 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500943 self.stmt(f, "empty body on FunctionDef")
944 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300945 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500946 self.stmt(f, "must have Load context")
947 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300948 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500949 self.stmt(f, "must have Load context")
950 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300951 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500952 self._check_arguments(fac, self.stmt)
953
954 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400955 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500956 if bases is None:
957 bases = []
958 if keywords is None:
959 keywords = []
960 if body is None:
961 body = [ast.Pass()]
962 if decorator_list is None:
963 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400964 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300965 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500966 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
967 "must have Load context")
968 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
969 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500970 self.stmt(cls(body=[]), "empty body on ClassDef")
971 self.stmt(cls(body=[None]), "None disallowed")
972 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
973 "must have Load context")
974
975 def test_delete(self):
976 self.stmt(ast.Delete([]), "empty targets on Delete")
977 self.stmt(ast.Delete([None]), "None disallowed")
978 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
979 "must have Del context")
980
981 def test_assign(self):
982 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
983 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
984 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
985 "must have Store context")
986 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
987 ast.Name("y", ast.Store())),
988 "must have Load context")
989
990 def test_augassign(self):
991 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
992 ast.Name("y", ast.Load()))
993 self.stmt(aug, "must have Store context")
994 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
995 ast.Name("y", ast.Store()))
996 self.stmt(aug, "must have Load context")
997
998 def test_for(self):
999 x = ast.Name("x", ast.Store())
1000 y = ast.Name("y", ast.Load())
1001 p = ast.Pass()
1002 self.stmt(ast.For(x, y, [], []), "empty body on For")
1003 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1004 "must have Store context")
1005 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1006 "must have Load context")
1007 e = ast.Expr(ast.Name("x", ast.Store()))
1008 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1009 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1010
1011 def test_while(self):
1012 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1013 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1014 "must have Load context")
1015 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1016 [ast.Expr(ast.Name("x", ast.Store()))]),
1017 "must have Load context")
1018
1019 def test_if(self):
1020 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1021 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1022 self.stmt(i, "must have Load context")
1023 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1024 self.stmt(i, "must have Load context")
1025 i = ast.If(ast.Num(3), [ast.Pass()],
1026 [ast.Expr(ast.Name("x", ast.Store()))])
1027 self.stmt(i, "must have Load context")
1028
1029 def test_with(self):
1030 p = ast.Pass()
1031 self.stmt(ast.With([], [p]), "empty items on With")
1032 i = ast.withitem(ast.Num(3), None)
1033 self.stmt(ast.With([i], []), "empty body on With")
1034 i = ast.withitem(ast.Name("x", ast.Store()), None)
1035 self.stmt(ast.With([i], [p]), "must have Load context")
1036 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1037 self.stmt(ast.With([i], [p]), "must have Store context")
1038
1039 def test_raise(self):
1040 r = ast.Raise(None, ast.Num(3))
1041 self.stmt(r, "Raise with cause but no exception")
1042 r = ast.Raise(ast.Name("x", ast.Store()), None)
1043 self.stmt(r, "must have Load context")
1044 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1045 self.stmt(r, "must have Load context")
1046
1047 def test_try(self):
1048 p = ast.Pass()
1049 t = ast.Try([], [], [], [p])
1050 self.stmt(t, "empty body on Try")
1051 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1052 self.stmt(t, "must have Load context")
1053 t = ast.Try([p], [], [], [])
1054 self.stmt(t, "Try has neither except handlers nor finalbody")
1055 t = ast.Try([p], [], [p], [p])
1056 self.stmt(t, "Try has orelse but no except handlers")
1057 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1058 self.stmt(t, "empty body on ExceptHandler")
1059 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1060 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1061 e = [ast.ExceptHandler(None, "x", [p])]
1062 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1063 self.stmt(t, "must have Load context")
1064 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1065 self.stmt(t, "must have Load context")
1066
1067 def test_assert(self):
1068 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1069 "must have Load context")
1070 assrt = ast.Assert(ast.Name("x", ast.Load()),
1071 ast.Name("y", ast.Store()))
1072 self.stmt(assrt, "must have Load context")
1073
1074 def test_import(self):
1075 self.stmt(ast.Import([]), "empty names on Import")
1076
1077 def test_importfrom(self):
1078 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001079 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001080 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1081
1082 def test_global(self):
1083 self.stmt(ast.Global([]), "empty names on Global")
1084
1085 def test_nonlocal(self):
1086 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1087
1088 def test_expr(self):
1089 e = ast.Expr(ast.Name("x", ast.Store()))
1090 self.stmt(e, "must have Load context")
1091
1092 def test_boolop(self):
1093 b = ast.BoolOp(ast.And(), [])
1094 self.expr(b, "less than 2 values")
1095 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1096 self.expr(b, "less than 2 values")
1097 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1098 self.expr(b, "None disallowed")
1099 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1100 self.expr(b, "must have Load context")
1101
1102 def test_unaryop(self):
1103 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1104 self.expr(u, "must have Load context")
1105
1106 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001107 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001108 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1109 "must have Load context")
1110 def fac(args):
1111 return ast.Lambda(args, ast.Name("x", ast.Load()))
1112 self._check_arguments(fac, self.expr)
1113
1114 def test_ifexp(self):
1115 l = ast.Name("x", ast.Load())
1116 s = ast.Name("y", ast.Store())
1117 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001118 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001119
1120 def test_dict(self):
1121 d = ast.Dict([], [ast.Name("x", ast.Load())])
1122 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001123 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1124 self.expr(d, "None disallowed")
1125
1126 def test_set(self):
1127 self.expr(ast.Set([None]), "None disallowed")
1128 s = ast.Set([ast.Name("x", ast.Store())])
1129 self.expr(s, "must have Load context")
1130
1131 def _check_comprehension(self, fac):
1132 self.expr(fac([]), "comprehension with no generators")
1133 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001134 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001135 self.expr(fac([g]), "must have Store context")
1136 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001137 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001138 self.expr(fac([g]), "must have Load context")
1139 x = ast.Name("x", ast.Store())
1140 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001141 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001142 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001143 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001144 self.expr(fac([g]), "must have Load context")
1145
1146 def _simple_comp(self, fac):
1147 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001148 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001149 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1150 "must have Load context")
1151 def wrap(gens):
1152 return fac(ast.Name("x", ast.Store()), gens)
1153 self._check_comprehension(wrap)
1154
1155 def test_listcomp(self):
1156 self._simple_comp(ast.ListComp)
1157
1158 def test_setcomp(self):
1159 self._simple_comp(ast.SetComp)
1160
1161 def test_generatorexp(self):
1162 self._simple_comp(ast.GeneratorExp)
1163
1164 def test_dictcomp(self):
1165 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001166 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001167 c = ast.DictComp(ast.Name("x", ast.Store()),
1168 ast.Name("y", ast.Load()), [g])
1169 self.expr(c, "must have Load context")
1170 c = ast.DictComp(ast.Name("x", ast.Load()),
1171 ast.Name("y", ast.Store()), [g])
1172 self.expr(c, "must have Load context")
1173 def factory(comps):
1174 k = ast.Name("x", ast.Load())
1175 v = ast.Name("y", ast.Load())
1176 return ast.DictComp(k, v, comps)
1177 self._check_comprehension(factory)
1178
1179 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001180 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1181 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001182
1183 def test_compare(self):
1184 left = ast.Name("x", ast.Load())
1185 comp = ast.Compare(left, [ast.In()], [])
1186 self.expr(comp, "no comparators")
1187 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1188 self.expr(comp, "different number of comparators and operands")
1189 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001190 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001191 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001192 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001193
1194 def test_call(self):
1195 func = ast.Name("x", ast.Load())
1196 args = [ast.Name("y", ast.Load())]
1197 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001198 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001199 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001200 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001201 self.expr(call, "None disallowed")
1202 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001203 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001204 self.expr(call, "must have Load context")
1205
1206 def test_num(self):
1207 class subint(int):
1208 pass
1209 class subfloat(float):
1210 pass
1211 class subcomplex(complex):
1212 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001213 for obj in "0", "hello":
1214 self.expr(ast.Num(obj))
1215 for obj in subint(), subfloat(), subcomplex():
1216 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001217
1218 def test_attribute(self):
1219 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1220 self.expr(attr, "must have Load context")
1221
1222 def test_subscript(self):
1223 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1224 ast.Load())
1225 self.expr(sub, "must have Load context")
1226 x = ast.Name("x", ast.Load())
1227 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1228 ast.Load())
1229 self.expr(sub, "must have Load context")
1230 s = ast.Name("x", ast.Store())
1231 for args in (s, None, None), (None, s, None), (None, None, s):
1232 sl = ast.Slice(*args)
1233 self.expr(ast.Subscript(x, sl, ast.Load()),
1234 "must have Load context")
1235 sl = ast.ExtSlice([])
1236 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1237 sl = ast.ExtSlice([ast.Index(s)])
1238 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1239
1240 def test_starred(self):
1241 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1242 ast.Store())
1243 assign = ast.Assign([left], ast.Num(4))
1244 self.stmt(assign, "must have Store context")
1245
1246 def _sequence(self, fac):
1247 self.expr(fac([None], ast.Load()), "None disallowed")
1248 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1249 "must have Load context")
1250
1251 def test_list(self):
1252 self._sequence(ast.List)
1253
1254 def test_tuple(self):
1255 self._sequence(ast.Tuple)
1256
Benjamin Peterson442f2092012-12-06 17:41:04 -05001257 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001258 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001259
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001260 def test_stdlib_validates(self):
1261 stdlib = os.path.dirname(ast.__file__)
1262 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1263 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1264 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001265 with self.subTest(module):
1266 fn = os.path.join(stdlib, module)
1267 with open(fn, "r", encoding="utf-8") as fp:
1268 source = fp.read()
1269 mod = ast.parse(source, fn)
1270 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001271
1272
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001273class ConstantTests(unittest.TestCase):
1274 """Tests on the ast.Constant node type."""
1275
1276 def compile_constant(self, value):
1277 tree = ast.parse("x = 123")
1278
1279 node = tree.body[0].value
1280 new_node = ast.Constant(value=value)
1281 ast.copy_location(new_node, node)
1282 tree.body[0].value = new_node
1283
1284 code = compile(tree, "<string>", "exec")
1285
1286 ns = {}
1287 exec(code, ns)
1288 return ns['x']
1289
Victor Stinnerbe59d142016-01-27 00:39:12 +01001290 def test_validation(self):
1291 with self.assertRaises(TypeError) as cm:
1292 self.compile_constant([1, 2, 3])
1293 self.assertEqual(str(cm.exception),
1294 "got an invalid type in Constant: list")
1295
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001296 def test_singletons(self):
1297 for const in (None, False, True, Ellipsis, b'', frozenset()):
1298 with self.subTest(const=const):
1299 value = self.compile_constant(const)
1300 self.assertIs(value, const)
1301
1302 def test_values(self):
1303 nested_tuple = (1,)
1304 nested_frozenset = frozenset({1})
1305 for level in range(3):
1306 nested_tuple = (nested_tuple, 2)
1307 nested_frozenset = frozenset({nested_frozenset, 2})
1308 values = (123, 123.0, 123j,
1309 "unicode", b'bytes',
1310 tuple("tuple"), frozenset("frozenset"),
1311 nested_tuple, nested_frozenset)
1312 for value in values:
1313 with self.subTest(value=value):
1314 result = self.compile_constant(value)
1315 self.assertEqual(result, value)
1316
1317 def test_assign_to_constant(self):
1318 tree = ast.parse("x = 1")
1319
1320 target = tree.body[0].targets[0]
1321 new_target = ast.Constant(value=1)
1322 ast.copy_location(new_target, target)
1323 tree.body[0].targets[0] = new_target
1324
1325 with self.assertRaises(ValueError) as cm:
1326 compile(tree, "string", "exec")
1327 self.assertEqual(str(cm.exception),
1328 "expression which can't be assigned "
1329 "to in Store context")
1330
1331 def test_get_docstring(self):
1332 tree = ast.parse("'docstring'\nx = 1")
1333 self.assertEqual(ast.get_docstring(tree), 'docstring')
1334
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001335 def get_load_const(self, tree):
1336 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1337 # instructions
1338 co = compile(tree, '<string>', 'exec')
1339 consts = []
1340 for instr in dis.get_instructions(co):
1341 if instr.opname == 'LOAD_CONST':
1342 consts.append(instr.argval)
1343 return consts
1344
1345 @support.cpython_only
1346 def test_load_const(self):
1347 consts = [None,
1348 True, False,
1349 124,
1350 2.0,
1351 3j,
1352 "unicode",
1353 b'bytes',
1354 (1, 2, 3)]
1355
Victor Stinnera2724092016-02-08 18:17:58 +01001356 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1357 code += '\nx = ...'
1358 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001359
1360 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001361 self.assertEqual(self.get_load_const(tree),
1362 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001363
1364 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001365 for assign, const in zip(tree.body, consts):
1366 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001367 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001368 ast.copy_location(new_node, assign.value)
1369 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001370
Victor Stinnera2724092016-02-08 18:17:58 +01001371 self.assertEqual(self.get_load_const(tree),
1372 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001373
1374 def test_literal_eval(self):
1375 tree = ast.parse("1 + 2")
1376 binop = tree.body[0].value
1377
1378 new_left = ast.Constant(value=10)
1379 ast.copy_location(new_left, binop.left)
1380 binop.left = new_left
1381
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001382 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001383 ast.copy_location(new_right, binop.right)
1384 binop.right = new_right
1385
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001386 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001387
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001388 def test_string_kind(self):
1389 c = ast.parse('"x"', mode='eval').body
1390 self.assertEqual(c.value, "x")
1391 self.assertEqual(c.kind, None)
1392
1393 c = ast.parse('u"x"', mode='eval').body
1394 self.assertEqual(c.value, "x")
1395 self.assertEqual(c.kind, "u")
1396
1397 c = ast.parse('r"x"', mode='eval').body
1398 self.assertEqual(c.value, "x")
1399 self.assertEqual(c.kind, None)
1400
1401 c = ast.parse('b"x"', mode='eval').body
1402 self.assertEqual(c.value, b"x")
1403 self.assertEqual(c.kind, None)
1404
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001405
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001406class EndPositionTests(unittest.TestCase):
1407 """Tests for end position of AST nodes.
1408
1409 Testing end positions of nodes requires a bit of extra care
1410 because of how LL parsers work.
1411 """
1412 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1413 self.assertEqual(ast_node.end_lineno, end_lineno)
1414 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1415
1416 def _check_content(self, source, ast_node, content):
1417 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1418
1419 def _parse_value(self, s):
1420 # Use duck-typing to support both single expression
1421 # and a right hand side of an assignment statement.
1422 return ast.parse(s).body[0].value
1423
1424 def test_lambda(self):
1425 s = 'lambda x, *y: None'
1426 lam = self._parse_value(s)
1427 self._check_content(s, lam.body, 'None')
1428 self._check_content(s, lam.args.args[0], 'x')
1429 self._check_content(s, lam.args.vararg, 'y')
1430
1431 def test_func_def(self):
1432 s = dedent('''
1433 def func(x: int,
1434 *args: str,
1435 z: float = 0,
1436 **kwargs: Any) -> bool:
1437 return True
1438 ''').strip()
1439 fdef = ast.parse(s).body[0]
1440 self._check_end_pos(fdef, 5, 15)
1441 self._check_content(s, fdef.body[0], 'return True')
1442 self._check_content(s, fdef.args.args[0], 'x: int')
1443 self._check_content(s, fdef.args.args[0].annotation, 'int')
1444 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1445 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1446
1447 def test_call(self):
1448 s = 'func(x, y=2, **kw)'
1449 call = self._parse_value(s)
1450 self._check_content(s, call.func, 'func')
1451 self._check_content(s, call.keywords[0].value, '2')
1452 self._check_content(s, call.keywords[1].value, 'kw')
1453
1454 def test_call_noargs(self):
1455 s = 'x[0]()'
1456 call = self._parse_value(s)
1457 self._check_content(s, call.func, 'x[0]')
1458 self._check_end_pos(call, 1, 6)
1459
1460 def test_class_def(self):
1461 s = dedent('''
1462 class C(A, B):
1463 x: int = 0
1464 ''').strip()
1465 cdef = ast.parse(s).body[0]
1466 self._check_end_pos(cdef, 2, 14)
1467 self._check_content(s, cdef.bases[1], 'B')
1468 self._check_content(s, cdef.body[0], 'x: int = 0')
1469
1470 def test_class_kw(self):
1471 s = 'class S(metaclass=abc.ABCMeta): pass'
1472 cdef = ast.parse(s).body[0]
1473 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1474
1475 def test_multi_line_str(self):
1476 s = dedent('''
1477 x = """Some multi-line text.
1478
1479 It goes on starting from same indent."""
1480 ''').strip()
1481 assign = ast.parse(s).body[0]
1482 self._check_end_pos(assign, 3, 40)
1483 self._check_end_pos(assign.value, 3, 40)
1484
1485 def test_continued_str(self):
1486 s = dedent('''
1487 x = "first part" \\
1488 "second part"
1489 ''').strip()
1490 assign = ast.parse(s).body[0]
1491 self._check_end_pos(assign, 2, 13)
1492 self._check_end_pos(assign.value, 2, 13)
1493
1494 def test_suites(self):
1495 # We intentionally put these into the same string to check
1496 # that empty lines are not part of the suite.
1497 s = dedent('''
1498 while True:
1499 pass
1500
1501 if one():
1502 x = None
1503 elif other():
1504 y = None
1505 else:
1506 z = None
1507
1508 for x, y in stuff:
1509 assert True
1510
1511 try:
1512 raise RuntimeError
1513 except TypeError as e:
1514 pass
1515
1516 pass
1517 ''').strip()
1518 mod = ast.parse(s)
1519 while_loop = mod.body[0]
1520 if_stmt = mod.body[1]
1521 for_loop = mod.body[2]
1522 try_stmt = mod.body[3]
1523 pass_stmt = mod.body[4]
1524
1525 self._check_end_pos(while_loop, 2, 8)
1526 self._check_end_pos(if_stmt, 9, 12)
1527 self._check_end_pos(for_loop, 12, 15)
1528 self._check_end_pos(try_stmt, 17, 8)
1529 self._check_end_pos(pass_stmt, 19, 4)
1530
1531 self._check_content(s, while_loop.test, 'True')
1532 self._check_content(s, if_stmt.body[0], 'x = None')
1533 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1534 self._check_content(s, for_loop.target, 'x, y')
1535 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1536 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1537
1538 def test_fstring(self):
1539 s = 'x = f"abc {x + y} abc"'
1540 fstr = self._parse_value(s)
1541 binop = fstr.values[1].value
1542 self._check_content(s, binop, 'x + y')
1543
1544 def test_fstring_multi_line(self):
1545 s = dedent('''
1546 f"""Some multi-line text.
1547 {
1548 arg_one
1549 +
1550 arg_two
1551 }
1552 It goes on..."""
1553 ''').strip()
1554 fstr = self._parse_value(s)
1555 binop = fstr.values[1].value
1556 self._check_end_pos(binop, 5, 7)
1557 self._check_content(s, binop.left, 'arg_one')
1558 self._check_content(s, binop.right, 'arg_two')
1559
1560 def test_import_from_multi_line(self):
1561 s = dedent('''
1562 from x.y.z import (
1563 a, b, c as c
1564 )
1565 ''').strip()
1566 imp = ast.parse(s).body[0]
1567 self._check_end_pos(imp, 3, 1)
1568
1569 def test_slices(self):
1570 s1 = 'f()[1, 2] [0]'
1571 s2 = 'x[ a.b: c.d]'
1572 sm = dedent('''
1573 x[ a.b: f () ,
1574 g () : c.d
1575 ]
1576 ''').strip()
1577 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1578 self._check_content(s1, i1.value, 'f()[1, 2]')
1579 self._check_content(s1, i1.value.slice.value, '1, 2')
1580 self._check_content(s2, i2.slice.lower, 'a.b')
1581 self._check_content(s2, i2.slice.upper, 'c.d')
1582 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1583 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1584 self._check_end_pos(im, 3, 3)
1585
1586 def test_binop(self):
1587 s = dedent('''
1588 (1 * 2 + (3 ) +
1589 4
1590 )
1591 ''').strip()
1592 binop = self._parse_value(s)
1593 self._check_end_pos(binop, 2, 6)
1594 self._check_content(s, binop.right, '4')
1595 self._check_content(s, binop.left, '1 * 2 + (3 )')
1596 self._check_content(s, binop.left.right, '3')
1597
1598 def test_boolop(self):
1599 s = dedent('''
1600 if (one_condition and
1601 (other_condition or yet_another_one)):
1602 pass
1603 ''').strip()
1604 bop = ast.parse(s).body[0].test
1605 self._check_end_pos(bop, 2, 44)
1606 self._check_content(s, bop.values[1],
1607 'other_condition or yet_another_one')
1608
1609 def test_tuples(self):
1610 s1 = 'x = () ;'
1611 s2 = 'x = 1 , ;'
1612 s3 = 'x = (1 , 2 ) ;'
1613 sm = dedent('''
1614 x = (
1615 a, b,
1616 )
1617 ''').strip()
1618 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1619 self._check_content(s1, t1, '()')
1620 self._check_content(s2, t2, '1 ,')
1621 self._check_content(s3, t3, '(1 , 2 )')
1622 self._check_end_pos(tm, 3, 1)
1623
1624 def test_attribute_spaces(self):
1625 s = 'func(x. y .z)'
1626 call = self._parse_value(s)
1627 self._check_content(s, call, s)
1628 self._check_content(s, call.args[0], 'x. y .z')
1629
1630 def test_displays(self):
1631 s1 = '[{}, {1, }, {1, 2,} ]'
1632 s2 = '{a: b, f (): g () ,}'
1633 c1 = self._parse_value(s1)
1634 c2 = self._parse_value(s2)
1635 self._check_content(s1, c1.elts[0], '{}')
1636 self._check_content(s1, c1.elts[1], '{1, }')
1637 self._check_content(s1, c1.elts[2], '{1, 2,}')
1638 self._check_content(s2, c2.keys[1], 'f ()')
1639 self._check_content(s2, c2.values[1], 'g ()')
1640
1641 def test_comprehensions(self):
1642 s = dedent('''
1643 x = [{x for x, y in stuff
1644 if cond.x} for stuff in things]
1645 ''').strip()
1646 cmp = self._parse_value(s)
1647 self._check_end_pos(cmp, 2, 37)
1648 self._check_content(s, cmp.generators[0].iter, 'things')
1649 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1650 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1651 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1652
1653 def test_yield_await(self):
1654 s = dedent('''
1655 async def f():
1656 yield x
1657 await y
1658 ''').strip()
1659 fdef = ast.parse(s).body[0]
1660 self._check_content(s, fdef.body[0].value, 'yield x')
1661 self._check_content(s, fdef.body[1].value, 'await y')
1662
1663 def test_source_segment_multi(self):
1664 s_orig = dedent('''
1665 x = (
1666 a, b,
1667 ) + ()
1668 ''').strip()
1669 s_tuple = dedent('''
1670 (
1671 a, b,
1672 )
1673 ''').strip()
1674 binop = self._parse_value(s_orig)
1675 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1676
1677 def test_source_segment_padded(self):
1678 s_orig = dedent('''
1679 class C:
1680 def fun(self) -> None:
1681 "ЖЖЖЖЖ"
1682 ''').strip()
1683 s_method = ' def fun(self) -> None:\n' \
1684 ' "ЖЖЖЖЖ"'
1685 cdef = ast.parse(s_orig).body[0]
1686 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1687 s_method)
1688
1689 def test_source_segment_endings(self):
1690 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1691 v, w, x, y, z = ast.parse(s).body
1692 self._check_content(s, v, 'v = 1')
1693 self._check_content(s, w, 'w = 1')
1694 self._check_content(s, x, 'x = 1')
1695 self._check_content(s, y, 'y = 1')
1696 self._check_content(s, z, 'z = 1')
1697
1698 def test_source_segment_tabs(self):
1699 s = dedent('''
1700 class C:
1701 \t\f def fun(self) -> None:
1702 \t\f pass
1703 ''').strip()
1704 s_method = ' \t\f def fun(self) -> None:\n' \
1705 ' \t\f pass'
1706
1707 cdef = ast.parse(s).body[0]
1708 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1709
1710
Miss Islington (bot)522a3942019-08-26 00:43:33 -07001711class NodeVisitorTests(unittest.TestCase):
1712 def test_old_constant_nodes(self):
1713 class Visitor(ast.NodeVisitor):
1714 def visit_Num(self, node):
1715 log.append((node.lineno, 'Num', node.n))
1716 def visit_Str(self, node):
1717 log.append((node.lineno, 'Str', node.s))
1718 def visit_Bytes(self, node):
1719 log.append((node.lineno, 'Bytes', node.s))
1720 def visit_NameConstant(self, node):
1721 log.append((node.lineno, 'NameConstant', node.value))
1722 def visit_Ellipsis(self, node):
1723 log.append((node.lineno, 'Ellipsis', ...))
1724 mod = ast.parse(dedent('''\
1725 i = 42
1726 f = 4.25
1727 c = 4.25j
1728 s = 'string'
1729 b = b'bytes'
1730 t = True
1731 n = None
1732 e = ...
1733 '''))
1734 visitor = Visitor()
1735 log = []
1736 with warnings.catch_warnings(record=True) as wlog:
1737 warnings.filterwarnings('always', '', PendingDeprecationWarning)
1738 visitor.visit(mod)
1739 self.assertEqual(log, [
1740 (1, 'Num', 42),
1741 (2, 'Num', 4.25),
1742 (3, 'Num', 4.25j),
1743 (4, 'Str', 'string'),
1744 (5, 'Bytes', b'bytes'),
1745 (6, 'NameConstant', True),
1746 (7, 'NameConstant', None),
1747 (8, 'Ellipsis', ...),
1748 ])
1749 self.assertEqual([str(w.message) for w in wlog], [
1750 'visit_Num is deprecated; add visit_Constant',
1751 'visit_Num is deprecated; add visit_Constant',
1752 'visit_Num is deprecated; add visit_Constant',
1753 'visit_Str is deprecated; add visit_Constant',
1754 'visit_Bytes is deprecated; add visit_Constant',
1755 'visit_NameConstant is deprecated; add visit_Constant',
1756 'visit_NameConstant is deprecated; add visit_Constant',
1757 'visit_Ellipsis is deprecated; add visit_Constant',
1758 ])
1759
1760
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001761def main():
1762 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001763 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001764 if sys.argv[1:] == ['-g']:
1765 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1766 (eval_tests, "eval")):
1767 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001768 for statement in statements:
1769 tree = ast.parse(statement, "?", kind)
1770 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001771 print("]")
1772 print("main()")
1773 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001774 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001775
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001776#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001777exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001778('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1779('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001780('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1781('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001782('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1783('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 +01001784('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1785('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001786('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 -08001787('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001788('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001789('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001790('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 -08001791('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001792('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001793('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1794('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1795('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 -07001796('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001797('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1798('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1799('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
Miss Islington (bot)3b18b172019-12-13 08:21:54 -08001800('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []),
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -08001801('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001802('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1803('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 -07001804('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 -08001805('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1806('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1807('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1808('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1809('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1810('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001811('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001812('Module', [('Pass', (1, 0))], []),
1813('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1814('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1815('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)], []),
1816('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)], []),
1817('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)], []),
1818('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)]))], []),
1819('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)]))], []),
1820('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)]))], []),
1821('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)]))], []),
1822('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 +01001823('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)], []),
1824('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)], []),
1825('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 -07001826('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)]))], []),
1827('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 +01001828('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)], []),
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -07001829('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
1830('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
1831('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001832('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 +00001833('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001834('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1835('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)], []),
1836('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)], []),
1837('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)], []),
1838('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1839('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)], []),
1840('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)], []),
1841('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)], []),
1842('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)], []),
1843('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 +00001844]
1845single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001846('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 +00001847]
1848eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001849('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001850('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1851('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1852('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001853('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001854('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001855('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001856('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1857('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001858('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)])),
1859('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)])),
1860('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)])),
1861('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)])),
1862('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)])),
1863('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)])),
1864('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)])),
1865('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)])),
1866('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)])),
1867('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)])),
1868('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 -07001869('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1870('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 +02001871('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 -07001872('Expression', ('Constant', (1, 0), 10, None)),
1873('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001874('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1875('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 +00001876('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001877('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 -05001878('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001879('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1880('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 -05001881('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001882('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 +00001883]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001884main()