blob: f35d9e6f5451d50563eaf70f8884bd0eb7ea79f1 [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
Benjamin Peterson9ed37432012-07-08 11:13:36 -07006import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07008
9from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000010
11def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000012 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000013 return t
14 elif isinstance(t, list):
15 return [to_tuple(e) for e in t]
16 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000017 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
18 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000019 if t._fields is None:
20 return tuple(result)
21 for f in t._fields:
22 result.append(to_tuple(getattr(t, f)))
23 return tuple(result)
24
Neal Norwitzee9b10a2008-03-31 05:29:39 +000025
Tim Peters400cbc32006-02-28 18:44:41 +000026# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030027# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000028exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050029 # None
30 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090031 # Module docstring
32 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000033 # FunctionDef
34 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090035 # FunctionDef with docstring
36 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050037 # FunctionDef with arg
38 "def f(a): pass",
39 # FunctionDef with arg and default value
40 "def f(a=0): pass",
41 # FunctionDef with varargs
42 "def f(*args): pass",
43 # FunctionDef with kwargs
44 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090045 # FunctionDef with all kind of args and docstring
46 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000047 # ClassDef
48 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090049 # ClassDef with docstring
50 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050051 # ClassDef, new style class
52 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000053 # Return
54 "def f():return 1",
55 # Delete
56 "del v",
57 # Assign
58 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020059 "a,b = c",
60 "(a,b) = c",
61 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000062 # AugAssign
63 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000064 # For
65 "for v in v:pass",
66 # While
67 "while v:pass",
68 # If
69 "if v:pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050070 # With
71 "with x as y: pass",
72 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000073 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000074 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000075 # TryExcept
76 "try:\n pass\nexcept Exception:\n pass",
77 # TryFinally
78 "try:\n pass\nfinally:\n pass",
79 # Assert
80 "assert v",
81 # Import
82 "import sys",
83 # ImportFrom
84 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000085 # Global
86 "global v",
87 # Expr
88 "1",
89 # Pass,
90 "pass",
91 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040092 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000093 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040094 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000095 # for statements with naked tuples (see http://bugs.python.org/issue6704)
96 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +020097 "for (a,b) in c: pass",
98 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050099 # Multiline generator expression (test for .lineno & .col_offset)
100 """(
101 (
102 Aa
103 ,
104 Bb
105 )
106 for
107 Aa
108 ,
109 Bb in Cc
110 )""",
111 # dictcomp
112 "{a : b for w in x for m in p if g}",
113 # dictcomp with naked tuple
114 "{a : b for v,w in x}",
115 # setcomp
116 "{r for l in x if g}",
117 # setcomp with naked tuple
118 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400119 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900120 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400121 # AsyncFor
122 "async def f():\n async for e in i: 1\n else: 2",
123 # AsyncWith
124 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400125 # PEP 448: Additional Unpacking Generalizations
126 "{**{1:2}, 2:3}",
127 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700128 # Asynchronous comprehensions
129 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200130 # Decorated FunctionDef
131 "@deco1\n@deco2()\ndef f(): pass",
132 # Decorated AsyncFunctionDef
133 "@deco1\n@deco2()\nasync def f(): pass",
134 # Decorated ClassDef
135 "@deco1\n@deco2()\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200136 # Decorator with generator argument
137 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000138 # Simple assignment expression
139 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100140 # Positional-only arguments
141 "def f(a, /,): pass",
142 "def f(a, /, c, d, e): pass",
143 "def f(a, /, c, *, d, e): pass",
144 "def f(a, /, c, *, d, e, **kwargs): pass",
145 # Positional-only arguments with defaults
146 "def f(a=1, /,): pass",
147 "def f(a=1, /, b=2, c=4): pass",
148 "def f(a=1, /, b=2, *, c=4): pass",
149 "def f(a=1, /, b=2, *, c): pass",
150 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
151 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000152
Tim Peters400cbc32006-02-28 18:44:41 +0000153]
154
155# These are compiled through "single"
156# because of overlap with "eval", it just tests what
157# can't be tested with "eval"
158single_tests = [
159 "1+2"
160]
161
162# These are compiled through "eval"
163# It should test all expressions
164eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500165 # None
166 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000167 # BoolOp
168 "a and b",
169 # BinOp
170 "a + b",
171 # UnaryOp
172 "not v",
173 # Lambda
174 "lambda:None",
175 # Dict
176 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500177 # Empty dict
178 "{}",
179 # Set
180 "{None,}",
181 # Multiline dict (test for .lineno & .col_offset)
182 """{
183 1
184 :
185 2
186 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000187 # ListComp
188 "[a for b in c if d]",
189 # GeneratorExp
190 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200191 # Comprehensions with multiple for targets
192 "[(a,b) for a,b in c]",
193 "[(a,b) for (a,b) in c]",
194 "[(a,b) for [a,b] in c]",
195 "{(a,b) for a,b in c}",
196 "{(a,b) for (a,b) in c}",
197 "{(a,b) for [a,b] in c}",
198 "((a,b) for a,b in c)",
199 "((a,b) for (a,b) in c)",
200 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000201 # Yield - yield expressions can't work outside a function
202 #
203 # Compare
204 "1 < 2 < 3",
205 # Call
206 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200207 # Call with a generator argument
208 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000209 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000210 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000211 # Str
212 "'string'",
213 # Attribute
214 "a.b",
215 # Subscript
216 "a[b:c]",
217 # Name
218 "v",
219 # List
220 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500221 # Empty list
222 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000223 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000224 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500225 # Tuple
226 "(1,2,3)",
227 # Empty tuple
228 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000229 # Combination
230 "a.b.c.d(a.b[1:2])",
231
Tim Peters400cbc32006-02-28 18:44:41 +0000232]
233
234# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
235# excepthandler, arguments, keywords, alias
236
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000237class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000238
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500239 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000240 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000241 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000242 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000243 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200244 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000245 parent_pos = (ast_node.lineno, ast_node.col_offset)
246 for name in ast_node._fields:
247 value = getattr(ast_node, name)
248 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200249 first_pos = parent_pos
250 if value and name == 'decorator_list':
251 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000252 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200253 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000254 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500255 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000256
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500257 def test_AST_objects(self):
258 x = ast.AST()
259 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700260 x.foobar = 42
261 self.assertEqual(x.foobar, 42)
262 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500263
264 with self.assertRaises(AttributeError):
265 x.vararg
266
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500267 with self.assertRaises(TypeError):
268 # "_ast.AST constructor takes 0 positional arguments"
269 ast.AST(2)
270
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700271 def test_AST_garbage_collection(self):
272 class X:
273 pass
274 a = ast.AST()
275 a.x = X()
276 a.x.a = a
277 ref = weakref.ref(a.x)
278 del a
279 support.gc_collect()
280 self.assertIsNone(ref())
281
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000282 def test_snippets(self):
283 for input, output, kind in ((exec_tests, exec_results, "exec"),
284 (single_tests, single_results, "single"),
285 (eval_tests, eval_results, "eval")):
286 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400287 with self.subTest(action="parsing", input=i):
288 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
289 self.assertEqual(to_tuple(ast_tree), o)
290 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100291 with self.subTest(action="compiling", input=i, kind=kind):
292 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000293
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000294 def test_ast_validation(self):
295 # compile() is the only function that calls PyAST_Validate
296 snippets_to_validate = exec_tests + single_tests + eval_tests
297 for snippet in snippets_to_validate:
298 tree = ast.parse(snippet)
299 compile(tree, '<string>', 'exec')
300
Benjamin Peterson78565b22009-06-28 19:19:51 +0000301 def test_slice(self):
302 slc = ast.parse("x[::]").body[0].value.slice
303 self.assertIsNone(slc.upper)
304 self.assertIsNone(slc.lower)
305 self.assertIsNone(slc.step)
306
307 def test_from_import(self):
308 im = ast.parse("from . import y").body[0]
309 self.assertIsNone(im.module)
310
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400311 def test_non_interned_future_from_ast(self):
312 mod = ast.parse("from __future__ import division")
313 self.assertIsInstance(mod.body[0], ast.ImportFrom)
314 mod.body[0].module = " __future__ ".strip()
315 compile(mod, "<test>", "exec")
316
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000317 def test_base_classes(self):
318 self.assertTrue(issubclass(ast.For, ast.stmt))
319 self.assertTrue(issubclass(ast.Name, ast.expr))
320 self.assertTrue(issubclass(ast.stmt, ast.AST))
321 self.assertTrue(issubclass(ast.expr, ast.AST))
322 self.assertTrue(issubclass(ast.comprehension, ast.AST))
323 self.assertTrue(issubclass(ast.Gt, ast.AST))
324
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500325 def test_field_attr_existence(self):
326 for name, item in ast.__dict__.items():
327 if isinstance(item, type) and name != 'AST' and name[0].isupper():
328 x = item()
329 if isinstance(x, ast.AST):
330 self.assertEqual(type(x._fields), tuple)
331
332 def test_arguments(self):
333 x = ast.arguments()
Pablo Galindocd6e83b2019-07-15 01:32:18 +0200334 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
335 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500336
337 with self.assertRaises(AttributeError):
338 x.vararg
339
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100340 x = ast.arguments(*range(1, 8))
341 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500342
343 def test_field_attr_writable(self):
344 x = ast.Num()
345 # We can assign to _fields
346 x._fields = 666
347 self.assertEqual(x._fields, 666)
348
349 def test_classattrs(self):
350 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700351 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300352
353 with self.assertRaises(AttributeError):
354 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500355
356 with self.assertRaises(AttributeError):
357 x.n
358
359 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300360 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500361 self.assertEqual(x.n, 42)
362
363 with self.assertRaises(AttributeError):
364 x.lineno
365
366 with self.assertRaises(AttributeError):
367 x.foobar
368
369 x = ast.Num(lineno=2)
370 self.assertEqual(x.lineno, 2)
371
372 x = ast.Num(42, lineno=0)
373 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700374 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300375 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500376 self.assertEqual(x.n, 42)
377
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700378 self.assertRaises(TypeError, ast.Num, 1, None, 2)
379 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500380
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300381 self.assertEqual(ast.Num(42).n, 42)
382 self.assertEqual(ast.Num(4.25).n, 4.25)
383 self.assertEqual(ast.Num(4.25j).n, 4.25j)
384 self.assertEqual(ast.Str('42').s, '42')
385 self.assertEqual(ast.Bytes(b'42').s, b'42')
386 self.assertIs(ast.NameConstant(True).value, True)
387 self.assertIs(ast.NameConstant(False).value, False)
388 self.assertIs(ast.NameConstant(None).value, None)
389
390 self.assertEqual(ast.Constant(42).value, 42)
391 self.assertEqual(ast.Constant(4.25).value, 4.25)
392 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
393 self.assertEqual(ast.Constant('42').value, '42')
394 self.assertEqual(ast.Constant(b'42').value, b'42')
395 self.assertIs(ast.Constant(True).value, True)
396 self.assertIs(ast.Constant(False).value, False)
397 self.assertIs(ast.Constant(None).value, None)
398 self.assertIs(ast.Constant(...).value, ...)
399
400 def test_realtype(self):
401 self.assertEqual(type(ast.Num(42)), ast.Constant)
402 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
403 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
404 self.assertEqual(type(ast.Str('42')), ast.Constant)
405 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
406 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
407 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
408 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
409 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
410
411 def test_isinstance(self):
412 self.assertTrue(isinstance(ast.Num(42), ast.Num))
413 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
414 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
415 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
416 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
417 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
418 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
419 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
420 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
421
422 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
423 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
424 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
425 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
426 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
427 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
428 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
429 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
430 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
431
432 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
433 self.assertFalse(isinstance(ast.Num(42), ast.Str))
434 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
435 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
436 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800437 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
438 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300439
440 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
441 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
442 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
443 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
444 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800445 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
446 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300447
448 self.assertFalse(isinstance(ast.Constant(), ast.Num))
449 self.assertFalse(isinstance(ast.Constant(), ast.Str))
450 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
451 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
452 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
453
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200454 class S(str): pass
455 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
456 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
457
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300458 def test_subclasses(self):
459 class N(ast.Num):
460 def __init__(self, *args, **kwargs):
461 super().__init__(*args, **kwargs)
462 self.z = 'spam'
463 class N2(ast.Num):
464 pass
465
466 n = N(42)
467 self.assertEqual(n.n, 42)
468 self.assertEqual(n.z, 'spam')
469 self.assertEqual(type(n), N)
470 self.assertTrue(isinstance(n, N))
471 self.assertTrue(isinstance(n, ast.Num))
472 self.assertFalse(isinstance(n, N2))
473 self.assertFalse(isinstance(ast.Num(42), N))
474 n = N(n=42)
475 self.assertEqual(n.n, 42)
476 self.assertEqual(type(n), N)
477
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500478 def test_module(self):
479 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800480 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500481 self.assertEqual(x.body, body)
482
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000483 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100484 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500485 x = ast.BinOp()
486 self.assertEqual(x._fields, ('left', 'op', 'right'))
487
488 # Random attribute allowed too
489 x.foobarbaz = 5
490 self.assertEqual(x.foobarbaz, 5)
491
492 n1 = ast.Num(1)
493 n3 = ast.Num(3)
494 addop = ast.Add()
495 x = ast.BinOp(n1, addop, n3)
496 self.assertEqual(x.left, n1)
497 self.assertEqual(x.op, addop)
498 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500499
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500500 x = ast.BinOp(1, 2, 3)
501 self.assertEqual(x.left, 1)
502 self.assertEqual(x.op, 2)
503 self.assertEqual(x.right, 3)
504
Georg Brandl0c77a822008-06-10 16:37:50 +0000505 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000506 self.assertEqual(x.left, 1)
507 self.assertEqual(x.op, 2)
508 self.assertEqual(x.right, 3)
509 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000510
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500511 # node raises exception when given too many arguments
512 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500513 # node raises exception when given too many arguments
514 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000515
516 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000517 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000518 self.assertEqual(x.left, 1)
519 self.assertEqual(x.op, 2)
520 self.assertEqual(x.right, 3)
521 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000522
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500523 # Random kwargs also allowed
524 x = ast.BinOp(1, 2, 3, foobarbaz=42)
525 self.assertEqual(x.foobarbaz, 42)
526
527 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000528 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000529 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500530 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000531
532 def test_pickling(self):
533 import pickle
534 mods = [pickle]
535 try:
536 import cPickle
537 mods.append(cPickle)
538 except ImportError:
539 pass
540 protocols = [0, 1, 2]
541 for mod in mods:
542 for protocol in protocols:
543 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
544 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000545 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000546
Benjamin Peterson5b066812010-11-20 01:38:49 +0000547 def test_invalid_sum(self):
548 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800549 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000550 with self.assertRaises(TypeError) as cm:
551 compile(m, "<test>", "exec")
552 self.assertIn("but got <_ast.expr", str(cm.exception))
553
Min ho Kimc4cacc82019-07-31 08:16:13 +1000554 def test_invalid_identifier(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800555 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500556 ast.fix_missing_locations(m)
557 with self.assertRaises(TypeError) as cm:
558 compile(m, "<test>", "exec")
559 self.assertIn("identifier must be of type str", str(cm.exception))
560
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000561 def test_empty_yield_from(self):
562 # Issue 16546: yield from value is not optional.
563 empty_yield_from = ast.parse("def f():\n yield from g()")
564 empty_yield_from.body[0].body[0].value.value = None
565 with self.assertRaises(ValueError) as cm:
566 compile(empty_yield_from, "<test>", "exec")
567 self.assertIn("field value is required", str(cm.exception))
568
Oren Milman7dc46d82017-09-30 20:16:24 +0300569 @support.cpython_only
570 def test_issue31592(self):
571 # There shouldn't be an assertion failure in case of a bad
572 # unicodedata.normalize().
573 import unicodedata
574 def bad_normalize(*args):
575 return None
576 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
577 self.assertRaises(TypeError, ast.parse, '\u03D5')
578
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200579 def test_issue18374_binop_col_offset(self):
580 tree = ast.parse('4+5+6+7')
581 parent_binop = tree.body[0].value
582 child_binop = parent_binop.left
583 grandchild_binop = child_binop.left
584 self.assertEqual(parent_binop.col_offset, 0)
585 self.assertEqual(parent_binop.end_col_offset, 7)
586 self.assertEqual(child_binop.col_offset, 0)
587 self.assertEqual(child_binop.end_col_offset, 5)
588 self.assertEqual(grandchild_binop.col_offset, 0)
589 self.assertEqual(grandchild_binop.end_col_offset, 3)
590
591 tree = ast.parse('4+5-\\\n 6-7')
592 parent_binop = tree.body[0].value
593 child_binop = parent_binop.left
594 grandchild_binop = child_binop.left
595 self.assertEqual(parent_binop.col_offset, 0)
596 self.assertEqual(parent_binop.lineno, 1)
597 self.assertEqual(parent_binop.end_col_offset, 4)
598 self.assertEqual(parent_binop.end_lineno, 2)
599
600 self.assertEqual(child_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200601 self.assertEqual(child_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200602 self.assertEqual(child_binop.end_col_offset, 2)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200603 self.assertEqual(child_binop.end_lineno, 2)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200604
605 self.assertEqual(grandchild_binop.col_offset, 0)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200606 self.assertEqual(grandchild_binop.lineno, 1)
Carl Friedrich Bolz-Tereick110a47c2019-07-08 23:17:56 +0200607 self.assertEqual(grandchild_binop.end_col_offset, 3)
Carl Friedrich Bolz-Tereick430a9f42019-07-09 14:20:01 +0200608 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000609
610class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700611 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000612
613 def test_parse(self):
614 a = ast.parse('foo(1 + 1)')
615 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
616 self.assertEqual(ast.dump(a), ast.dump(b))
617
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400618 def test_parse_in_error(self):
619 try:
620 1/0
621 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400622 with self.assertRaises(SyntaxError) as e:
623 ast.literal_eval(r"'\U'")
624 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400625
Georg Brandl0c77a822008-06-10 16:37:50 +0000626 def test_dump(self):
627 node = ast.parse('spam(eggs, "and cheese")')
628 self.assertEqual(ast.dump(node),
629 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700630 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800631 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000632 )
633 self.assertEqual(ast.dump(node, annotate_fields=False),
634 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700635 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000636 )
637 self.assertEqual(ast.dump(node, include_attributes=True),
638 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000639 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
640 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700641 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000642 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
643 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800644 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000645 )
646
647 def test_copy_location(self):
648 src = ast.parse('1 + 1', mode='eval')
649 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
650 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700651 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000652 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
653 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
654 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000655 )
656
657 def test_fix_missing_locations(self):
658 src = ast.parse('write("spam")')
659 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400660 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000661 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000662 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000663 self.assertEqual(ast.dump(src, include_attributes=True),
664 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000665 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700666 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000667 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
668 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
669 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
670 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
671 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
672 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800673 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
674 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000675 )
676
677 def test_increment_lineno(self):
678 src = ast.parse('1 + 1', mode='eval')
679 self.assertEqual(ast.increment_lineno(src, n=3), src)
680 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700681 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
682 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000683 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
684 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000685 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000686 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000687 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000688 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
689 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700690 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
691 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000692 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
693 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000694 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000695
696 def test_iter_fields(self):
697 node = ast.parse('foo()', mode='eval')
698 d = dict(ast.iter_fields(node.body))
699 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400700 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000701
702 def test_iter_child_nodes(self):
703 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
704 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
705 iterator = ast.iter_child_nodes(node.body)
706 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300707 self.assertEqual(next(iterator).value, 23)
708 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000709 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700710 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000711 )
712
713 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300714 node = ast.parse('"""line one\n line two"""')
715 self.assertEqual(ast.get_docstring(node),
716 'line one\nline two')
717
718 node = ast.parse('class foo:\n """line one\n line two"""')
719 self.assertEqual(ast.get_docstring(node.body[0]),
720 'line one\nline two')
721
Georg Brandl0c77a822008-06-10 16:37:50 +0000722 node = ast.parse('def foo():\n """line one\n line two"""')
723 self.assertEqual(ast.get_docstring(node.body[0]),
724 'line one\nline two')
725
Yury Selivanov2f07a662015-07-23 08:54:35 +0300726 node = ast.parse('async def foo():\n """spam\n ham"""')
727 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300728
729 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800730 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300731 node = ast.parse('x = "not docstring"')
732 self.assertIsNone(ast.get_docstring(node))
733 node = ast.parse('def foo():\n pass')
734 self.assertIsNone(ast.get_docstring(node))
735
736 node = ast.parse('class foo:\n pass')
737 self.assertIsNone(ast.get_docstring(node.body[0]))
738 node = ast.parse('class foo:\n x = "not docstring"')
739 self.assertIsNone(ast.get_docstring(node.body[0]))
740 node = ast.parse('class foo:\n def bar(self): pass')
741 self.assertIsNone(ast.get_docstring(node.body[0]))
742
743 node = ast.parse('def foo():\n pass')
744 self.assertIsNone(ast.get_docstring(node.body[0]))
745 node = ast.parse('def foo():\n x = "not docstring"')
746 self.assertIsNone(ast.get_docstring(node.body[0]))
747
748 node = ast.parse('async def foo():\n pass')
749 self.assertIsNone(ast.get_docstring(node.body[0]))
750 node = ast.parse('async def foo():\n x = "not docstring"')
751 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300752
Anthony Sottile995d9b92019-01-12 20:05:13 -0800753 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
754 node = ast.parse(
755 '"""line one\nline two"""\n\n'
756 'def foo():\n """line one\n line two"""\n\n'
757 ' def bar():\n """line one\n line two"""\n'
758 ' """line one\n line two"""\n'
759 '"""line one\nline two"""\n\n'
760 )
761 self.assertEqual(node.body[0].col_offset, 0)
762 self.assertEqual(node.body[0].lineno, 1)
763 self.assertEqual(node.body[1].body[0].col_offset, 2)
764 self.assertEqual(node.body[1].body[0].lineno, 5)
765 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
766 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
767 self.assertEqual(node.body[1].body[2].col_offset, 2)
768 self.assertEqual(node.body[1].body[2].lineno, 11)
769 self.assertEqual(node.body[2].col_offset, 0)
770 self.assertEqual(node.body[2].lineno, 13)
771
Georg Brandl0c77a822008-06-10 16:37:50 +0000772 def test_literal_eval(self):
773 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
774 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
775 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000776 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000777 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000778 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200779 self.assertEqual(ast.literal_eval('6'), 6)
780 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000781 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000782 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200783 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
784 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
785 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
786 self.assertRaises(ValueError, ast.literal_eval, '++6')
787 self.assertRaises(ValueError, ast.literal_eval, '+True')
788 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000789
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200790 def test_literal_eval_complex(self):
791 # Issue #4907
792 self.assertEqual(ast.literal_eval('6j'), 6j)
793 self.assertEqual(ast.literal_eval('-6j'), -6j)
794 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
795 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
796 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
797 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
798 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
799 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
800 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
801 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
802 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
803 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
804 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
805 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
806 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
807 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
808 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
809 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000810
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100811 def test_bad_integer(self):
812 # issue13436: Bad error message with invalid numeric values
813 body = [ast.ImportFrom(module='time',
814 names=[ast.alias(name='sleep')],
815 level=None,
816 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800817 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100818 with self.assertRaises(ValueError) as cm:
819 compile(mod, 'test', 'exec')
820 self.assertIn("invalid integer value: None", str(cm.exception))
821
Berker Peksag0a5bd512016-04-29 19:50:02 +0300822 def test_level_as_none(self):
823 body = [ast.ImportFrom(module='time',
824 names=[ast.alias(name='sleep')],
825 level=None,
826 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800827 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300828 code = compile(mod, 'test', 'exec')
829 ns = {}
830 exec(code, ns)
831 self.assertIn('sleep', ns)
832
Georg Brandl0c77a822008-06-10 16:37:50 +0000833
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500834class ASTValidatorTests(unittest.TestCase):
835
836 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
837 mod.lineno = mod.col_offset = 0
838 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300839 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500840 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300841 else:
842 with self.assertRaises(exc) as cm:
843 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500844 self.assertIn(msg, str(cm.exception))
845
846 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800847 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500848 self.mod(mod, msg, exc=exc)
849
850 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800851 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500852 self.mod(mod, msg)
853
854 def test_module(self):
855 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
856 self.mod(m, "must have Load context", "single")
857 m = ast.Expression(ast.Name("x", ast.Store()))
858 self.mod(m, "must have Load context", "eval")
859
860 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100861 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700862 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500863 defaults=None, kw_defaults=None):
864 if args is None:
865 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100866 if posonlyargs is None:
867 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500868 if kwonlyargs is None:
869 kwonlyargs = []
870 if defaults is None:
871 defaults = []
872 if kw_defaults is None:
873 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100874 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
875 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500876 return fac(args)
877 args = [ast.arg("x", ast.Name("x", ast.Store()))]
878 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100879 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500880 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500881 check(arguments(defaults=[ast.Num(3)]),
882 "more positional defaults than args")
883 check(arguments(kw_defaults=[ast.Num(4)]),
884 "length of kwonlyargs is not the same as kw_defaults")
885 args = [ast.arg("x", ast.Name("x", ast.Load()))]
886 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
887 "must have Load context")
888 args = [ast.arg("a", ast.Name("x", ast.Load())),
889 ast.arg("b", ast.Name("y", ast.Load()))]
890 check(arguments(kwonlyargs=args,
891 kw_defaults=[None, ast.Name("x", ast.Store())]),
892 "must have Load context")
893
894 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100895 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300896 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500897 self.stmt(f, "empty body on FunctionDef")
898 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300899 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500900 self.stmt(f, "must have Load context")
901 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300902 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500903 self.stmt(f, "must have Load context")
904 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300905 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500906 self._check_arguments(fac, self.stmt)
907
908 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400909 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500910 if bases is None:
911 bases = []
912 if keywords is None:
913 keywords = []
914 if body is None:
915 body = [ast.Pass()]
916 if decorator_list is None:
917 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400918 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300919 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500920 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
921 "must have Load context")
922 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
923 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500924 self.stmt(cls(body=[]), "empty body on ClassDef")
925 self.stmt(cls(body=[None]), "None disallowed")
926 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
927 "must have Load context")
928
929 def test_delete(self):
930 self.stmt(ast.Delete([]), "empty targets on Delete")
931 self.stmt(ast.Delete([None]), "None disallowed")
932 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
933 "must have Del context")
934
935 def test_assign(self):
936 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
937 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
938 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
939 "must have Store context")
940 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
941 ast.Name("y", ast.Store())),
942 "must have Load context")
943
944 def test_augassign(self):
945 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
946 ast.Name("y", ast.Load()))
947 self.stmt(aug, "must have Store context")
948 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
949 ast.Name("y", ast.Store()))
950 self.stmt(aug, "must have Load context")
951
952 def test_for(self):
953 x = ast.Name("x", ast.Store())
954 y = ast.Name("y", ast.Load())
955 p = ast.Pass()
956 self.stmt(ast.For(x, y, [], []), "empty body on For")
957 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
958 "must have Store context")
959 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
960 "must have Load context")
961 e = ast.Expr(ast.Name("x", ast.Store()))
962 self.stmt(ast.For(x, y, [e], []), "must have Load context")
963 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
964
965 def test_while(self):
966 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
967 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
968 "must have Load context")
969 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
970 [ast.Expr(ast.Name("x", ast.Store()))]),
971 "must have Load context")
972
973 def test_if(self):
974 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
975 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
976 self.stmt(i, "must have Load context")
977 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
978 self.stmt(i, "must have Load context")
979 i = ast.If(ast.Num(3), [ast.Pass()],
980 [ast.Expr(ast.Name("x", ast.Store()))])
981 self.stmt(i, "must have Load context")
982
983 def test_with(self):
984 p = ast.Pass()
985 self.stmt(ast.With([], [p]), "empty items on With")
986 i = ast.withitem(ast.Num(3), None)
987 self.stmt(ast.With([i], []), "empty body on With")
988 i = ast.withitem(ast.Name("x", ast.Store()), None)
989 self.stmt(ast.With([i], [p]), "must have Load context")
990 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
991 self.stmt(ast.With([i], [p]), "must have Store context")
992
993 def test_raise(self):
994 r = ast.Raise(None, ast.Num(3))
995 self.stmt(r, "Raise with cause but no exception")
996 r = ast.Raise(ast.Name("x", ast.Store()), None)
997 self.stmt(r, "must have Load context")
998 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
999 self.stmt(r, "must have Load context")
1000
1001 def test_try(self):
1002 p = ast.Pass()
1003 t = ast.Try([], [], [], [p])
1004 self.stmt(t, "empty body on Try")
1005 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1006 self.stmt(t, "must have Load context")
1007 t = ast.Try([p], [], [], [])
1008 self.stmt(t, "Try has neither except handlers nor finalbody")
1009 t = ast.Try([p], [], [p], [p])
1010 self.stmt(t, "Try has orelse but no except handlers")
1011 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1012 self.stmt(t, "empty body on ExceptHandler")
1013 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1014 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1015 e = [ast.ExceptHandler(None, "x", [p])]
1016 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1017 self.stmt(t, "must have Load context")
1018 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1019 self.stmt(t, "must have Load context")
1020
1021 def test_assert(self):
1022 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1023 "must have Load context")
1024 assrt = ast.Assert(ast.Name("x", ast.Load()),
1025 ast.Name("y", ast.Store()))
1026 self.stmt(assrt, "must have Load context")
1027
1028 def test_import(self):
1029 self.stmt(ast.Import([]), "empty names on Import")
1030
1031 def test_importfrom(self):
1032 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001033 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001034 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1035
1036 def test_global(self):
1037 self.stmt(ast.Global([]), "empty names on Global")
1038
1039 def test_nonlocal(self):
1040 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1041
1042 def test_expr(self):
1043 e = ast.Expr(ast.Name("x", ast.Store()))
1044 self.stmt(e, "must have Load context")
1045
1046 def test_boolop(self):
1047 b = ast.BoolOp(ast.And(), [])
1048 self.expr(b, "less than 2 values")
1049 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1050 self.expr(b, "less than 2 values")
1051 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1052 self.expr(b, "None disallowed")
1053 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1054 self.expr(b, "must have Load context")
1055
1056 def test_unaryop(self):
1057 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1058 self.expr(u, "must have Load context")
1059
1060 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001061 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001062 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1063 "must have Load context")
1064 def fac(args):
1065 return ast.Lambda(args, ast.Name("x", ast.Load()))
1066 self._check_arguments(fac, self.expr)
1067
1068 def test_ifexp(self):
1069 l = ast.Name("x", ast.Load())
1070 s = ast.Name("y", ast.Store())
1071 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001072 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001073
1074 def test_dict(self):
1075 d = ast.Dict([], [ast.Name("x", ast.Load())])
1076 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001077 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1078 self.expr(d, "None disallowed")
1079
1080 def test_set(self):
1081 self.expr(ast.Set([None]), "None disallowed")
1082 s = ast.Set([ast.Name("x", ast.Store())])
1083 self.expr(s, "must have Load context")
1084
1085 def _check_comprehension(self, fac):
1086 self.expr(fac([]), "comprehension with no generators")
1087 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001088 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001089 self.expr(fac([g]), "must have Store context")
1090 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001091 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001092 self.expr(fac([g]), "must have Load context")
1093 x = ast.Name("x", ast.Store())
1094 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001095 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001096 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001097 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001098 self.expr(fac([g]), "must have Load context")
1099
1100 def _simple_comp(self, fac):
1101 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001102 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001103 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1104 "must have Load context")
1105 def wrap(gens):
1106 return fac(ast.Name("x", ast.Store()), gens)
1107 self._check_comprehension(wrap)
1108
1109 def test_listcomp(self):
1110 self._simple_comp(ast.ListComp)
1111
1112 def test_setcomp(self):
1113 self._simple_comp(ast.SetComp)
1114
1115 def test_generatorexp(self):
1116 self._simple_comp(ast.GeneratorExp)
1117
1118 def test_dictcomp(self):
1119 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001120 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001121 c = ast.DictComp(ast.Name("x", ast.Store()),
1122 ast.Name("y", ast.Load()), [g])
1123 self.expr(c, "must have Load context")
1124 c = ast.DictComp(ast.Name("x", ast.Load()),
1125 ast.Name("y", ast.Store()), [g])
1126 self.expr(c, "must have Load context")
1127 def factory(comps):
1128 k = ast.Name("x", ast.Load())
1129 v = ast.Name("y", ast.Load())
1130 return ast.DictComp(k, v, comps)
1131 self._check_comprehension(factory)
1132
1133 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001134 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1135 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001136
1137 def test_compare(self):
1138 left = ast.Name("x", ast.Load())
1139 comp = ast.Compare(left, [ast.In()], [])
1140 self.expr(comp, "no comparators")
1141 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1142 self.expr(comp, "different number of comparators and operands")
1143 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001144 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001145 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001146 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001147
1148 def test_call(self):
1149 func = ast.Name("x", ast.Load())
1150 args = [ast.Name("y", ast.Load())]
1151 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001152 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001153 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001154 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001155 self.expr(call, "None disallowed")
1156 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001157 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001158 self.expr(call, "must have Load context")
1159
1160 def test_num(self):
1161 class subint(int):
1162 pass
1163 class subfloat(float):
1164 pass
1165 class subcomplex(complex):
1166 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001167 for obj in "0", "hello":
1168 self.expr(ast.Num(obj))
1169 for obj in subint(), subfloat(), subcomplex():
1170 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001171
1172 def test_attribute(self):
1173 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1174 self.expr(attr, "must have Load context")
1175
1176 def test_subscript(self):
1177 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1178 ast.Load())
1179 self.expr(sub, "must have Load context")
1180 x = ast.Name("x", ast.Load())
1181 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1182 ast.Load())
1183 self.expr(sub, "must have Load context")
1184 s = ast.Name("x", ast.Store())
1185 for args in (s, None, None), (None, s, None), (None, None, s):
1186 sl = ast.Slice(*args)
1187 self.expr(ast.Subscript(x, sl, ast.Load()),
1188 "must have Load context")
1189 sl = ast.ExtSlice([])
1190 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1191 sl = ast.ExtSlice([ast.Index(s)])
1192 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1193
1194 def test_starred(self):
1195 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1196 ast.Store())
1197 assign = ast.Assign([left], ast.Num(4))
1198 self.stmt(assign, "must have Store context")
1199
1200 def _sequence(self, fac):
1201 self.expr(fac([None], ast.Load()), "None disallowed")
1202 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1203 "must have Load context")
1204
1205 def test_list(self):
1206 self._sequence(ast.List)
1207
1208 def test_tuple(self):
1209 self._sequence(ast.Tuple)
1210
Benjamin Peterson442f2092012-12-06 17:41:04 -05001211 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001212 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001213
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001214 def test_stdlib_validates(self):
1215 stdlib = os.path.dirname(ast.__file__)
1216 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1217 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1218 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001219 with self.subTest(module):
1220 fn = os.path.join(stdlib, module)
1221 with open(fn, "r", encoding="utf-8") as fp:
1222 source = fp.read()
1223 mod = ast.parse(source, fn)
1224 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001225
1226
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001227class ConstantTests(unittest.TestCase):
1228 """Tests on the ast.Constant node type."""
1229
1230 def compile_constant(self, value):
1231 tree = ast.parse("x = 123")
1232
1233 node = tree.body[0].value
1234 new_node = ast.Constant(value=value)
1235 ast.copy_location(new_node, node)
1236 tree.body[0].value = new_node
1237
1238 code = compile(tree, "<string>", "exec")
1239
1240 ns = {}
1241 exec(code, ns)
1242 return ns['x']
1243
Victor Stinnerbe59d142016-01-27 00:39:12 +01001244 def test_validation(self):
1245 with self.assertRaises(TypeError) as cm:
1246 self.compile_constant([1, 2, 3])
1247 self.assertEqual(str(cm.exception),
1248 "got an invalid type in Constant: list")
1249
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001250 def test_singletons(self):
1251 for const in (None, False, True, Ellipsis, b'', frozenset()):
1252 with self.subTest(const=const):
1253 value = self.compile_constant(const)
1254 self.assertIs(value, const)
1255
1256 def test_values(self):
1257 nested_tuple = (1,)
1258 nested_frozenset = frozenset({1})
1259 for level in range(3):
1260 nested_tuple = (nested_tuple, 2)
1261 nested_frozenset = frozenset({nested_frozenset, 2})
1262 values = (123, 123.0, 123j,
1263 "unicode", b'bytes',
1264 tuple("tuple"), frozenset("frozenset"),
1265 nested_tuple, nested_frozenset)
1266 for value in values:
1267 with self.subTest(value=value):
1268 result = self.compile_constant(value)
1269 self.assertEqual(result, value)
1270
1271 def test_assign_to_constant(self):
1272 tree = ast.parse("x = 1")
1273
1274 target = tree.body[0].targets[0]
1275 new_target = ast.Constant(value=1)
1276 ast.copy_location(new_target, target)
1277 tree.body[0].targets[0] = new_target
1278
1279 with self.assertRaises(ValueError) as cm:
1280 compile(tree, "string", "exec")
1281 self.assertEqual(str(cm.exception),
1282 "expression which can't be assigned "
1283 "to in Store context")
1284
1285 def test_get_docstring(self):
1286 tree = ast.parse("'docstring'\nx = 1")
1287 self.assertEqual(ast.get_docstring(tree), 'docstring')
1288
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001289 def get_load_const(self, tree):
1290 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1291 # instructions
1292 co = compile(tree, '<string>', 'exec')
1293 consts = []
1294 for instr in dis.get_instructions(co):
1295 if instr.opname == 'LOAD_CONST':
1296 consts.append(instr.argval)
1297 return consts
1298
1299 @support.cpython_only
1300 def test_load_const(self):
1301 consts = [None,
1302 True, False,
1303 124,
1304 2.0,
1305 3j,
1306 "unicode",
1307 b'bytes',
1308 (1, 2, 3)]
1309
Victor Stinnera2724092016-02-08 18:17:58 +01001310 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1311 code += '\nx = ...'
1312 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001313
1314 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001315 self.assertEqual(self.get_load_const(tree),
1316 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001317
1318 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001319 for assign, const in zip(tree.body, consts):
1320 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001321 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001322 ast.copy_location(new_node, assign.value)
1323 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001324
Victor Stinnera2724092016-02-08 18:17:58 +01001325 self.assertEqual(self.get_load_const(tree),
1326 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001327
1328 def test_literal_eval(self):
1329 tree = ast.parse("1 + 2")
1330 binop = tree.body[0].value
1331
1332 new_left = ast.Constant(value=10)
1333 ast.copy_location(new_left, binop.left)
1334 binop.left = new_left
1335
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001336 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001337 ast.copy_location(new_right, binop.right)
1338 binop.right = new_right
1339
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001340 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001341
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001342 def test_string_kind(self):
1343 c = ast.parse('"x"', mode='eval').body
1344 self.assertEqual(c.value, "x")
1345 self.assertEqual(c.kind, None)
1346
1347 c = ast.parse('u"x"', mode='eval').body
1348 self.assertEqual(c.value, "x")
1349 self.assertEqual(c.kind, "u")
1350
1351 c = ast.parse('r"x"', mode='eval').body
1352 self.assertEqual(c.value, "x")
1353 self.assertEqual(c.kind, None)
1354
1355 c = ast.parse('b"x"', mode='eval').body
1356 self.assertEqual(c.value, b"x")
1357 self.assertEqual(c.kind, None)
1358
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001359
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001360class EndPositionTests(unittest.TestCase):
1361 """Tests for end position of AST nodes.
1362
1363 Testing end positions of nodes requires a bit of extra care
1364 because of how LL parsers work.
1365 """
1366 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1367 self.assertEqual(ast_node.end_lineno, end_lineno)
1368 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1369
1370 def _check_content(self, source, ast_node, content):
1371 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1372
1373 def _parse_value(self, s):
1374 # Use duck-typing to support both single expression
1375 # and a right hand side of an assignment statement.
1376 return ast.parse(s).body[0].value
1377
1378 def test_lambda(self):
1379 s = 'lambda x, *y: None'
1380 lam = self._parse_value(s)
1381 self._check_content(s, lam.body, 'None')
1382 self._check_content(s, lam.args.args[0], 'x')
1383 self._check_content(s, lam.args.vararg, 'y')
1384
1385 def test_func_def(self):
1386 s = dedent('''
1387 def func(x: int,
1388 *args: str,
1389 z: float = 0,
1390 **kwargs: Any) -> bool:
1391 return True
1392 ''').strip()
1393 fdef = ast.parse(s).body[0]
1394 self._check_end_pos(fdef, 5, 15)
1395 self._check_content(s, fdef.body[0], 'return True')
1396 self._check_content(s, fdef.args.args[0], 'x: int')
1397 self._check_content(s, fdef.args.args[0].annotation, 'int')
1398 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1399 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1400
1401 def test_call(self):
1402 s = 'func(x, y=2, **kw)'
1403 call = self._parse_value(s)
1404 self._check_content(s, call.func, 'func')
1405 self._check_content(s, call.keywords[0].value, '2')
1406 self._check_content(s, call.keywords[1].value, 'kw')
1407
1408 def test_call_noargs(self):
1409 s = 'x[0]()'
1410 call = self._parse_value(s)
1411 self._check_content(s, call.func, 'x[0]')
1412 self._check_end_pos(call, 1, 6)
1413
1414 def test_class_def(self):
1415 s = dedent('''
1416 class C(A, B):
1417 x: int = 0
1418 ''').strip()
1419 cdef = ast.parse(s).body[0]
1420 self._check_end_pos(cdef, 2, 14)
1421 self._check_content(s, cdef.bases[1], 'B')
1422 self._check_content(s, cdef.body[0], 'x: int = 0')
1423
1424 def test_class_kw(self):
1425 s = 'class S(metaclass=abc.ABCMeta): pass'
1426 cdef = ast.parse(s).body[0]
1427 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1428
1429 def test_multi_line_str(self):
1430 s = dedent('''
1431 x = """Some multi-line text.
1432
1433 It goes on starting from same indent."""
1434 ''').strip()
1435 assign = ast.parse(s).body[0]
1436 self._check_end_pos(assign, 3, 40)
1437 self._check_end_pos(assign.value, 3, 40)
1438
1439 def test_continued_str(self):
1440 s = dedent('''
1441 x = "first part" \\
1442 "second part"
1443 ''').strip()
1444 assign = ast.parse(s).body[0]
1445 self._check_end_pos(assign, 2, 13)
1446 self._check_end_pos(assign.value, 2, 13)
1447
1448 def test_suites(self):
1449 # We intentionally put these into the same string to check
1450 # that empty lines are not part of the suite.
1451 s = dedent('''
1452 while True:
1453 pass
1454
1455 if one():
1456 x = None
1457 elif other():
1458 y = None
1459 else:
1460 z = None
1461
1462 for x, y in stuff:
1463 assert True
1464
1465 try:
1466 raise RuntimeError
1467 except TypeError as e:
1468 pass
1469
1470 pass
1471 ''').strip()
1472 mod = ast.parse(s)
1473 while_loop = mod.body[0]
1474 if_stmt = mod.body[1]
1475 for_loop = mod.body[2]
1476 try_stmt = mod.body[3]
1477 pass_stmt = mod.body[4]
1478
1479 self._check_end_pos(while_loop, 2, 8)
1480 self._check_end_pos(if_stmt, 9, 12)
1481 self._check_end_pos(for_loop, 12, 15)
1482 self._check_end_pos(try_stmt, 17, 8)
1483 self._check_end_pos(pass_stmt, 19, 4)
1484
1485 self._check_content(s, while_loop.test, 'True')
1486 self._check_content(s, if_stmt.body[0], 'x = None')
1487 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1488 self._check_content(s, for_loop.target, 'x, y')
1489 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1490 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1491
1492 def test_fstring(self):
1493 s = 'x = f"abc {x + y} abc"'
1494 fstr = self._parse_value(s)
1495 binop = fstr.values[1].value
1496 self._check_content(s, binop, 'x + y')
1497
1498 def test_fstring_multi_line(self):
1499 s = dedent('''
1500 f"""Some multi-line text.
1501 {
1502 arg_one
1503 +
1504 arg_two
1505 }
1506 It goes on..."""
1507 ''').strip()
1508 fstr = self._parse_value(s)
1509 binop = fstr.values[1].value
1510 self._check_end_pos(binop, 5, 7)
1511 self._check_content(s, binop.left, 'arg_one')
1512 self._check_content(s, binop.right, 'arg_two')
1513
1514 def test_import_from_multi_line(self):
1515 s = dedent('''
1516 from x.y.z import (
1517 a, b, c as c
1518 )
1519 ''').strip()
1520 imp = ast.parse(s).body[0]
1521 self._check_end_pos(imp, 3, 1)
1522
1523 def test_slices(self):
1524 s1 = 'f()[1, 2] [0]'
1525 s2 = 'x[ a.b: c.d]'
1526 sm = dedent('''
1527 x[ a.b: f () ,
1528 g () : c.d
1529 ]
1530 ''').strip()
1531 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1532 self._check_content(s1, i1.value, 'f()[1, 2]')
1533 self._check_content(s1, i1.value.slice.value, '1, 2')
1534 self._check_content(s2, i2.slice.lower, 'a.b')
1535 self._check_content(s2, i2.slice.upper, 'c.d')
1536 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1537 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1538 self._check_end_pos(im, 3, 3)
1539
1540 def test_binop(self):
1541 s = dedent('''
1542 (1 * 2 + (3 ) +
1543 4
1544 )
1545 ''').strip()
1546 binop = self._parse_value(s)
1547 self._check_end_pos(binop, 2, 6)
1548 self._check_content(s, binop.right, '4')
1549 self._check_content(s, binop.left, '1 * 2 + (3 )')
1550 self._check_content(s, binop.left.right, '3')
1551
1552 def test_boolop(self):
1553 s = dedent('''
1554 if (one_condition and
1555 (other_condition or yet_another_one)):
1556 pass
1557 ''').strip()
1558 bop = ast.parse(s).body[0].test
1559 self._check_end_pos(bop, 2, 44)
1560 self._check_content(s, bop.values[1],
1561 'other_condition or yet_another_one')
1562
1563 def test_tuples(self):
1564 s1 = 'x = () ;'
1565 s2 = 'x = 1 , ;'
1566 s3 = 'x = (1 , 2 ) ;'
1567 sm = dedent('''
1568 x = (
1569 a, b,
1570 )
1571 ''').strip()
1572 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1573 self._check_content(s1, t1, '()')
1574 self._check_content(s2, t2, '1 ,')
1575 self._check_content(s3, t3, '(1 , 2 )')
1576 self._check_end_pos(tm, 3, 1)
1577
1578 def test_attribute_spaces(self):
1579 s = 'func(x. y .z)'
1580 call = self._parse_value(s)
1581 self._check_content(s, call, s)
1582 self._check_content(s, call.args[0], 'x. y .z')
1583
1584 def test_displays(self):
1585 s1 = '[{}, {1, }, {1, 2,} ]'
1586 s2 = '{a: b, f (): g () ,}'
1587 c1 = self._parse_value(s1)
1588 c2 = self._parse_value(s2)
1589 self._check_content(s1, c1.elts[0], '{}')
1590 self._check_content(s1, c1.elts[1], '{1, }')
1591 self._check_content(s1, c1.elts[2], '{1, 2,}')
1592 self._check_content(s2, c2.keys[1], 'f ()')
1593 self._check_content(s2, c2.values[1], 'g ()')
1594
1595 def test_comprehensions(self):
1596 s = dedent('''
1597 x = [{x for x, y in stuff
1598 if cond.x} for stuff in things]
1599 ''').strip()
1600 cmp = self._parse_value(s)
1601 self._check_end_pos(cmp, 2, 37)
1602 self._check_content(s, cmp.generators[0].iter, 'things')
1603 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1604 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1605 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1606
1607 def test_yield_await(self):
1608 s = dedent('''
1609 async def f():
1610 yield x
1611 await y
1612 ''').strip()
1613 fdef = ast.parse(s).body[0]
1614 self._check_content(s, fdef.body[0].value, 'yield x')
1615 self._check_content(s, fdef.body[1].value, 'await y')
1616
1617 def test_source_segment_multi(self):
1618 s_orig = dedent('''
1619 x = (
1620 a, b,
1621 ) + ()
1622 ''').strip()
1623 s_tuple = dedent('''
1624 (
1625 a, b,
1626 )
1627 ''').strip()
1628 binop = self._parse_value(s_orig)
1629 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1630
1631 def test_source_segment_padded(self):
1632 s_orig = dedent('''
1633 class C:
1634 def fun(self) -> None:
1635 "ЖЖЖЖЖ"
1636 ''').strip()
1637 s_method = ' def fun(self) -> None:\n' \
1638 ' "ЖЖЖЖЖ"'
1639 cdef = ast.parse(s_orig).body[0]
1640 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1641 s_method)
1642
1643 def test_source_segment_endings(self):
1644 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1645 v, w, x, y, z = ast.parse(s).body
1646 self._check_content(s, v, 'v = 1')
1647 self._check_content(s, w, 'w = 1')
1648 self._check_content(s, x, 'x = 1')
1649 self._check_content(s, y, 'y = 1')
1650 self._check_content(s, z, 'z = 1')
1651
1652 def test_source_segment_tabs(self):
1653 s = dedent('''
1654 class C:
1655 \t\f def fun(self) -> None:
1656 \t\f pass
1657 ''').strip()
1658 s_method = ' \t\f def fun(self) -> None:\n' \
1659 ' \t\f pass'
1660
1661 cdef = ast.parse(s).body[0]
1662 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1663
1664
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001665def main():
1666 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001667 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001668 if sys.argv[1:] == ['-g']:
1669 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1670 (eval_tests, "eval")):
1671 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001672 for statement in statements:
1673 tree = ast.parse(statement, "?", kind)
1674 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001675 print("]")
1676 print("main()")
1677 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001678 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001679
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001680#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001681exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001682('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1683('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001684('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1685('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 +02001686('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1687('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 +01001688('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1689('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 +02001690('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 -08001691('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001692('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001693('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001694('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 -08001695('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001696('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001697('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1698('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1699('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 -07001700('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001701('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1702('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1703('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1704('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1705('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 -07001706('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 -08001707('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1708('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1709('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1710('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1711('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1712('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001713('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001714('Module', [('Pass', (1, 0))], []),
1715('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1716('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1717('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)], []),
1718('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)], []),
1719('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)], []),
1720('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)]))], []),
1721('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)]))], []),
1722('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)]))], []),
1723('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)]))], []),
1724('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 +01001725('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)], []),
1726('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)], []),
1727('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 -07001728('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)]))], []),
1729('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 +01001730('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)], []),
1731('Module', [('FunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
1732('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001733('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001734('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 +00001735('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Pablo Galindocd6e83b2019-07-15 01:32:18 +02001736('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1737('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)], []),
1738('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)], []),
1739('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)], []),
1740('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1741('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)], []),
1742('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)], []),
1743('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)], []),
1744('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)], []),
1745('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 +00001746]
1747single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001748('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 +00001749]
1750eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001751('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001752('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1753('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1754('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001755('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001756('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001757('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001758('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1759('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001760('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)])),
1761('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)])),
1762('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)])),
1763('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)])),
1764('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)])),
1765('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)])),
1766('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)])),
1767('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)])),
1768('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)])),
1769('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)])),
1770('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 -07001771('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1772('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 +02001773('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 -07001774('Expression', ('Constant', (1, 0), 10, None)),
1775('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001776('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1777('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 +00001778('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001779('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 -05001780('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001781('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1782('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 -05001783('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001784('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 +00001785]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001786main()