blob: 955bc0d4ea88a039fd8a447919dedf9129006bff [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
2import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003import os
4import sys
5import unittest
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03006import warnings
Benjamin Peterson9ed37432012-07-08 11:13:36 -07007import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07009
10from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000011
12def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000013 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000014 return t
15 elif isinstance(t, list):
16 return [to_tuple(e) for e in t]
17 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000018 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
19 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000020 if t._fields is None:
21 return tuple(result)
22 for f in t._fields:
23 result.append(to_tuple(getattr(t, f)))
24 return tuple(result)
25
Neal Norwitzee9b10a2008-03-31 05:29:39 +000026
Tim Peters400cbc32006-02-28 18:44:41 +000027# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030028# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000029exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050030 # None
31 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090032 # Module docstring
33 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000034 # FunctionDef
35 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090036 # FunctionDef with docstring
37 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050038 # FunctionDef with arg
39 "def f(a): pass",
40 # FunctionDef with arg and default value
41 "def f(a=0): pass",
42 # FunctionDef with varargs
43 "def f(*args): pass",
44 # FunctionDef with kwargs
45 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090046 # FunctionDef with all kind of args and docstring
47 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000048 # ClassDef
49 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090050 # ClassDef with docstring
51 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050052 # ClassDef, new style class
53 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000054 # Return
55 "def f():return 1",
56 # Delete
57 "del v",
58 # Assign
59 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020060 "a,b = c",
61 "(a,b) = c",
62 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000063 # AugAssign
64 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000065 # For
66 "for v in v:pass",
67 # While
68 "while v:pass",
69 # If
70 "if v:pass",
Lysandros Nikolaou025a6022019-12-12 22:40:21 +010071 # If-Elif
72 "if a:\n pass\nelif b:\n pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050073 # With
74 "with x as y: pass",
75 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000076 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000077 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000078 # TryExcept
79 "try:\n pass\nexcept Exception:\n pass",
80 # TryFinally
81 "try:\n pass\nfinally:\n pass",
82 # Assert
83 "assert v",
84 # Import
85 "import sys",
86 # ImportFrom
87 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000088 # Global
89 "global v",
90 # Expr
91 "1",
92 # Pass,
93 "pass",
94 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040095 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000096 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040097 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000098 # for statements with naked tuples (see http://bugs.python.org/issue6704)
99 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200100 "for (a,b) in c: pass",
101 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500102 # Multiline generator expression (test for .lineno & .col_offset)
103 """(
104 (
105 Aa
106 ,
107 Bb
108 )
109 for
110 Aa
111 ,
112 Bb in Cc
113 )""",
114 # dictcomp
115 "{a : b for w in x for m in p if g}",
116 # dictcomp with naked tuple
117 "{a : b for v,w in x}",
118 # setcomp
119 "{r for l in x if g}",
120 # setcomp with naked tuple
121 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400122 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900123 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400124 # AsyncFor
125 "async def f():\n async for e in i: 1\n else: 2",
126 # AsyncWith
127 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400128 # PEP 448: Additional Unpacking Generalizations
129 "{**{1:2}, 2:3}",
130 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700131 # Asynchronous comprehensions
132 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200133 # Decorated FunctionDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300134 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200135 # Decorated AsyncFunctionDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300136 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200137 # Decorated ClassDef
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +0300138 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200139 # Decorator with generator argument
140 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000141 # Simple assignment expression
142 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100143 # Positional-only arguments
144 "def f(a, /,): pass",
145 "def f(a, /, c, d, e): pass",
146 "def f(a, /, c, *, d, e): pass",
147 "def f(a, /, c, *, d, e, **kwargs): pass",
148 # Positional-only arguments with defaults
149 "def f(a=1, /,): pass",
150 "def f(a=1, /, b=2, c=4): pass",
151 "def f(a=1, /, b=2, *, c=4): pass",
152 "def f(a=1, /, b=2, *, c): pass",
153 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
154 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000155
Tim Peters400cbc32006-02-28 18:44:41 +0000156]
157
158# These are compiled through "single"
159# because of overlap with "eval", it just tests what
160# can't be tested with "eval"
161single_tests = [
162 "1+2"
163]
164
165# These are compiled through "eval"
166# It should test all expressions
167eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500168 # None
169 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000170 # BoolOp
171 "a and b",
172 # BinOp
173 "a + b",
174 # UnaryOp
175 "not v",
176 # Lambda
177 "lambda:None",
178 # Dict
179 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500180 # Empty dict
181 "{}",
182 # Set
183 "{None,}",
184 # Multiline dict (test for .lineno & .col_offset)
185 """{
186 1
187 :
188 2
189 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000190 # ListComp
191 "[a for b in c if d]",
192 # GeneratorExp
193 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200194 # Comprehensions with multiple for targets
195 "[(a,b) for a,b in c]",
196 "[(a,b) for (a,b) in c]",
197 "[(a,b) for [a,b] in c]",
198 "{(a,b) for a,b in c}",
199 "{(a,b) for (a,b) in c}",
200 "{(a,b) for [a,b] in c}",
201 "((a,b) for a,b in c)",
202 "((a,b) for (a,b) in c)",
203 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000204 # Yield - yield expressions can't work outside a function
205 #
206 # Compare
207 "1 < 2 < 3",
208 # Call
209 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200210 # Call with a generator argument
211 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000212 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000213 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000214 # Str
215 "'string'",
216 # Attribute
217 "a.b",
218 # Subscript
219 "a[b:c]",
220 # Name
221 "v",
222 # List
223 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500224 # Empty list
225 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000226 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000227 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500228 # Tuple
229 "(1,2,3)",
230 # Empty tuple
231 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000232 # Combination
233 "a.b.c.d(a.b[1:2])",
234
Tim Peters400cbc32006-02-28 18:44:41 +0000235]
236
237# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
238# excepthandler, arguments, keywords, alias
239
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000240class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000241
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500242 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000243 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000244 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000245 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000246 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200247 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000248 parent_pos = (ast_node.lineno, ast_node.col_offset)
249 for name in ast_node._fields:
250 value = getattr(ast_node, name)
251 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200252 first_pos = parent_pos
253 if value and name == 'decorator_list':
254 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000255 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200256 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000257 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500258 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000259
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500260 def test_AST_objects(self):
261 x = ast.AST()
262 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700263 x.foobar = 42
264 self.assertEqual(x.foobar, 42)
265 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500266
267 with self.assertRaises(AttributeError):
268 x.vararg
269
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500270 with self.assertRaises(TypeError):
271 # "_ast.AST constructor takes 0 positional arguments"
272 ast.AST(2)
273
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700274 def test_AST_garbage_collection(self):
275 class X:
276 pass
277 a = ast.AST()
278 a.x = X()
279 a.x.a = a
280 ref = weakref.ref(a.x)
281 del a
282 support.gc_collect()
283 self.assertIsNone(ref())
284
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000285 def test_snippets(self):
286 for input, output, kind in ((exec_tests, exec_results, "exec"),
287 (single_tests, single_results, "single"),
288 (eval_tests, eval_results, "eval")):
289 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400290 with self.subTest(action="parsing", input=i):
291 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
292 self.assertEqual(to_tuple(ast_tree), o)
293 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100294 with self.subTest(action="compiling", input=i, kind=kind):
295 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000296
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000297 def test_ast_validation(self):
298 # compile() is the only function that calls PyAST_Validate
299 snippets_to_validate = exec_tests + single_tests + eval_tests
300 for snippet in snippets_to_validate:
301 tree = ast.parse(snippet)
302 compile(tree, '<string>', 'exec')
303
Benjamin Peterson78565b22009-06-28 19:19:51 +0000304 def test_slice(self):
305 slc = ast.parse("x[::]").body[0].value.slice
306 self.assertIsNone(slc.upper)
307 self.assertIsNone(slc.lower)
308 self.assertIsNone(slc.step)
309
310 def test_from_import(self):
311 im = ast.parse("from . import y").body[0]
312 self.assertIsNone(im.module)
313
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400314 def test_non_interned_future_from_ast(self):
315 mod = ast.parse("from __future__ import division")
316 self.assertIsInstance(mod.body[0], ast.ImportFrom)
317 mod.body[0].module = " __future__ ".strip()
318 compile(mod, "<test>", "exec")
319
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000320 def test_base_classes(self):
321 self.assertTrue(issubclass(ast.For, ast.stmt))
322 self.assertTrue(issubclass(ast.Name, ast.expr))
323 self.assertTrue(issubclass(ast.stmt, ast.AST))
324 self.assertTrue(issubclass(ast.expr, ast.AST))
325 self.assertTrue(issubclass(ast.comprehension, ast.AST))
326 self.assertTrue(issubclass(ast.Gt, ast.AST))
327
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500328 def test_field_attr_existence(self):
329 for name, item in ast.__dict__.items():
330 if isinstance(item, type) and name != 'AST' and name[0].isupper():
331 x = item()
332 if isinstance(x, ast.AST):
333 self.assertEqual(type(x._fields), tuple)
334
335 def test_arguments(self):
336 x = ast.arguments()
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200337 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
338 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500339
340 with self.assertRaises(AttributeError):
341 x.vararg
342
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100343 x = ast.arguments(*range(1, 8))
344 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500345
346 def test_field_attr_writable(self):
347 x = ast.Num()
348 # We can assign to _fields
349 x._fields = 666
350 self.assertEqual(x._fields, 666)
351
352 def test_classattrs(self):
353 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700354 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300355
356 with self.assertRaises(AttributeError):
357 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500358
359 with self.assertRaises(AttributeError):
360 x.n
361
362 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300363 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500364 self.assertEqual(x.n, 42)
365
366 with self.assertRaises(AttributeError):
367 x.lineno
368
369 with self.assertRaises(AttributeError):
370 x.foobar
371
372 x = ast.Num(lineno=2)
373 self.assertEqual(x.lineno, 2)
374
375 x = ast.Num(42, lineno=0)
376 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700377 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300378 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500379 self.assertEqual(x.n, 42)
380
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700381 self.assertRaises(TypeError, ast.Num, 1, None, 2)
382 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500383
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300384 self.assertEqual(ast.Num(42).n, 42)
385 self.assertEqual(ast.Num(4.25).n, 4.25)
386 self.assertEqual(ast.Num(4.25j).n, 4.25j)
387 self.assertEqual(ast.Str('42').s, '42')
388 self.assertEqual(ast.Bytes(b'42').s, b'42')
389 self.assertIs(ast.NameConstant(True).value, True)
390 self.assertIs(ast.NameConstant(False).value, False)
391 self.assertIs(ast.NameConstant(None).value, None)
392
393 self.assertEqual(ast.Constant(42).value, 42)
394 self.assertEqual(ast.Constant(4.25).value, 4.25)
395 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
396 self.assertEqual(ast.Constant('42').value, '42')
397 self.assertEqual(ast.Constant(b'42').value, b'42')
398 self.assertIs(ast.Constant(True).value, True)
399 self.assertIs(ast.Constant(False).value, False)
400 self.assertIs(ast.Constant(None).value, None)
401 self.assertIs(ast.Constant(...).value, ...)
402
403 def test_realtype(self):
404 self.assertEqual(type(ast.Num(42)), ast.Constant)
405 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
406 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
407 self.assertEqual(type(ast.Str('42')), ast.Constant)
408 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
409 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
410 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
411 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
412 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
413
414 def test_isinstance(self):
415 self.assertTrue(isinstance(ast.Num(42), ast.Num))
416 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
417 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
418 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
419 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
420 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
421 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
422 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
423 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
424
425 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
426 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
427 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
428 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
429 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
430 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
431 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
432 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
433 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
434
435 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
436 self.assertFalse(isinstance(ast.Num(42), ast.Str))
437 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
438 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
439 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800440 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
441 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300442
443 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
444 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
445 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
446 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
447 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800448 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
449 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300450
451 self.assertFalse(isinstance(ast.Constant(), ast.Num))
452 self.assertFalse(isinstance(ast.Constant(), ast.Str))
453 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
454 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
455 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
456
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200457 class S(str): pass
458 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
459 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
460
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300461 def test_subclasses(self):
462 class N(ast.Num):
463 def __init__(self, *args, **kwargs):
464 super().__init__(*args, **kwargs)
465 self.z = 'spam'
466 class N2(ast.Num):
467 pass
468
469 n = N(42)
470 self.assertEqual(n.n, 42)
471 self.assertEqual(n.z, 'spam')
472 self.assertEqual(type(n), N)
473 self.assertTrue(isinstance(n, N))
474 self.assertTrue(isinstance(n, ast.Num))
475 self.assertFalse(isinstance(n, N2))
476 self.assertFalse(isinstance(ast.Num(42), N))
477 n = N(n=42)
478 self.assertEqual(n.n, 42)
479 self.assertEqual(type(n), N)
480
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500481 def test_module(self):
482 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800483 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500484 self.assertEqual(x.body, body)
485
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000486 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100487 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500488 x = ast.BinOp()
489 self.assertEqual(x._fields, ('left', 'op', 'right'))
490
491 # Random attribute allowed too
492 x.foobarbaz = 5
493 self.assertEqual(x.foobarbaz, 5)
494
495 n1 = ast.Num(1)
496 n3 = ast.Num(3)
497 addop = ast.Add()
498 x = ast.BinOp(n1, addop, n3)
499 self.assertEqual(x.left, n1)
500 self.assertEqual(x.op, addop)
501 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500502
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500503 x = ast.BinOp(1, 2, 3)
504 self.assertEqual(x.left, 1)
505 self.assertEqual(x.op, 2)
506 self.assertEqual(x.right, 3)
507
Georg Brandl0c77a822008-06-10 16:37:50 +0000508 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000509 self.assertEqual(x.left, 1)
510 self.assertEqual(x.op, 2)
511 self.assertEqual(x.right, 3)
512 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000513
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500514 # node raises exception when given too many arguments
515 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
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, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000518
519 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000520 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000521 self.assertEqual(x.left, 1)
522 self.assertEqual(x.op, 2)
523 self.assertEqual(x.right, 3)
524 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000525
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500526 # Random kwargs also allowed
527 x = ast.BinOp(1, 2, 3, foobarbaz=42)
528 self.assertEqual(x.foobarbaz, 42)
529
530 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000531 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000532 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500533 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000534
535 def test_pickling(self):
536 import pickle
537 mods = [pickle]
538 try:
539 import cPickle
540 mods.append(cPickle)
541 except ImportError:
542 pass
543 protocols = [0, 1, 2]
544 for mod in mods:
545 for protocol in protocols:
546 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
547 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000548 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000549
Benjamin Peterson5b066812010-11-20 01:38:49 +0000550 def test_invalid_sum(self):
551 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800552 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000553 with self.assertRaises(TypeError) as cm:
554 compile(m, "<test>", "exec")
555 self.assertIn("but got <_ast.expr", str(cm.exception))
556
Min ho Kimc4cacc82019-07-31 08:16:13 +1000557 def test_invalid_identifier(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800558 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500559 ast.fix_missing_locations(m)
560 with self.assertRaises(TypeError) as cm:
561 compile(m, "<test>", "exec")
562 self.assertIn("identifier must be of type str", str(cm.exception))
563
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000564 def test_empty_yield_from(self):
565 # Issue 16546: yield from value is not optional.
566 empty_yield_from = ast.parse("def f():\n yield from g()")
567 empty_yield_from.body[0].body[0].value.value = None
568 with self.assertRaises(ValueError) as cm:
569 compile(empty_yield_from, "<test>", "exec")
570 self.assertIn("field value is required", str(cm.exception))
571
Oren Milman7dc46d82017-09-30 20:16:24 +0300572 @support.cpython_only
573 def test_issue31592(self):
574 # There shouldn't be an assertion failure in case of a bad
575 # unicodedata.normalize().
576 import unicodedata
577 def bad_normalize(*args):
578 return None
579 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
580 self.assertRaises(TypeError, ast.parse, '\u03D5')
581
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200582 def test_issue18374_binop_col_offset(self):
583 tree = ast.parse('4+5+6+7')
584 parent_binop = tree.body[0].value
585 child_binop = parent_binop.left
586 grandchild_binop = child_binop.left
587 self.assertEqual(parent_binop.col_offset, 0)
588 self.assertEqual(parent_binop.end_col_offset, 7)
589 self.assertEqual(child_binop.col_offset, 0)
590 self.assertEqual(child_binop.end_col_offset, 5)
591 self.assertEqual(grandchild_binop.col_offset, 0)
592 self.assertEqual(grandchild_binop.end_col_offset, 3)
593
594 tree = ast.parse('4+5-\\\n 6-7')
595 parent_binop = tree.body[0].value
596 child_binop = parent_binop.left
597 grandchild_binop = child_binop.left
598 self.assertEqual(parent_binop.col_offset, 0)
599 self.assertEqual(parent_binop.lineno, 1)
600 self.assertEqual(parent_binop.end_col_offset, 4)
601 self.assertEqual(parent_binop.end_lineno, 2)
602
603 self.assertEqual(child_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200604 self.assertEqual(child_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200605 self.assertEqual(child_binop.end_col_offset, 2)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200606 self.assertEqual(child_binop.end_lineno, 2)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200607
608 self.assertEqual(grandchild_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200609 self.assertEqual(grandchild_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200610 self.assertEqual(grandchild_binop.end_col_offset, 3)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200611 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000612
613class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700614 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000615
616 def test_parse(self):
617 a = ast.parse('foo(1 + 1)')
618 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
619 self.assertEqual(ast.dump(a), ast.dump(b))
620
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400621 def test_parse_in_error(self):
622 try:
623 1/0
624 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400625 with self.assertRaises(SyntaxError) as e:
626 ast.literal_eval(r"'\U'")
627 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400628
Georg Brandl0c77a822008-06-10 16:37:50 +0000629 def test_dump(self):
630 node = ast.parse('spam(eggs, "and cheese")')
631 self.assertEqual(ast.dump(node),
632 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700633 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800634 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000635 )
636 self.assertEqual(ast.dump(node, annotate_fields=False),
637 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700638 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000639 )
640 self.assertEqual(ast.dump(node, include_attributes=True),
641 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000642 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
643 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700644 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000645 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
646 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800647 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000648 )
649
Serhiy Storchaka850573b2019-09-09 19:33:13 +0300650 def test_dump_indent(self):
651 node = ast.parse('spam(eggs, "and cheese")')
652 self.assertEqual(ast.dump(node, indent=3), """\
653Module(
654 body=[
655 Expr(
656 value=Call(
657 func=Name(id='spam', ctx=Load()),
658 args=[
659 Name(id='eggs', ctx=Load()),
660 Constant(value='and cheese', kind=None)],
661 keywords=[]))],
662 type_ignores=[])""")
663 self.assertEqual(ast.dump(node, annotate_fields=False, indent='\t'), """\
664Module(
665\t[
666\t\tExpr(
667\t\t\tCall(
668\t\t\t\tName('spam', Load()),
669\t\t\t\t[
670\t\t\t\t\tName('eggs', Load()),
671\t\t\t\t\tConstant('and cheese', None)],
672\t\t\t\t[]))],
673\t[])""")
674 self.assertEqual(ast.dump(node, include_attributes=True, indent=3), """\
675Module(
676 body=[
677 Expr(
678 value=Call(
679 func=Name(
680 id='spam',
681 ctx=Load(),
682 lineno=1,
683 col_offset=0,
684 end_lineno=1,
685 end_col_offset=4),
686 args=[
687 Name(
688 id='eggs',
689 ctx=Load(),
690 lineno=1,
691 col_offset=5,
692 end_lineno=1,
693 end_col_offset=9),
694 Constant(
695 value='and cheese',
696 kind=None,
697 lineno=1,
698 col_offset=11,
699 end_lineno=1,
700 end_col_offset=23)],
701 keywords=[],
702 lineno=1,
703 col_offset=0,
704 end_lineno=1,
705 end_col_offset=24),
706 lineno=1,
707 col_offset=0,
708 end_lineno=1,
709 end_col_offset=24)],
710 type_ignores=[])""")
711
Serhiy Storchakae64f9482019-08-29 09:30:23 +0300712 def test_dump_incomplete(self):
713 node = ast.Raise(lineno=3, col_offset=4)
714 self.assertEqual(ast.dump(node),
715 "Raise()"
716 )
717 self.assertEqual(ast.dump(node, include_attributes=True),
718 "Raise(lineno=3, col_offset=4)"
719 )
720 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
721 self.assertEqual(ast.dump(node),
722 "Raise(exc=Name(id='e', ctx=Load()))"
723 )
724 self.assertEqual(ast.dump(node, annotate_fields=False),
725 "Raise(Name('e', Load()))"
726 )
727 self.assertEqual(ast.dump(node, include_attributes=True),
728 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
729 )
730 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
731 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
732 )
733 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
734 self.assertEqual(ast.dump(node),
735 "Raise(cause=Name(id='e', ctx=Load()))"
736 )
737 self.assertEqual(ast.dump(node, annotate_fields=False),
738 "Raise(cause=Name('e', Load()))"
739 )
740
Georg Brandl0c77a822008-06-10 16:37:50 +0000741 def test_copy_location(self):
742 src = ast.parse('1 + 1', mode='eval')
743 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
744 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700745 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000746 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
747 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
748 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000749 )
750
751 def test_fix_missing_locations(self):
752 src = ast.parse('write("spam")')
753 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400754 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000755 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000756 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000757 self.assertEqual(ast.dump(src, include_attributes=True),
758 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000759 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700760 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000761 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
762 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
763 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
764 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
765 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
766 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800767 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
768 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000769 )
770
771 def test_increment_lineno(self):
772 src = ast.parse('1 + 1', mode='eval')
773 self.assertEqual(ast.increment_lineno(src, n=3), src)
774 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700775 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
776 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000777 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
778 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000779 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000780 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000781 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000782 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
783 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700784 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
785 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000786 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
787 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000788 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000789
790 def test_iter_fields(self):
791 node = ast.parse('foo()', mode='eval')
792 d = dict(ast.iter_fields(node.body))
793 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400794 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000795
796 def test_iter_child_nodes(self):
797 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
798 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
799 iterator = ast.iter_child_nodes(node.body)
800 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300801 self.assertEqual(next(iterator).value, 23)
802 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000803 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700804 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000805 )
806
807 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300808 node = ast.parse('"""line one\n line two"""')
809 self.assertEqual(ast.get_docstring(node),
810 'line one\nline two')
811
812 node = ast.parse('class foo:\n """line one\n line two"""')
813 self.assertEqual(ast.get_docstring(node.body[0]),
814 'line one\nline two')
815
Georg Brandl0c77a822008-06-10 16:37:50 +0000816 node = ast.parse('def foo():\n """line one\n line two"""')
817 self.assertEqual(ast.get_docstring(node.body[0]),
818 'line one\nline two')
819
Yury Selivanov2f07a662015-07-23 08:54:35 +0300820 node = ast.parse('async def foo():\n """spam\n ham"""')
821 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300822
823 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800824 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300825 node = ast.parse('x = "not docstring"')
826 self.assertIsNone(ast.get_docstring(node))
827 node = ast.parse('def foo():\n pass')
828 self.assertIsNone(ast.get_docstring(node))
829
830 node = ast.parse('class foo:\n pass')
831 self.assertIsNone(ast.get_docstring(node.body[0]))
832 node = ast.parse('class foo:\n x = "not docstring"')
833 self.assertIsNone(ast.get_docstring(node.body[0]))
834 node = ast.parse('class foo:\n def bar(self): pass')
835 self.assertIsNone(ast.get_docstring(node.body[0]))
836
837 node = ast.parse('def foo():\n pass')
838 self.assertIsNone(ast.get_docstring(node.body[0]))
839 node = ast.parse('def foo():\n x = "not docstring"')
840 self.assertIsNone(ast.get_docstring(node.body[0]))
841
842 node = ast.parse('async def foo():\n pass')
843 self.assertIsNone(ast.get_docstring(node.body[0]))
844 node = ast.parse('async def foo():\n x = "not docstring"')
845 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300846
Anthony Sottile995d9b92019-01-12 20:05:13 -0800847 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
848 node = ast.parse(
849 '"""line one\nline two"""\n\n'
850 'def foo():\n """line one\n line two"""\n\n'
851 ' def bar():\n """line one\n line two"""\n'
852 ' """line one\n line two"""\n'
853 '"""line one\nline two"""\n\n'
854 )
855 self.assertEqual(node.body[0].col_offset, 0)
856 self.assertEqual(node.body[0].lineno, 1)
857 self.assertEqual(node.body[1].body[0].col_offset, 2)
858 self.assertEqual(node.body[1].body[0].lineno, 5)
859 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
860 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
861 self.assertEqual(node.body[1].body[2].col_offset, 2)
862 self.assertEqual(node.body[1].body[2].lineno, 11)
863 self.assertEqual(node.body[2].col_offset, 0)
864 self.assertEqual(node.body[2].lineno, 13)
865
Lysandros Nikolaou025a6022019-12-12 22:40:21 +0100866 def test_elif_stmt_start_position(self):
867 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
868 elif_stmt = node.body[0].orelse[0]
869 self.assertEqual(elif_stmt.lineno, 3)
870 self.assertEqual(elif_stmt.col_offset, 0)
871
Georg Brandl0c77a822008-06-10 16:37:50 +0000872 def test_literal_eval(self):
873 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
874 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
875 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000876 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000877 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000878 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200879 self.assertEqual(ast.literal_eval('6'), 6)
880 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000881 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000882 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200883 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
884 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
885 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
886 self.assertRaises(ValueError, ast.literal_eval, '++6')
887 self.assertRaises(ValueError, ast.literal_eval, '+True')
888 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000889
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200890 def test_literal_eval_complex(self):
891 # Issue #4907
892 self.assertEqual(ast.literal_eval('6j'), 6j)
893 self.assertEqual(ast.literal_eval('-6j'), -6j)
894 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
895 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
896 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
897 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
898 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
899 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
900 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
901 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
902 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
903 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
904 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
905 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
906 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
907 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
908 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
909 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000910
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100911 def test_bad_integer(self):
912 # issue13436: Bad error message with invalid numeric values
913 body = [ast.ImportFrom(module='time',
914 names=[ast.alias(name='sleep')],
915 level=None,
916 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800917 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100918 with self.assertRaises(ValueError) as cm:
919 compile(mod, 'test', 'exec')
920 self.assertIn("invalid integer value: None", str(cm.exception))
921
Berker Peksag0a5bd512016-04-29 19:50:02 +0300922 def test_level_as_none(self):
923 body = [ast.ImportFrom(module='time',
924 names=[ast.alias(name='sleep')],
925 level=None,
926 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800927 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300928 code = compile(mod, 'test', 'exec')
929 ns = {}
930 exec(code, ns)
931 self.assertIn('sleep', ns)
932
Georg Brandl0c77a822008-06-10 16:37:50 +0000933
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500934class ASTValidatorTests(unittest.TestCase):
935
936 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
937 mod.lineno = mod.col_offset = 0
938 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300939 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500940 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300941 else:
942 with self.assertRaises(exc) as cm:
943 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500944 self.assertIn(msg, str(cm.exception))
945
946 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800947 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500948 self.mod(mod, msg, exc=exc)
949
950 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800951 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500952 self.mod(mod, msg)
953
954 def test_module(self):
955 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
956 self.mod(m, "must have Load context", "single")
957 m = ast.Expression(ast.Name("x", ast.Store()))
958 self.mod(m, "must have Load context", "eval")
959
960 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100961 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700962 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500963 defaults=None, kw_defaults=None):
964 if args is None:
965 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100966 if posonlyargs is None:
967 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500968 if kwonlyargs is None:
969 kwonlyargs = []
970 if defaults is None:
971 defaults = []
972 if kw_defaults is None:
973 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100974 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
975 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500976 return fac(args)
977 args = [ast.arg("x", ast.Name("x", ast.Store()))]
978 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100979 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500980 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500981 check(arguments(defaults=[ast.Num(3)]),
982 "more positional defaults than args")
983 check(arguments(kw_defaults=[ast.Num(4)]),
984 "length of kwonlyargs is not the same as kw_defaults")
985 args = [ast.arg("x", ast.Name("x", ast.Load()))]
986 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
987 "must have Load context")
988 args = [ast.arg("a", ast.Name("x", ast.Load())),
989 ast.arg("b", ast.Name("y", ast.Load()))]
990 check(arguments(kwonlyargs=args,
991 kw_defaults=[None, ast.Name("x", ast.Store())]),
992 "must have Load context")
993
994 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100995 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300996 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500997 self.stmt(f, "empty body on FunctionDef")
998 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300999 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001000 self.stmt(f, "must have Load context")
1001 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001002 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001003 self.stmt(f, "must have Load context")
1004 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001005 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001006 self._check_arguments(fac, self.stmt)
1007
1008 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001009 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001010 if bases is None:
1011 bases = []
1012 if keywords is None:
1013 keywords = []
1014 if body is None:
1015 body = [ast.Pass()]
1016 if decorator_list is None:
1017 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001018 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001019 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001020 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1021 "must have Load context")
1022 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1023 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001024 self.stmt(cls(body=[]), "empty body on ClassDef")
1025 self.stmt(cls(body=[None]), "None disallowed")
1026 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1027 "must have Load context")
1028
1029 def test_delete(self):
1030 self.stmt(ast.Delete([]), "empty targets on Delete")
1031 self.stmt(ast.Delete([None]), "None disallowed")
1032 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1033 "must have Del context")
1034
1035 def test_assign(self):
1036 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1037 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1038 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1039 "must have Store context")
1040 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1041 ast.Name("y", ast.Store())),
1042 "must have Load context")
1043
1044 def test_augassign(self):
1045 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1046 ast.Name("y", ast.Load()))
1047 self.stmt(aug, "must have Store context")
1048 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1049 ast.Name("y", ast.Store()))
1050 self.stmt(aug, "must have Load context")
1051
1052 def test_for(self):
1053 x = ast.Name("x", ast.Store())
1054 y = ast.Name("y", ast.Load())
1055 p = ast.Pass()
1056 self.stmt(ast.For(x, y, [], []), "empty body on For")
1057 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1058 "must have Store context")
1059 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1060 "must have Load context")
1061 e = ast.Expr(ast.Name("x", ast.Store()))
1062 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1063 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1064
1065 def test_while(self):
1066 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1067 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1068 "must have Load context")
1069 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1070 [ast.Expr(ast.Name("x", ast.Store()))]),
1071 "must have Load context")
1072
1073 def test_if(self):
1074 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1075 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1076 self.stmt(i, "must have Load context")
1077 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1078 self.stmt(i, "must have Load context")
1079 i = ast.If(ast.Num(3), [ast.Pass()],
1080 [ast.Expr(ast.Name("x", ast.Store()))])
1081 self.stmt(i, "must have Load context")
1082
1083 def test_with(self):
1084 p = ast.Pass()
1085 self.stmt(ast.With([], [p]), "empty items on With")
1086 i = ast.withitem(ast.Num(3), None)
1087 self.stmt(ast.With([i], []), "empty body on With")
1088 i = ast.withitem(ast.Name("x", ast.Store()), None)
1089 self.stmt(ast.With([i], [p]), "must have Load context")
1090 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1091 self.stmt(ast.With([i], [p]), "must have Store context")
1092
1093 def test_raise(self):
1094 r = ast.Raise(None, ast.Num(3))
1095 self.stmt(r, "Raise with cause but no exception")
1096 r = ast.Raise(ast.Name("x", ast.Store()), None)
1097 self.stmt(r, "must have Load context")
1098 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1099 self.stmt(r, "must have Load context")
1100
1101 def test_try(self):
1102 p = ast.Pass()
1103 t = ast.Try([], [], [], [p])
1104 self.stmt(t, "empty body on Try")
1105 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1106 self.stmt(t, "must have Load context")
1107 t = ast.Try([p], [], [], [])
1108 self.stmt(t, "Try has neither except handlers nor finalbody")
1109 t = ast.Try([p], [], [p], [p])
1110 self.stmt(t, "Try has orelse but no except handlers")
1111 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1112 self.stmt(t, "empty body on ExceptHandler")
1113 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1114 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1115 e = [ast.ExceptHandler(None, "x", [p])]
1116 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1117 self.stmt(t, "must have Load context")
1118 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1119 self.stmt(t, "must have Load context")
1120
1121 def test_assert(self):
1122 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1123 "must have Load context")
1124 assrt = ast.Assert(ast.Name("x", ast.Load()),
1125 ast.Name("y", ast.Store()))
1126 self.stmt(assrt, "must have Load context")
1127
1128 def test_import(self):
1129 self.stmt(ast.Import([]), "empty names on Import")
1130
1131 def test_importfrom(self):
1132 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001133 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001134 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1135
1136 def test_global(self):
1137 self.stmt(ast.Global([]), "empty names on Global")
1138
1139 def test_nonlocal(self):
1140 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1141
1142 def test_expr(self):
1143 e = ast.Expr(ast.Name("x", ast.Store()))
1144 self.stmt(e, "must have Load context")
1145
1146 def test_boolop(self):
1147 b = ast.BoolOp(ast.And(), [])
1148 self.expr(b, "less than 2 values")
1149 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1150 self.expr(b, "less than 2 values")
1151 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1152 self.expr(b, "None disallowed")
1153 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1154 self.expr(b, "must have Load context")
1155
1156 def test_unaryop(self):
1157 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1158 self.expr(u, "must have Load context")
1159
1160 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001161 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001162 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1163 "must have Load context")
1164 def fac(args):
1165 return ast.Lambda(args, ast.Name("x", ast.Load()))
1166 self._check_arguments(fac, self.expr)
1167
1168 def test_ifexp(self):
1169 l = ast.Name("x", ast.Load())
1170 s = ast.Name("y", ast.Store())
1171 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001172 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001173
1174 def test_dict(self):
1175 d = ast.Dict([], [ast.Name("x", ast.Load())])
1176 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001177 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1178 self.expr(d, "None disallowed")
1179
1180 def test_set(self):
1181 self.expr(ast.Set([None]), "None disallowed")
1182 s = ast.Set([ast.Name("x", ast.Store())])
1183 self.expr(s, "must have Load context")
1184
1185 def _check_comprehension(self, fac):
1186 self.expr(fac([]), "comprehension with no generators")
1187 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001188 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001189 self.expr(fac([g]), "must have Store context")
1190 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001191 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001192 self.expr(fac([g]), "must have Load context")
1193 x = ast.Name("x", ast.Store())
1194 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001195 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001196 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001197 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001198 self.expr(fac([g]), "must have Load context")
1199
1200 def _simple_comp(self, fac):
1201 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001202 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001203 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1204 "must have Load context")
1205 def wrap(gens):
1206 return fac(ast.Name("x", ast.Store()), gens)
1207 self._check_comprehension(wrap)
1208
1209 def test_listcomp(self):
1210 self._simple_comp(ast.ListComp)
1211
1212 def test_setcomp(self):
1213 self._simple_comp(ast.SetComp)
1214
1215 def test_generatorexp(self):
1216 self._simple_comp(ast.GeneratorExp)
1217
1218 def test_dictcomp(self):
1219 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001220 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001221 c = ast.DictComp(ast.Name("x", ast.Store()),
1222 ast.Name("y", ast.Load()), [g])
1223 self.expr(c, "must have Load context")
1224 c = ast.DictComp(ast.Name("x", ast.Load()),
1225 ast.Name("y", ast.Store()), [g])
1226 self.expr(c, "must have Load context")
1227 def factory(comps):
1228 k = ast.Name("x", ast.Load())
1229 v = ast.Name("y", ast.Load())
1230 return ast.DictComp(k, v, comps)
1231 self._check_comprehension(factory)
1232
1233 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001234 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1235 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001236
1237 def test_compare(self):
1238 left = ast.Name("x", ast.Load())
1239 comp = ast.Compare(left, [ast.In()], [])
1240 self.expr(comp, "no comparators")
1241 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1242 self.expr(comp, "different number of comparators and operands")
1243 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001244 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001245 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001246 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001247
1248 def test_call(self):
1249 func = ast.Name("x", ast.Load())
1250 args = [ast.Name("y", ast.Load())]
1251 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001252 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001253 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001254 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001255 self.expr(call, "None disallowed")
1256 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001257 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001258 self.expr(call, "must have Load context")
1259
1260 def test_num(self):
1261 class subint(int):
1262 pass
1263 class subfloat(float):
1264 pass
1265 class subcomplex(complex):
1266 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001267 for obj in "0", "hello":
1268 self.expr(ast.Num(obj))
1269 for obj in subint(), subfloat(), subcomplex():
1270 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001271
1272 def test_attribute(self):
1273 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1274 self.expr(attr, "must have Load context")
1275
1276 def test_subscript(self):
1277 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1278 ast.Load())
1279 self.expr(sub, "must have Load context")
1280 x = ast.Name("x", ast.Load())
1281 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1282 ast.Load())
1283 self.expr(sub, "must have Load context")
1284 s = ast.Name("x", ast.Store())
1285 for args in (s, None, None), (None, s, None), (None, None, s):
1286 sl = ast.Slice(*args)
1287 self.expr(ast.Subscript(x, sl, ast.Load()),
1288 "must have Load context")
1289 sl = ast.ExtSlice([])
1290 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1291 sl = ast.ExtSlice([ast.Index(s)])
1292 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1293
1294 def test_starred(self):
1295 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1296 ast.Store())
1297 assign = ast.Assign([left], ast.Num(4))
1298 self.stmt(assign, "must have Store context")
1299
1300 def _sequence(self, fac):
1301 self.expr(fac([None], ast.Load()), "None disallowed")
1302 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1303 "must have Load context")
1304
1305 def test_list(self):
1306 self._sequence(ast.List)
1307
1308 def test_tuple(self):
1309 self._sequence(ast.Tuple)
1310
Benjamin Peterson442f2092012-12-06 17:41:04 -05001311 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001312 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001313
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001314 def test_stdlib_validates(self):
1315 stdlib = os.path.dirname(ast.__file__)
1316 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1317 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1318 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001319 with self.subTest(module):
1320 fn = os.path.join(stdlib, module)
1321 with open(fn, "r", encoding="utf-8") as fp:
1322 source = fp.read()
1323 mod = ast.parse(source, fn)
1324 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001325
1326
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001327class ConstantTests(unittest.TestCase):
1328 """Tests on the ast.Constant node type."""
1329
1330 def compile_constant(self, value):
1331 tree = ast.parse("x = 123")
1332
1333 node = tree.body[0].value
1334 new_node = ast.Constant(value=value)
1335 ast.copy_location(new_node, node)
1336 tree.body[0].value = new_node
1337
1338 code = compile(tree, "<string>", "exec")
1339
1340 ns = {}
1341 exec(code, ns)
1342 return ns['x']
1343
Victor Stinnerbe59d142016-01-27 00:39:12 +01001344 def test_validation(self):
1345 with self.assertRaises(TypeError) as cm:
1346 self.compile_constant([1, 2, 3])
1347 self.assertEqual(str(cm.exception),
1348 "got an invalid type in Constant: list")
1349
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001350 def test_singletons(self):
1351 for const in (None, False, True, Ellipsis, b'', frozenset()):
1352 with self.subTest(const=const):
1353 value = self.compile_constant(const)
1354 self.assertIs(value, const)
1355
1356 def test_values(self):
1357 nested_tuple = (1,)
1358 nested_frozenset = frozenset({1})
1359 for level in range(3):
1360 nested_tuple = (nested_tuple, 2)
1361 nested_frozenset = frozenset({nested_frozenset, 2})
1362 values = (123, 123.0, 123j,
1363 "unicode", b'bytes',
1364 tuple("tuple"), frozenset("frozenset"),
1365 nested_tuple, nested_frozenset)
1366 for value in values:
1367 with self.subTest(value=value):
1368 result = self.compile_constant(value)
1369 self.assertEqual(result, value)
1370
1371 def test_assign_to_constant(self):
1372 tree = ast.parse("x = 1")
1373
1374 target = tree.body[0].targets[0]
1375 new_target = ast.Constant(value=1)
1376 ast.copy_location(new_target, target)
1377 tree.body[0].targets[0] = new_target
1378
1379 with self.assertRaises(ValueError) as cm:
1380 compile(tree, "string", "exec")
1381 self.assertEqual(str(cm.exception),
1382 "expression which can't be assigned "
1383 "to in Store context")
1384
1385 def test_get_docstring(self):
1386 tree = ast.parse("'docstring'\nx = 1")
1387 self.assertEqual(ast.get_docstring(tree), 'docstring')
1388
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001389 def get_load_const(self, tree):
1390 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1391 # instructions
1392 co = compile(tree, '<string>', 'exec')
1393 consts = []
1394 for instr in dis.get_instructions(co):
1395 if instr.opname == 'LOAD_CONST':
1396 consts.append(instr.argval)
1397 return consts
1398
1399 @support.cpython_only
1400 def test_load_const(self):
1401 consts = [None,
1402 True, False,
1403 124,
1404 2.0,
1405 3j,
1406 "unicode",
1407 b'bytes',
1408 (1, 2, 3)]
1409
Victor Stinnera2724092016-02-08 18:17:58 +01001410 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1411 code += '\nx = ...'
1412 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001413
1414 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001415 self.assertEqual(self.get_load_const(tree),
1416 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001417
1418 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001419 for assign, const in zip(tree.body, consts):
1420 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001421 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001422 ast.copy_location(new_node, assign.value)
1423 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001424
Victor Stinnera2724092016-02-08 18:17:58 +01001425 self.assertEqual(self.get_load_const(tree),
1426 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001427
1428 def test_literal_eval(self):
1429 tree = ast.parse("1 + 2")
1430 binop = tree.body[0].value
1431
1432 new_left = ast.Constant(value=10)
1433 ast.copy_location(new_left, binop.left)
1434 binop.left = new_left
1435
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001436 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001437 ast.copy_location(new_right, binop.right)
1438 binop.right = new_right
1439
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001440 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001441
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001442 def test_string_kind(self):
1443 c = ast.parse('"x"', mode='eval').body
1444 self.assertEqual(c.value, "x")
1445 self.assertEqual(c.kind, None)
1446
1447 c = ast.parse('u"x"', mode='eval').body
1448 self.assertEqual(c.value, "x")
1449 self.assertEqual(c.kind, "u")
1450
1451 c = ast.parse('r"x"', mode='eval').body
1452 self.assertEqual(c.value, "x")
1453 self.assertEqual(c.kind, None)
1454
1455 c = ast.parse('b"x"', mode='eval').body
1456 self.assertEqual(c.value, b"x")
1457 self.assertEqual(c.kind, None)
1458
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001459
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001460class EndPositionTests(unittest.TestCase):
1461 """Tests for end position of AST nodes.
1462
1463 Testing end positions of nodes requires a bit of extra care
1464 because of how LL parsers work.
1465 """
1466 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1467 self.assertEqual(ast_node.end_lineno, end_lineno)
1468 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1469
1470 def _check_content(self, source, ast_node, content):
1471 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1472
1473 def _parse_value(self, s):
1474 # Use duck-typing to support both single expression
1475 # and a right hand side of an assignment statement.
1476 return ast.parse(s).body[0].value
1477
1478 def test_lambda(self):
1479 s = 'lambda x, *y: None'
1480 lam = self._parse_value(s)
1481 self._check_content(s, lam.body, 'None')
1482 self._check_content(s, lam.args.args[0], 'x')
1483 self._check_content(s, lam.args.vararg, 'y')
1484
1485 def test_func_def(self):
1486 s = dedent('''
1487 def func(x: int,
1488 *args: str,
1489 z: float = 0,
1490 **kwargs: Any) -> bool:
1491 return True
1492 ''').strip()
1493 fdef = ast.parse(s).body[0]
1494 self._check_end_pos(fdef, 5, 15)
1495 self._check_content(s, fdef.body[0], 'return True')
1496 self._check_content(s, fdef.args.args[0], 'x: int')
1497 self._check_content(s, fdef.args.args[0].annotation, 'int')
1498 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1499 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1500
1501 def test_call(self):
1502 s = 'func(x, y=2, **kw)'
1503 call = self._parse_value(s)
1504 self._check_content(s, call.func, 'func')
1505 self._check_content(s, call.keywords[0].value, '2')
1506 self._check_content(s, call.keywords[1].value, 'kw')
1507
1508 def test_call_noargs(self):
1509 s = 'x[0]()'
1510 call = self._parse_value(s)
1511 self._check_content(s, call.func, 'x[0]')
1512 self._check_end_pos(call, 1, 6)
1513
1514 def test_class_def(self):
1515 s = dedent('''
1516 class C(A, B):
1517 x: int = 0
1518 ''').strip()
1519 cdef = ast.parse(s).body[0]
1520 self._check_end_pos(cdef, 2, 14)
1521 self._check_content(s, cdef.bases[1], 'B')
1522 self._check_content(s, cdef.body[0], 'x: int = 0')
1523
1524 def test_class_kw(self):
1525 s = 'class S(metaclass=abc.ABCMeta): pass'
1526 cdef = ast.parse(s).body[0]
1527 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1528
1529 def test_multi_line_str(self):
1530 s = dedent('''
1531 x = """Some multi-line text.
1532
1533 It goes on starting from same indent."""
1534 ''').strip()
1535 assign = ast.parse(s).body[0]
1536 self._check_end_pos(assign, 3, 40)
1537 self._check_end_pos(assign.value, 3, 40)
1538
1539 def test_continued_str(self):
1540 s = dedent('''
1541 x = "first part" \\
1542 "second part"
1543 ''').strip()
1544 assign = ast.parse(s).body[0]
1545 self._check_end_pos(assign, 2, 13)
1546 self._check_end_pos(assign.value, 2, 13)
1547
1548 def test_suites(self):
1549 # We intentionally put these into the same string to check
1550 # that empty lines are not part of the suite.
1551 s = dedent('''
1552 while True:
1553 pass
1554
1555 if one():
1556 x = None
1557 elif other():
1558 y = None
1559 else:
1560 z = None
1561
1562 for x, y in stuff:
1563 assert True
1564
1565 try:
1566 raise RuntimeError
1567 except TypeError as e:
1568 pass
1569
1570 pass
1571 ''').strip()
1572 mod = ast.parse(s)
1573 while_loop = mod.body[0]
1574 if_stmt = mod.body[1]
1575 for_loop = mod.body[2]
1576 try_stmt = mod.body[3]
1577 pass_stmt = mod.body[4]
1578
1579 self._check_end_pos(while_loop, 2, 8)
1580 self._check_end_pos(if_stmt, 9, 12)
1581 self._check_end_pos(for_loop, 12, 15)
1582 self._check_end_pos(try_stmt, 17, 8)
1583 self._check_end_pos(pass_stmt, 19, 4)
1584
1585 self._check_content(s, while_loop.test, 'True')
1586 self._check_content(s, if_stmt.body[0], 'x = None')
1587 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1588 self._check_content(s, for_loop.target, 'x, y')
1589 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1590 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1591
1592 def test_fstring(self):
1593 s = 'x = f"abc {x + y} abc"'
1594 fstr = self._parse_value(s)
1595 binop = fstr.values[1].value
1596 self._check_content(s, binop, 'x + y')
1597
1598 def test_fstring_multi_line(self):
1599 s = dedent('''
1600 f"""Some multi-line text.
1601 {
1602 arg_one
1603 +
1604 arg_two
1605 }
1606 It goes on..."""
1607 ''').strip()
1608 fstr = self._parse_value(s)
1609 binop = fstr.values[1].value
1610 self._check_end_pos(binop, 5, 7)
1611 self._check_content(s, binop.left, 'arg_one')
1612 self._check_content(s, binop.right, 'arg_two')
1613
1614 def test_import_from_multi_line(self):
1615 s = dedent('''
1616 from x.y.z import (
1617 a, b, c as c
1618 )
1619 ''').strip()
1620 imp = ast.parse(s).body[0]
1621 self._check_end_pos(imp, 3, 1)
1622
1623 def test_slices(self):
1624 s1 = 'f()[1, 2] [0]'
1625 s2 = 'x[ a.b: c.d]'
1626 sm = dedent('''
1627 x[ a.b: f () ,
1628 g () : c.d
1629 ]
1630 ''').strip()
1631 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1632 self._check_content(s1, i1.value, 'f()[1, 2]')
1633 self._check_content(s1, i1.value.slice.value, '1, 2')
1634 self._check_content(s2, i2.slice.lower, 'a.b')
1635 self._check_content(s2, i2.slice.upper, 'c.d')
1636 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1637 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1638 self._check_end_pos(im, 3, 3)
1639
1640 def test_binop(self):
1641 s = dedent('''
1642 (1 * 2 + (3 ) +
1643 4
1644 )
1645 ''').strip()
1646 binop = self._parse_value(s)
1647 self._check_end_pos(binop, 2, 6)
1648 self._check_content(s, binop.right, '4')
1649 self._check_content(s, binop.left, '1 * 2 + (3 )')
1650 self._check_content(s, binop.left.right, '3')
1651
1652 def test_boolop(self):
1653 s = dedent('''
1654 if (one_condition and
1655 (other_condition or yet_another_one)):
1656 pass
1657 ''').strip()
1658 bop = ast.parse(s).body[0].test
1659 self._check_end_pos(bop, 2, 44)
1660 self._check_content(s, bop.values[1],
1661 'other_condition or yet_another_one')
1662
1663 def test_tuples(self):
1664 s1 = 'x = () ;'
1665 s2 = 'x = 1 , ;'
1666 s3 = 'x = (1 , 2 ) ;'
1667 sm = dedent('''
1668 x = (
1669 a, b,
1670 )
1671 ''').strip()
1672 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1673 self._check_content(s1, t1, '()')
1674 self._check_content(s2, t2, '1 ,')
1675 self._check_content(s3, t3, '(1 , 2 )')
1676 self._check_end_pos(tm, 3, 1)
1677
1678 def test_attribute_spaces(self):
1679 s = 'func(x. y .z)'
1680 call = self._parse_value(s)
1681 self._check_content(s, call, s)
1682 self._check_content(s, call.args[0], 'x. y .z')
1683
1684 def test_displays(self):
1685 s1 = '[{}, {1, }, {1, 2,} ]'
1686 s2 = '{a: b, f (): g () ,}'
1687 c1 = self._parse_value(s1)
1688 c2 = self._parse_value(s2)
1689 self._check_content(s1, c1.elts[0], '{}')
1690 self._check_content(s1, c1.elts[1], '{1, }')
1691 self._check_content(s1, c1.elts[2], '{1, 2,}')
1692 self._check_content(s2, c2.keys[1], 'f ()')
1693 self._check_content(s2, c2.values[1], 'g ()')
1694
1695 def test_comprehensions(self):
1696 s = dedent('''
1697 x = [{x for x, y in stuff
1698 if cond.x} for stuff in things]
1699 ''').strip()
1700 cmp = self._parse_value(s)
1701 self._check_end_pos(cmp, 2, 37)
1702 self._check_content(s, cmp.generators[0].iter, 'things')
1703 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1704 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1705 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1706
1707 def test_yield_await(self):
1708 s = dedent('''
1709 async def f():
1710 yield x
1711 await y
1712 ''').strip()
1713 fdef = ast.parse(s).body[0]
1714 self._check_content(s, fdef.body[0].value, 'yield x')
1715 self._check_content(s, fdef.body[1].value, 'await y')
1716
1717 def test_source_segment_multi(self):
1718 s_orig = dedent('''
1719 x = (
1720 a, b,
1721 ) + ()
1722 ''').strip()
1723 s_tuple = dedent('''
1724 (
1725 a, b,
1726 )
1727 ''').strip()
1728 binop = self._parse_value(s_orig)
1729 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1730
1731 def test_source_segment_padded(self):
1732 s_orig = dedent('''
1733 class C:
1734 def fun(self) -> None:
1735 "ЖЖЖЖЖ"
1736 ''').strip()
1737 s_method = ' def fun(self) -> None:\n' \
1738 ' "ЖЖЖЖЖ"'
1739 cdef = ast.parse(s_orig).body[0]
1740 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1741 s_method)
1742
1743 def test_source_segment_endings(self):
1744 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1745 v, w, x, y, z = ast.parse(s).body
1746 self._check_content(s, v, 'v = 1')
1747 self._check_content(s, w, 'w = 1')
1748 self._check_content(s, x, 'x = 1')
1749 self._check_content(s, y, 'y = 1')
1750 self._check_content(s, z, 'z = 1')
1751
1752 def test_source_segment_tabs(self):
1753 s = dedent('''
1754 class C:
1755 \t\f def fun(self) -> None:
1756 \t\f pass
1757 ''').strip()
1758 s_method = ' \t\f def fun(self) -> None:\n' \
1759 ' \t\f pass'
1760
1761 cdef = ast.parse(s).body[0]
1762 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1763
1764
Serhiy Storchakac3ea41e2019-08-26 10:13:19 +03001765class NodeVisitorTests(unittest.TestCase):
1766 def test_old_constant_nodes(self):
1767 class Visitor(ast.NodeVisitor):
1768 def visit_Num(self, node):
1769 log.append((node.lineno, 'Num', node.n))
1770 def visit_Str(self, node):
1771 log.append((node.lineno, 'Str', node.s))
1772 def visit_Bytes(self, node):
1773 log.append((node.lineno, 'Bytes', node.s))
1774 def visit_NameConstant(self, node):
1775 log.append((node.lineno, 'NameConstant', node.value))
1776 def visit_Ellipsis(self, node):
1777 log.append((node.lineno, 'Ellipsis', ...))
1778 mod = ast.parse(dedent('''\
1779 i = 42
1780 f = 4.25
1781 c = 4.25j
1782 s = 'string'
1783 b = b'bytes'
1784 t = True
1785 n = None
1786 e = ...
1787 '''))
1788 visitor = Visitor()
1789 log = []
1790 with warnings.catch_warnings(record=True) as wlog:
1791 warnings.filterwarnings('always', '', DeprecationWarning)
1792 visitor.visit(mod)
1793 self.assertEqual(log, [
1794 (1, 'Num', 42),
1795 (2, 'Num', 4.25),
1796 (3, 'Num', 4.25j),
1797 (4, 'Str', 'string'),
1798 (5, 'Bytes', b'bytes'),
1799 (6, 'NameConstant', True),
1800 (7, 'NameConstant', None),
1801 (8, 'Ellipsis', ...),
1802 ])
1803 self.assertEqual([str(w.message) for w in wlog], [
1804 'visit_Num is deprecated; add visit_Constant',
1805 'visit_Num is deprecated; add visit_Constant',
1806 'visit_Num is deprecated; add visit_Constant',
1807 'visit_Str is deprecated; add visit_Constant',
1808 'visit_Bytes is deprecated; add visit_Constant',
1809 'visit_NameConstant is deprecated; add visit_Constant',
1810 'visit_NameConstant is deprecated; add visit_Constant',
1811 'visit_Ellipsis is deprecated; add visit_Constant',
1812 ])
1813
1814
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001815def main():
1816 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001817 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001818 if sys.argv[1:] == ['-g']:
1819 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1820 (eval_tests, "eval")):
1821 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001822 for statement in statements:
1823 tree = ast.parse(statement, "?", kind)
1824 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001825 print("]")
1826 print("main()")
1827 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001828 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001829
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001830#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001831exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001832('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1833('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001834('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1835('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001836('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1837('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 +01001838('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1839('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001840('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 -08001841('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001842('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001843('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001844('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 -08001845('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001846('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001847('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1848('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1849('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 -07001850('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001851('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1852('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1853('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
Lysandros Nikolaou025a6022019-12-12 22:40:21 +01001854('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001855('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1856('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 -07001857('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 -08001858('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1859('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1860('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1861('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1862('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1863('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001864('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001865('Module', [('Pass', (1, 0))], []),
1866('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1867('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1868('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)], []),
1869('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)], []),
1870('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)], []),
1871('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)]))], []),
1872('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)]))], []),
1873('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)]))], []),
1874('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)]))], []),
1875('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 +01001876('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)], []),
1877('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)], []),
1878('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 -07001879('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)]))], []),
1880('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 +01001881('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)], []),
Serhiy Storchaka26ae9f62019-10-26 16:46:05 +03001882('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)], []),
1883('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)], []),
1884('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 +01001885('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 +00001886('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001887('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1888('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)], []),
1889('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)], []),
1890('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)], []),
1891('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1892('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)], []),
1893('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)], []),
1894('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)], []),
1895('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)], []),
1896('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 +00001897]
1898single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001899('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 +00001900]
1901eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001902('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001903('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1904('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1905('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001906('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001907('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001908('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001909('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1910('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001911('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)])),
1912('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)])),
1913('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)])),
1914('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)])),
1915('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)])),
1916('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)])),
1917('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)])),
1918('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)])),
1919('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)])),
1920('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)])),
1921('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 -07001922('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1923('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 +02001924('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 -07001925('Expression', ('Constant', (1, 0), 10, None)),
1926('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001927('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1928('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 +00001929('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001930('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 -05001931('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001932('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1933('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 -05001934('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001935('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 +00001936]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001937main()