blob: a7ee0da38d48340a882cc268e0b9b9c915d08bc7 [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",
Tim Peters400cbc32006-02-28 18:44:41 +0000138]
139
140# These are compiled through "single"
141# because of overlap with "eval", it just tests what
142# can't be tested with "eval"
143single_tests = [
144 "1+2"
145]
146
147# These are compiled through "eval"
148# It should test all expressions
149eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500150 # None
151 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000152 # BoolOp
153 "a and b",
154 # BinOp
155 "a + b",
156 # UnaryOp
157 "not v",
158 # Lambda
159 "lambda:None",
160 # Dict
161 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500162 # Empty dict
163 "{}",
164 # Set
165 "{None,}",
166 # Multiline dict (test for .lineno & .col_offset)
167 """{
168 1
169 :
170 2
171 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000172 # ListComp
173 "[a for b in c if d]",
174 # GeneratorExp
175 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200176 # Comprehensions with multiple for targets
177 "[(a,b) for a,b in c]",
178 "[(a,b) for (a,b) in c]",
179 "[(a,b) for [a,b] in c]",
180 "{(a,b) for a,b in c}",
181 "{(a,b) for (a,b) in c}",
182 "{(a,b) for [a,b] in c}",
183 "((a,b) for a,b in c)",
184 "((a,b) for (a,b) in c)",
185 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000186 # Yield - yield expressions can't work outside a function
187 #
188 # Compare
189 "1 < 2 < 3",
190 # Call
191 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200192 # Call with a generator argument
193 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000194 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000195 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000196 # Str
197 "'string'",
198 # Attribute
199 "a.b",
200 # Subscript
201 "a[b:c]",
202 # Name
203 "v",
204 # List
205 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500206 # Empty list
207 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000208 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000209 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500210 # Tuple
211 "(1,2,3)",
212 # Empty tuple
213 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000214 # Combination
215 "a.b.c.d(a.b[1:2])",
216
Tim Peters400cbc32006-02-28 18:44:41 +0000217]
218
219# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
220# excepthandler, arguments, keywords, alias
221
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000222class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000223
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500224 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000225 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000226 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000227 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000228 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200229 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000230 parent_pos = (ast_node.lineno, ast_node.col_offset)
231 for name in ast_node._fields:
232 value = getattr(ast_node, name)
233 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200234 first_pos = parent_pos
235 if value and name == 'decorator_list':
236 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000237 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200238 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000239 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500240 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000241
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500242 def test_AST_objects(self):
243 x = ast.AST()
244 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700245 x.foobar = 42
246 self.assertEqual(x.foobar, 42)
247 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500248
249 with self.assertRaises(AttributeError):
250 x.vararg
251
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500252 with self.assertRaises(TypeError):
253 # "_ast.AST constructor takes 0 positional arguments"
254 ast.AST(2)
255
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700256 def test_AST_garbage_collection(self):
257 class X:
258 pass
259 a = ast.AST()
260 a.x = X()
261 a.x.a = a
262 ref = weakref.ref(a.x)
263 del a
264 support.gc_collect()
265 self.assertIsNone(ref())
266
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000267 def test_snippets(self):
268 for input, output, kind in ((exec_tests, exec_results, "exec"),
269 (single_tests, single_results, "single"),
270 (eval_tests, eval_results, "eval")):
271 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400272 with self.subTest(action="parsing", input=i):
273 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
274 self.assertEqual(to_tuple(ast_tree), o)
275 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100276 with self.subTest(action="compiling", input=i, kind=kind):
277 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000278
Benjamin Peterson78565b22009-06-28 19:19:51 +0000279 def test_slice(self):
280 slc = ast.parse("x[::]").body[0].value.slice
281 self.assertIsNone(slc.upper)
282 self.assertIsNone(slc.lower)
283 self.assertIsNone(slc.step)
284
285 def test_from_import(self):
286 im = ast.parse("from . import y").body[0]
287 self.assertIsNone(im.module)
288
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400289 def test_non_interned_future_from_ast(self):
290 mod = ast.parse("from __future__ import division")
291 self.assertIsInstance(mod.body[0], ast.ImportFrom)
292 mod.body[0].module = " __future__ ".strip()
293 compile(mod, "<test>", "exec")
294
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000295 def test_base_classes(self):
296 self.assertTrue(issubclass(ast.For, ast.stmt))
297 self.assertTrue(issubclass(ast.Name, ast.expr))
298 self.assertTrue(issubclass(ast.stmt, ast.AST))
299 self.assertTrue(issubclass(ast.expr, ast.AST))
300 self.assertTrue(issubclass(ast.comprehension, ast.AST))
301 self.assertTrue(issubclass(ast.Gt, ast.AST))
302
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500303 def test_field_attr_existence(self):
304 for name, item in ast.__dict__.items():
305 if isinstance(item, type) and name != 'AST' and name[0].isupper():
306 x = item()
307 if isinstance(x, ast.AST):
308 self.assertEqual(type(x._fields), tuple)
309
310 def test_arguments(self):
311 x = ast.arguments()
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500312 self.assertEqual(x._fields, ('args', 'vararg', 'kwonlyargs',
313 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500314
315 with self.assertRaises(AttributeError):
316 x.vararg
317
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700318 x = ast.arguments(*range(1, 7))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500319 self.assertEqual(x.vararg, 2)
320
321 def test_field_attr_writable(self):
322 x = ast.Num()
323 # We can assign to _fields
324 x._fields = 666
325 self.assertEqual(x._fields, 666)
326
327 def test_classattrs(self):
328 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700329 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300330
331 with self.assertRaises(AttributeError):
332 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500333
334 with self.assertRaises(AttributeError):
335 x.n
336
337 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300338 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500339 self.assertEqual(x.n, 42)
340
341 with self.assertRaises(AttributeError):
342 x.lineno
343
344 with self.assertRaises(AttributeError):
345 x.foobar
346
347 x = ast.Num(lineno=2)
348 self.assertEqual(x.lineno, 2)
349
350 x = ast.Num(42, lineno=0)
351 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700352 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300353 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500354 self.assertEqual(x.n, 42)
355
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700356 self.assertRaises(TypeError, ast.Num, 1, None, 2)
357 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500358
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300359 self.assertEqual(ast.Num(42).n, 42)
360 self.assertEqual(ast.Num(4.25).n, 4.25)
361 self.assertEqual(ast.Num(4.25j).n, 4.25j)
362 self.assertEqual(ast.Str('42').s, '42')
363 self.assertEqual(ast.Bytes(b'42').s, b'42')
364 self.assertIs(ast.NameConstant(True).value, True)
365 self.assertIs(ast.NameConstant(False).value, False)
366 self.assertIs(ast.NameConstant(None).value, None)
367
368 self.assertEqual(ast.Constant(42).value, 42)
369 self.assertEqual(ast.Constant(4.25).value, 4.25)
370 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
371 self.assertEqual(ast.Constant('42').value, '42')
372 self.assertEqual(ast.Constant(b'42').value, b'42')
373 self.assertIs(ast.Constant(True).value, True)
374 self.assertIs(ast.Constant(False).value, False)
375 self.assertIs(ast.Constant(None).value, None)
376 self.assertIs(ast.Constant(...).value, ...)
377
378 def test_realtype(self):
379 self.assertEqual(type(ast.Num(42)), ast.Constant)
380 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
381 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
382 self.assertEqual(type(ast.Str('42')), ast.Constant)
383 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
384 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
385 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
386 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
387 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
388
389 def test_isinstance(self):
390 self.assertTrue(isinstance(ast.Num(42), ast.Num))
391 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
392 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
393 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
394 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
395 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
396 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
397 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
398 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
399
400 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
401 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
402 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
403 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
404 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
405 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
406 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
407 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
408 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
409
410 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
411 self.assertFalse(isinstance(ast.Num(42), ast.Str))
412 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
413 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
414 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800415 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
416 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300417
418 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
419 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
420 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
421 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
422 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800423 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
424 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300425
426 self.assertFalse(isinstance(ast.Constant(), ast.Num))
427 self.assertFalse(isinstance(ast.Constant(), ast.Str))
428 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
429 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
430 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
431
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200432 class S(str): pass
433 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
434 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
435
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300436 def test_subclasses(self):
437 class N(ast.Num):
438 def __init__(self, *args, **kwargs):
439 super().__init__(*args, **kwargs)
440 self.z = 'spam'
441 class N2(ast.Num):
442 pass
443
444 n = N(42)
445 self.assertEqual(n.n, 42)
446 self.assertEqual(n.z, 'spam')
447 self.assertEqual(type(n), N)
448 self.assertTrue(isinstance(n, N))
449 self.assertTrue(isinstance(n, ast.Num))
450 self.assertFalse(isinstance(n, N2))
451 self.assertFalse(isinstance(ast.Num(42), N))
452 n = N(n=42)
453 self.assertEqual(n.n, 42)
454 self.assertEqual(type(n), N)
455
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500456 def test_module(self):
457 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800458 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500459 self.assertEqual(x.body, body)
460
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000461 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100462 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500463 x = ast.BinOp()
464 self.assertEqual(x._fields, ('left', 'op', 'right'))
465
466 # Random attribute allowed too
467 x.foobarbaz = 5
468 self.assertEqual(x.foobarbaz, 5)
469
470 n1 = ast.Num(1)
471 n3 = ast.Num(3)
472 addop = ast.Add()
473 x = ast.BinOp(n1, addop, n3)
474 self.assertEqual(x.left, n1)
475 self.assertEqual(x.op, addop)
476 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500477
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500478 x = ast.BinOp(1, 2, 3)
479 self.assertEqual(x.left, 1)
480 self.assertEqual(x.op, 2)
481 self.assertEqual(x.right, 3)
482
Georg Brandl0c77a822008-06-10 16:37:50 +0000483 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000484 self.assertEqual(x.left, 1)
485 self.assertEqual(x.op, 2)
486 self.assertEqual(x.right, 3)
487 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000488
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500489 # node raises exception when given too many arguments
490 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500491 # node raises exception when given too many arguments
492 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000493
494 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000495 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000496 self.assertEqual(x.left, 1)
497 self.assertEqual(x.op, 2)
498 self.assertEqual(x.right, 3)
499 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000500
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500501 # Random kwargs also allowed
502 x = ast.BinOp(1, 2, 3, foobarbaz=42)
503 self.assertEqual(x.foobarbaz, 42)
504
505 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000506 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000507 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500508 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000509
510 def test_pickling(self):
511 import pickle
512 mods = [pickle]
513 try:
514 import cPickle
515 mods.append(cPickle)
516 except ImportError:
517 pass
518 protocols = [0, 1, 2]
519 for mod in mods:
520 for protocol in protocols:
521 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
522 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000523 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000524
Benjamin Peterson5b066812010-11-20 01:38:49 +0000525 def test_invalid_sum(self):
526 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800527 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000528 with self.assertRaises(TypeError) as cm:
529 compile(m, "<test>", "exec")
530 self.assertIn("but got <_ast.expr", str(cm.exception))
531
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500532 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800533 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500534 ast.fix_missing_locations(m)
535 with self.assertRaises(TypeError) as cm:
536 compile(m, "<test>", "exec")
537 self.assertIn("identifier must be of type str", str(cm.exception))
538
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000539 def test_empty_yield_from(self):
540 # Issue 16546: yield from value is not optional.
541 empty_yield_from = ast.parse("def f():\n yield from g()")
542 empty_yield_from.body[0].body[0].value.value = None
543 with self.assertRaises(ValueError) as cm:
544 compile(empty_yield_from, "<test>", "exec")
545 self.assertIn("field value is required", str(cm.exception))
546
Oren Milman7dc46d82017-09-30 20:16:24 +0300547 @support.cpython_only
548 def test_issue31592(self):
549 # There shouldn't be an assertion failure in case of a bad
550 # unicodedata.normalize().
551 import unicodedata
552 def bad_normalize(*args):
553 return None
554 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
555 self.assertRaises(TypeError, ast.parse, '\u03D5')
556
Georg Brandl0c77a822008-06-10 16:37:50 +0000557
558class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700559 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000560
561 def test_parse(self):
562 a = ast.parse('foo(1 + 1)')
563 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
564 self.assertEqual(ast.dump(a), ast.dump(b))
565
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400566 def test_parse_in_error(self):
567 try:
568 1/0
569 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400570 with self.assertRaises(SyntaxError) as e:
571 ast.literal_eval(r"'\U'")
572 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400573
Georg Brandl0c77a822008-06-10 16:37:50 +0000574 def test_dump(self):
575 node = ast.parse('spam(eggs, "and cheese")')
576 self.assertEqual(ast.dump(node),
577 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700578 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800579 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000580 )
581 self.assertEqual(ast.dump(node, annotate_fields=False),
582 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700583 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000584 )
585 self.assertEqual(ast.dump(node, include_attributes=True),
586 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000587 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
588 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700589 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000590 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
591 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800592 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000593 )
594
595 def test_copy_location(self):
596 src = ast.parse('1 + 1', mode='eval')
597 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
598 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700599 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000600 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
601 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
602 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000603 )
604
605 def test_fix_missing_locations(self):
606 src = ast.parse('write("spam")')
607 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400608 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000609 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000610 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000611 self.assertEqual(ast.dump(src, include_attributes=True),
612 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000613 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700614 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000615 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
616 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
617 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
618 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
619 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
620 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800621 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
622 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000623 )
624
625 def test_increment_lineno(self):
626 src = ast.parse('1 + 1', mode='eval')
627 self.assertEqual(ast.increment_lineno(src, n=3), src)
628 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700629 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
630 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000631 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
632 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000633 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000634 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000635 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000636 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
637 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700638 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
639 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000640 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
641 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000642 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000643
644 def test_iter_fields(self):
645 node = ast.parse('foo()', mode='eval')
646 d = dict(ast.iter_fields(node.body))
647 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400648 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000649
650 def test_iter_child_nodes(self):
651 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
652 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
653 iterator = ast.iter_child_nodes(node.body)
654 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300655 self.assertEqual(next(iterator).value, 23)
656 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000657 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700658 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000659 )
660
661 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300662 node = ast.parse('"""line one\n line two"""')
663 self.assertEqual(ast.get_docstring(node),
664 'line one\nline two')
665
666 node = ast.parse('class foo:\n """line one\n line two"""')
667 self.assertEqual(ast.get_docstring(node.body[0]),
668 'line one\nline two')
669
Georg Brandl0c77a822008-06-10 16:37:50 +0000670 node = ast.parse('def foo():\n """line one\n line two"""')
671 self.assertEqual(ast.get_docstring(node.body[0]),
672 'line one\nline two')
673
Yury Selivanov2f07a662015-07-23 08:54:35 +0300674 node = ast.parse('async def foo():\n """spam\n ham"""')
675 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300676
677 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800678 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300679 node = ast.parse('x = "not docstring"')
680 self.assertIsNone(ast.get_docstring(node))
681 node = ast.parse('def foo():\n pass')
682 self.assertIsNone(ast.get_docstring(node))
683
684 node = ast.parse('class foo:\n pass')
685 self.assertIsNone(ast.get_docstring(node.body[0]))
686 node = ast.parse('class foo:\n x = "not docstring"')
687 self.assertIsNone(ast.get_docstring(node.body[0]))
688 node = ast.parse('class foo:\n def bar(self): pass')
689 self.assertIsNone(ast.get_docstring(node.body[0]))
690
691 node = ast.parse('def foo():\n pass')
692 self.assertIsNone(ast.get_docstring(node.body[0]))
693 node = ast.parse('def foo():\n x = "not docstring"')
694 self.assertIsNone(ast.get_docstring(node.body[0]))
695
696 node = ast.parse('async def foo():\n pass')
697 self.assertIsNone(ast.get_docstring(node.body[0]))
698 node = ast.parse('async def foo():\n x = "not docstring"')
699 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300700
Anthony Sottile995d9b92019-01-12 20:05:13 -0800701 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
702 node = ast.parse(
703 '"""line one\nline two"""\n\n'
704 'def foo():\n """line one\n line two"""\n\n'
705 ' def bar():\n """line one\n line two"""\n'
706 ' """line one\n line two"""\n'
707 '"""line one\nline two"""\n\n'
708 )
709 self.assertEqual(node.body[0].col_offset, 0)
710 self.assertEqual(node.body[0].lineno, 1)
711 self.assertEqual(node.body[1].body[0].col_offset, 2)
712 self.assertEqual(node.body[1].body[0].lineno, 5)
713 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
714 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
715 self.assertEqual(node.body[1].body[2].col_offset, 2)
716 self.assertEqual(node.body[1].body[2].lineno, 11)
717 self.assertEqual(node.body[2].col_offset, 0)
718 self.assertEqual(node.body[2].lineno, 13)
719
Georg Brandl0c77a822008-06-10 16:37:50 +0000720 def test_literal_eval(self):
721 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
722 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
723 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000724 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000725 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000726 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200727 self.assertEqual(ast.literal_eval('6'), 6)
728 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000729 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000730 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200731 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
732 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
733 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
734 self.assertRaises(ValueError, ast.literal_eval, '++6')
735 self.assertRaises(ValueError, ast.literal_eval, '+True')
736 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000737
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200738 def test_literal_eval_complex(self):
739 # Issue #4907
740 self.assertEqual(ast.literal_eval('6j'), 6j)
741 self.assertEqual(ast.literal_eval('-6j'), -6j)
742 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
743 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
744 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
745 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
746 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
747 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
748 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
749 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
750 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
751 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
752 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
753 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
754 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
755 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
756 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
757 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000758
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100759 def test_bad_integer(self):
760 # issue13436: Bad error message with invalid numeric values
761 body = [ast.ImportFrom(module='time',
762 names=[ast.alias(name='sleep')],
763 level=None,
764 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800765 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100766 with self.assertRaises(ValueError) as cm:
767 compile(mod, 'test', 'exec')
768 self.assertIn("invalid integer value: None", str(cm.exception))
769
Berker Peksag0a5bd512016-04-29 19:50:02 +0300770 def test_level_as_none(self):
771 body = [ast.ImportFrom(module='time',
772 names=[ast.alias(name='sleep')],
773 level=None,
774 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800775 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300776 code = compile(mod, 'test', 'exec')
777 ns = {}
778 exec(code, ns)
779 self.assertIn('sleep', ns)
780
Georg Brandl0c77a822008-06-10 16:37:50 +0000781
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500782class ASTValidatorTests(unittest.TestCase):
783
784 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
785 mod.lineno = mod.col_offset = 0
786 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300787 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500788 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300789 else:
790 with self.assertRaises(exc) as cm:
791 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500792 self.assertIn(msg, str(cm.exception))
793
794 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800795 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500796 self.mod(mod, msg, exc=exc)
797
798 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800799 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500800 self.mod(mod, msg)
801
802 def test_module(self):
803 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
804 self.mod(m, "must have Load context", "single")
805 m = ast.Expression(ast.Name("x", ast.Store()))
806 self.mod(m, "must have Load context", "eval")
807
808 def _check_arguments(self, fac, check):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700809 def arguments(args=None, vararg=None,
810 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500811 defaults=None, kw_defaults=None):
812 if args is None:
813 args = []
814 if kwonlyargs is None:
815 kwonlyargs = []
816 if defaults is None:
817 defaults = []
818 if kw_defaults is None:
819 kw_defaults = []
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700820 args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
821 kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500822 return fac(args)
823 args = [ast.arg("x", ast.Name("x", ast.Store()))]
824 check(arguments(args=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500825 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500826 check(arguments(defaults=[ast.Num(3)]),
827 "more positional defaults than args")
828 check(arguments(kw_defaults=[ast.Num(4)]),
829 "length of kwonlyargs is not the same as kw_defaults")
830 args = [ast.arg("x", ast.Name("x", ast.Load()))]
831 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
832 "must have Load context")
833 args = [ast.arg("a", ast.Name("x", ast.Load())),
834 ast.arg("b", ast.Name("y", ast.Load()))]
835 check(arguments(kwonlyargs=args,
836 kw_defaults=[None, ast.Name("x", ast.Store())]),
837 "must have Load context")
838
839 def test_funcdef(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700840 a = ast.arguments([], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300841 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500842 self.stmt(f, "empty body on FunctionDef")
843 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300844 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500845 self.stmt(f, "must have Load context")
846 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300847 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500848 self.stmt(f, "must have Load context")
849 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300850 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500851 self._check_arguments(fac, self.stmt)
852
853 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400854 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500855 if bases is None:
856 bases = []
857 if keywords is None:
858 keywords = []
859 if body is None:
860 body = [ast.Pass()]
861 if decorator_list is None:
862 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400863 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300864 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500865 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
866 "must have Load context")
867 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
868 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500869 self.stmt(cls(body=[]), "empty body on ClassDef")
870 self.stmt(cls(body=[None]), "None disallowed")
871 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
872 "must have Load context")
873
874 def test_delete(self):
875 self.stmt(ast.Delete([]), "empty targets on Delete")
876 self.stmt(ast.Delete([None]), "None disallowed")
877 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
878 "must have Del context")
879
880 def test_assign(self):
881 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
882 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
883 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
884 "must have Store context")
885 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
886 ast.Name("y", ast.Store())),
887 "must have Load context")
888
889 def test_augassign(self):
890 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
891 ast.Name("y", ast.Load()))
892 self.stmt(aug, "must have Store context")
893 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
894 ast.Name("y", ast.Store()))
895 self.stmt(aug, "must have Load context")
896
897 def test_for(self):
898 x = ast.Name("x", ast.Store())
899 y = ast.Name("y", ast.Load())
900 p = ast.Pass()
901 self.stmt(ast.For(x, y, [], []), "empty body on For")
902 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
903 "must have Store context")
904 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
905 "must have Load context")
906 e = ast.Expr(ast.Name("x", ast.Store()))
907 self.stmt(ast.For(x, y, [e], []), "must have Load context")
908 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
909
910 def test_while(self):
911 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
912 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
913 "must have Load context")
914 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
915 [ast.Expr(ast.Name("x", ast.Store()))]),
916 "must have Load context")
917
918 def test_if(self):
919 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
920 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
921 self.stmt(i, "must have Load context")
922 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
923 self.stmt(i, "must have Load context")
924 i = ast.If(ast.Num(3), [ast.Pass()],
925 [ast.Expr(ast.Name("x", ast.Store()))])
926 self.stmt(i, "must have Load context")
927
928 def test_with(self):
929 p = ast.Pass()
930 self.stmt(ast.With([], [p]), "empty items on With")
931 i = ast.withitem(ast.Num(3), None)
932 self.stmt(ast.With([i], []), "empty body on With")
933 i = ast.withitem(ast.Name("x", ast.Store()), None)
934 self.stmt(ast.With([i], [p]), "must have Load context")
935 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
936 self.stmt(ast.With([i], [p]), "must have Store context")
937
938 def test_raise(self):
939 r = ast.Raise(None, ast.Num(3))
940 self.stmt(r, "Raise with cause but no exception")
941 r = ast.Raise(ast.Name("x", ast.Store()), None)
942 self.stmt(r, "must have Load context")
943 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
944 self.stmt(r, "must have Load context")
945
946 def test_try(self):
947 p = ast.Pass()
948 t = ast.Try([], [], [], [p])
949 self.stmt(t, "empty body on Try")
950 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
951 self.stmt(t, "must have Load context")
952 t = ast.Try([p], [], [], [])
953 self.stmt(t, "Try has neither except handlers nor finalbody")
954 t = ast.Try([p], [], [p], [p])
955 self.stmt(t, "Try has orelse but no except handlers")
956 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
957 self.stmt(t, "empty body on ExceptHandler")
958 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
959 self.stmt(ast.Try([p], e, [], []), "must have Load context")
960 e = [ast.ExceptHandler(None, "x", [p])]
961 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
962 self.stmt(t, "must have Load context")
963 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
964 self.stmt(t, "must have Load context")
965
966 def test_assert(self):
967 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
968 "must have Load context")
969 assrt = ast.Assert(ast.Name("x", ast.Load()),
970 ast.Name("y", ast.Store()))
971 self.stmt(assrt, "must have Load context")
972
973 def test_import(self):
974 self.stmt(ast.Import([]), "empty names on Import")
975
976 def test_importfrom(self):
977 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +0300978 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500979 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
980
981 def test_global(self):
982 self.stmt(ast.Global([]), "empty names on Global")
983
984 def test_nonlocal(self):
985 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
986
987 def test_expr(self):
988 e = ast.Expr(ast.Name("x", ast.Store()))
989 self.stmt(e, "must have Load context")
990
991 def test_boolop(self):
992 b = ast.BoolOp(ast.And(), [])
993 self.expr(b, "less than 2 values")
994 b = ast.BoolOp(ast.And(), [ast.Num(3)])
995 self.expr(b, "less than 2 values")
996 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
997 self.expr(b, "None disallowed")
998 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
999 self.expr(b, "must have Load context")
1000
1001 def test_unaryop(self):
1002 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1003 self.expr(u, "must have Load context")
1004
1005 def test_lambda(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001006 a = ast.arguments([], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001007 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1008 "must have Load context")
1009 def fac(args):
1010 return ast.Lambda(args, ast.Name("x", ast.Load()))
1011 self._check_arguments(fac, self.expr)
1012
1013 def test_ifexp(self):
1014 l = ast.Name("x", ast.Load())
1015 s = ast.Name("y", ast.Store())
1016 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001017 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001018
1019 def test_dict(self):
1020 d = ast.Dict([], [ast.Name("x", ast.Load())])
1021 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001022 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1023 self.expr(d, "None disallowed")
1024
1025 def test_set(self):
1026 self.expr(ast.Set([None]), "None disallowed")
1027 s = ast.Set([ast.Name("x", ast.Store())])
1028 self.expr(s, "must have Load context")
1029
1030 def _check_comprehension(self, fac):
1031 self.expr(fac([]), "comprehension with no generators")
1032 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001033 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001034 self.expr(fac([g]), "must have Store context")
1035 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001036 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001037 self.expr(fac([g]), "must have Load context")
1038 x = ast.Name("x", ast.Store())
1039 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001040 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001041 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001042 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001043 self.expr(fac([g]), "must have Load context")
1044
1045 def _simple_comp(self, fac):
1046 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001047 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001048 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1049 "must have Load context")
1050 def wrap(gens):
1051 return fac(ast.Name("x", ast.Store()), gens)
1052 self._check_comprehension(wrap)
1053
1054 def test_listcomp(self):
1055 self._simple_comp(ast.ListComp)
1056
1057 def test_setcomp(self):
1058 self._simple_comp(ast.SetComp)
1059
1060 def test_generatorexp(self):
1061 self._simple_comp(ast.GeneratorExp)
1062
1063 def test_dictcomp(self):
1064 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001065 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001066 c = ast.DictComp(ast.Name("x", ast.Store()),
1067 ast.Name("y", ast.Load()), [g])
1068 self.expr(c, "must have Load context")
1069 c = ast.DictComp(ast.Name("x", ast.Load()),
1070 ast.Name("y", ast.Store()), [g])
1071 self.expr(c, "must have Load context")
1072 def factory(comps):
1073 k = ast.Name("x", ast.Load())
1074 v = ast.Name("y", ast.Load())
1075 return ast.DictComp(k, v, comps)
1076 self._check_comprehension(factory)
1077
1078 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001079 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1080 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001081
1082 def test_compare(self):
1083 left = ast.Name("x", ast.Load())
1084 comp = ast.Compare(left, [ast.In()], [])
1085 self.expr(comp, "no comparators")
1086 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1087 self.expr(comp, "different number of comparators and operands")
1088 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001089 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001090 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001091 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001092
1093 def test_call(self):
1094 func = ast.Name("x", ast.Load())
1095 args = [ast.Name("y", ast.Load())]
1096 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001097 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001098 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001099 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001100 self.expr(call, "None disallowed")
1101 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001102 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001103 self.expr(call, "must have Load context")
1104
1105 def test_num(self):
1106 class subint(int):
1107 pass
1108 class subfloat(float):
1109 pass
1110 class subcomplex(complex):
1111 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001112 for obj in "0", "hello":
1113 self.expr(ast.Num(obj))
1114 for obj in subint(), subfloat(), subcomplex():
1115 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001116
1117 def test_attribute(self):
1118 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1119 self.expr(attr, "must have Load context")
1120
1121 def test_subscript(self):
1122 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1123 ast.Load())
1124 self.expr(sub, "must have Load context")
1125 x = ast.Name("x", ast.Load())
1126 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1127 ast.Load())
1128 self.expr(sub, "must have Load context")
1129 s = ast.Name("x", ast.Store())
1130 for args in (s, None, None), (None, s, None), (None, None, s):
1131 sl = ast.Slice(*args)
1132 self.expr(ast.Subscript(x, sl, ast.Load()),
1133 "must have Load context")
1134 sl = ast.ExtSlice([])
1135 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1136 sl = ast.ExtSlice([ast.Index(s)])
1137 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1138
1139 def test_starred(self):
1140 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1141 ast.Store())
1142 assign = ast.Assign([left], ast.Num(4))
1143 self.stmt(assign, "must have Store context")
1144
1145 def _sequence(self, fac):
1146 self.expr(fac([None], ast.Load()), "None disallowed")
1147 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1148 "must have Load context")
1149
1150 def test_list(self):
1151 self._sequence(ast.List)
1152
1153 def test_tuple(self):
1154 self._sequence(ast.Tuple)
1155
Benjamin Peterson442f2092012-12-06 17:41:04 -05001156 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001157 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001158
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001159 def test_stdlib_validates(self):
1160 stdlib = os.path.dirname(ast.__file__)
1161 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1162 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1163 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001164 with self.subTest(module):
1165 fn = os.path.join(stdlib, module)
1166 with open(fn, "r", encoding="utf-8") as fp:
1167 source = fp.read()
1168 mod = ast.parse(source, fn)
1169 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001170
1171
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001172class ConstantTests(unittest.TestCase):
1173 """Tests on the ast.Constant node type."""
1174
1175 def compile_constant(self, value):
1176 tree = ast.parse("x = 123")
1177
1178 node = tree.body[0].value
1179 new_node = ast.Constant(value=value)
1180 ast.copy_location(new_node, node)
1181 tree.body[0].value = new_node
1182
1183 code = compile(tree, "<string>", "exec")
1184
1185 ns = {}
1186 exec(code, ns)
1187 return ns['x']
1188
Victor Stinnerbe59d142016-01-27 00:39:12 +01001189 def test_validation(self):
1190 with self.assertRaises(TypeError) as cm:
1191 self.compile_constant([1, 2, 3])
1192 self.assertEqual(str(cm.exception),
1193 "got an invalid type in Constant: list")
1194
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001195 def test_singletons(self):
1196 for const in (None, False, True, Ellipsis, b'', frozenset()):
1197 with self.subTest(const=const):
1198 value = self.compile_constant(const)
1199 self.assertIs(value, const)
1200
1201 def test_values(self):
1202 nested_tuple = (1,)
1203 nested_frozenset = frozenset({1})
1204 for level in range(3):
1205 nested_tuple = (nested_tuple, 2)
1206 nested_frozenset = frozenset({nested_frozenset, 2})
1207 values = (123, 123.0, 123j,
1208 "unicode", b'bytes',
1209 tuple("tuple"), frozenset("frozenset"),
1210 nested_tuple, nested_frozenset)
1211 for value in values:
1212 with self.subTest(value=value):
1213 result = self.compile_constant(value)
1214 self.assertEqual(result, value)
1215
1216 def test_assign_to_constant(self):
1217 tree = ast.parse("x = 1")
1218
1219 target = tree.body[0].targets[0]
1220 new_target = ast.Constant(value=1)
1221 ast.copy_location(new_target, target)
1222 tree.body[0].targets[0] = new_target
1223
1224 with self.assertRaises(ValueError) as cm:
1225 compile(tree, "string", "exec")
1226 self.assertEqual(str(cm.exception),
1227 "expression which can't be assigned "
1228 "to in Store context")
1229
1230 def test_get_docstring(self):
1231 tree = ast.parse("'docstring'\nx = 1")
1232 self.assertEqual(ast.get_docstring(tree), 'docstring')
1233
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001234 def get_load_const(self, tree):
1235 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1236 # instructions
1237 co = compile(tree, '<string>', 'exec')
1238 consts = []
1239 for instr in dis.get_instructions(co):
1240 if instr.opname == 'LOAD_CONST':
1241 consts.append(instr.argval)
1242 return consts
1243
1244 @support.cpython_only
1245 def test_load_const(self):
1246 consts = [None,
1247 True, False,
1248 124,
1249 2.0,
1250 3j,
1251 "unicode",
1252 b'bytes',
1253 (1, 2, 3)]
1254
Victor Stinnera2724092016-02-08 18:17:58 +01001255 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1256 code += '\nx = ...'
1257 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001258
1259 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001260 self.assertEqual(self.get_load_const(tree),
1261 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001262
1263 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001264 for assign, const in zip(tree.body, consts):
1265 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001266 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001267 ast.copy_location(new_node, assign.value)
1268 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001269
Victor Stinnera2724092016-02-08 18:17:58 +01001270 self.assertEqual(self.get_load_const(tree),
1271 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001272
1273 def test_literal_eval(self):
1274 tree = ast.parse("1 + 2")
1275 binop = tree.body[0].value
1276
1277 new_left = ast.Constant(value=10)
1278 ast.copy_location(new_left, binop.left)
1279 binop.left = new_left
1280
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001281 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001282 ast.copy_location(new_right, binop.right)
1283 binop.right = new_right
1284
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001285 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001286
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001287 def test_string_kind(self):
1288 c = ast.parse('"x"', mode='eval').body
1289 self.assertEqual(c.value, "x")
1290 self.assertEqual(c.kind, None)
1291
1292 c = ast.parse('u"x"', mode='eval').body
1293 self.assertEqual(c.value, "x")
1294 self.assertEqual(c.kind, "u")
1295
1296 c = ast.parse('r"x"', mode='eval').body
1297 self.assertEqual(c.value, "x")
1298 self.assertEqual(c.kind, None)
1299
1300 c = ast.parse('b"x"', mode='eval').body
1301 self.assertEqual(c.value, b"x")
1302 self.assertEqual(c.kind, None)
1303
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001304
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001305class EndPositionTests(unittest.TestCase):
1306 """Tests for end position of AST nodes.
1307
1308 Testing end positions of nodes requires a bit of extra care
1309 because of how LL parsers work.
1310 """
1311 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1312 self.assertEqual(ast_node.end_lineno, end_lineno)
1313 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1314
1315 def _check_content(self, source, ast_node, content):
1316 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1317
1318 def _parse_value(self, s):
1319 # Use duck-typing to support both single expression
1320 # and a right hand side of an assignment statement.
1321 return ast.parse(s).body[0].value
1322
1323 def test_lambda(self):
1324 s = 'lambda x, *y: None'
1325 lam = self._parse_value(s)
1326 self._check_content(s, lam.body, 'None')
1327 self._check_content(s, lam.args.args[0], 'x')
1328 self._check_content(s, lam.args.vararg, 'y')
1329
1330 def test_func_def(self):
1331 s = dedent('''
1332 def func(x: int,
1333 *args: str,
1334 z: float = 0,
1335 **kwargs: Any) -> bool:
1336 return True
1337 ''').strip()
1338 fdef = ast.parse(s).body[0]
1339 self._check_end_pos(fdef, 5, 15)
1340 self._check_content(s, fdef.body[0], 'return True')
1341 self._check_content(s, fdef.args.args[0], 'x: int')
1342 self._check_content(s, fdef.args.args[0].annotation, 'int')
1343 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1344 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1345
1346 def test_call(self):
1347 s = 'func(x, y=2, **kw)'
1348 call = self._parse_value(s)
1349 self._check_content(s, call.func, 'func')
1350 self._check_content(s, call.keywords[0].value, '2')
1351 self._check_content(s, call.keywords[1].value, 'kw')
1352
1353 def test_call_noargs(self):
1354 s = 'x[0]()'
1355 call = self._parse_value(s)
1356 self._check_content(s, call.func, 'x[0]')
1357 self._check_end_pos(call, 1, 6)
1358
1359 def test_class_def(self):
1360 s = dedent('''
1361 class C(A, B):
1362 x: int = 0
1363 ''').strip()
1364 cdef = ast.parse(s).body[0]
1365 self._check_end_pos(cdef, 2, 14)
1366 self._check_content(s, cdef.bases[1], 'B')
1367 self._check_content(s, cdef.body[0], 'x: int = 0')
1368
1369 def test_class_kw(self):
1370 s = 'class S(metaclass=abc.ABCMeta): pass'
1371 cdef = ast.parse(s).body[0]
1372 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1373
1374 def test_multi_line_str(self):
1375 s = dedent('''
1376 x = """Some multi-line text.
1377
1378 It goes on starting from same indent."""
1379 ''').strip()
1380 assign = ast.parse(s).body[0]
1381 self._check_end_pos(assign, 3, 40)
1382 self._check_end_pos(assign.value, 3, 40)
1383
1384 def test_continued_str(self):
1385 s = dedent('''
1386 x = "first part" \\
1387 "second part"
1388 ''').strip()
1389 assign = ast.parse(s).body[0]
1390 self._check_end_pos(assign, 2, 13)
1391 self._check_end_pos(assign.value, 2, 13)
1392
1393 def test_suites(self):
1394 # We intentionally put these into the same string to check
1395 # that empty lines are not part of the suite.
1396 s = dedent('''
1397 while True:
1398 pass
1399
1400 if one():
1401 x = None
1402 elif other():
1403 y = None
1404 else:
1405 z = None
1406
1407 for x, y in stuff:
1408 assert True
1409
1410 try:
1411 raise RuntimeError
1412 except TypeError as e:
1413 pass
1414
1415 pass
1416 ''').strip()
1417 mod = ast.parse(s)
1418 while_loop = mod.body[0]
1419 if_stmt = mod.body[1]
1420 for_loop = mod.body[2]
1421 try_stmt = mod.body[3]
1422 pass_stmt = mod.body[4]
1423
1424 self._check_end_pos(while_loop, 2, 8)
1425 self._check_end_pos(if_stmt, 9, 12)
1426 self._check_end_pos(for_loop, 12, 15)
1427 self._check_end_pos(try_stmt, 17, 8)
1428 self._check_end_pos(pass_stmt, 19, 4)
1429
1430 self._check_content(s, while_loop.test, 'True')
1431 self._check_content(s, if_stmt.body[0], 'x = None')
1432 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1433 self._check_content(s, for_loop.target, 'x, y')
1434 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1435 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1436
1437 def test_fstring(self):
1438 s = 'x = f"abc {x + y} abc"'
1439 fstr = self._parse_value(s)
1440 binop = fstr.values[1].value
1441 self._check_content(s, binop, 'x + y')
1442
1443 def test_fstring_multi_line(self):
1444 s = dedent('''
1445 f"""Some multi-line text.
1446 {
1447 arg_one
1448 +
1449 arg_two
1450 }
1451 It goes on..."""
1452 ''').strip()
1453 fstr = self._parse_value(s)
1454 binop = fstr.values[1].value
1455 self._check_end_pos(binop, 5, 7)
1456 self._check_content(s, binop.left, 'arg_one')
1457 self._check_content(s, binop.right, 'arg_two')
1458
1459 def test_import_from_multi_line(self):
1460 s = dedent('''
1461 from x.y.z import (
1462 a, b, c as c
1463 )
1464 ''').strip()
1465 imp = ast.parse(s).body[0]
1466 self._check_end_pos(imp, 3, 1)
1467
1468 def test_slices(self):
1469 s1 = 'f()[1, 2] [0]'
1470 s2 = 'x[ a.b: c.d]'
1471 sm = dedent('''
1472 x[ a.b: f () ,
1473 g () : c.d
1474 ]
1475 ''').strip()
1476 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1477 self._check_content(s1, i1.value, 'f()[1, 2]')
1478 self._check_content(s1, i1.value.slice.value, '1, 2')
1479 self._check_content(s2, i2.slice.lower, 'a.b')
1480 self._check_content(s2, i2.slice.upper, 'c.d')
1481 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1482 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1483 self._check_end_pos(im, 3, 3)
1484
1485 def test_binop(self):
1486 s = dedent('''
1487 (1 * 2 + (3 ) +
1488 4
1489 )
1490 ''').strip()
1491 binop = self._parse_value(s)
1492 self._check_end_pos(binop, 2, 6)
1493 self._check_content(s, binop.right, '4')
1494 self._check_content(s, binop.left, '1 * 2 + (3 )')
1495 self._check_content(s, binop.left.right, '3')
1496
1497 def test_boolop(self):
1498 s = dedent('''
1499 if (one_condition and
1500 (other_condition or yet_another_one)):
1501 pass
1502 ''').strip()
1503 bop = ast.parse(s).body[0].test
1504 self._check_end_pos(bop, 2, 44)
1505 self._check_content(s, bop.values[1],
1506 'other_condition or yet_another_one')
1507
1508 def test_tuples(self):
1509 s1 = 'x = () ;'
1510 s2 = 'x = 1 , ;'
1511 s3 = 'x = (1 , 2 ) ;'
1512 sm = dedent('''
1513 x = (
1514 a, b,
1515 )
1516 ''').strip()
1517 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1518 self._check_content(s1, t1, '()')
1519 self._check_content(s2, t2, '1 ,')
1520 self._check_content(s3, t3, '(1 , 2 )')
1521 self._check_end_pos(tm, 3, 1)
1522
1523 def test_attribute_spaces(self):
1524 s = 'func(x. y .z)'
1525 call = self._parse_value(s)
1526 self._check_content(s, call, s)
1527 self._check_content(s, call.args[0], 'x. y .z')
1528
1529 def test_displays(self):
1530 s1 = '[{}, {1, }, {1, 2,} ]'
1531 s2 = '{a: b, f (): g () ,}'
1532 c1 = self._parse_value(s1)
1533 c2 = self._parse_value(s2)
1534 self._check_content(s1, c1.elts[0], '{}')
1535 self._check_content(s1, c1.elts[1], '{1, }')
1536 self._check_content(s1, c1.elts[2], '{1, 2,}')
1537 self._check_content(s2, c2.keys[1], 'f ()')
1538 self._check_content(s2, c2.values[1], 'g ()')
1539
1540 def test_comprehensions(self):
1541 s = dedent('''
1542 x = [{x for x, y in stuff
1543 if cond.x} for stuff in things]
1544 ''').strip()
1545 cmp = self._parse_value(s)
1546 self._check_end_pos(cmp, 2, 37)
1547 self._check_content(s, cmp.generators[0].iter, 'things')
1548 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1549 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1550 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1551
1552 def test_yield_await(self):
1553 s = dedent('''
1554 async def f():
1555 yield x
1556 await y
1557 ''').strip()
1558 fdef = ast.parse(s).body[0]
1559 self._check_content(s, fdef.body[0].value, 'yield x')
1560 self._check_content(s, fdef.body[1].value, 'await y')
1561
1562 def test_source_segment_multi(self):
1563 s_orig = dedent('''
1564 x = (
1565 a, b,
1566 ) + ()
1567 ''').strip()
1568 s_tuple = dedent('''
1569 (
1570 a, b,
1571 )
1572 ''').strip()
1573 binop = self._parse_value(s_orig)
1574 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1575
1576 def test_source_segment_padded(self):
1577 s_orig = dedent('''
1578 class C:
1579 def fun(self) -> None:
1580 "ЖЖЖЖЖ"
1581 ''').strip()
1582 s_method = ' def fun(self) -> None:\n' \
1583 ' "ЖЖЖЖЖ"'
1584 cdef = ast.parse(s_orig).body[0]
1585 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1586 s_method)
1587
1588 def test_source_segment_endings(self):
1589 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1590 v, w, x, y, z = ast.parse(s).body
1591 self._check_content(s, v, 'v = 1')
1592 self._check_content(s, w, 'w = 1')
1593 self._check_content(s, x, 'x = 1')
1594 self._check_content(s, y, 'y = 1')
1595 self._check_content(s, z, 'z = 1')
1596
1597 def test_source_segment_tabs(self):
1598 s = dedent('''
1599 class C:
1600 \t\f def fun(self) -> None:
1601 \t\f pass
1602 ''').strip()
1603 s_method = ' \t\f def fun(self) -> None:\n' \
1604 ' \t\f pass'
1605
1606 cdef = ast.parse(s).body[0]
1607 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1608
1609
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001610def main():
1611 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001612 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001613 if sys.argv[1:] == ['-g']:
1614 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1615 (eval_tests, "eval")):
1616 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001617 for statement in statements:
1618 tree = ast.parse(statement, "?", kind)
1619 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001620 print("]")
1621 print("main()")
1622 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001623 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001624
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001625#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001626exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001627('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1628('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001629('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001630('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001631('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001632('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001633('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1634('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001635('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 -08001636('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001637('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001638('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001639('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 -08001640('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001641('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001642('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1643('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1644('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 -07001645('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001646('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1647('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1648('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1649('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1650('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 -07001651('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 -08001652('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1653('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1654('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1655('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1656('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1657('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001658('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001659('Module', [('Pass', (1, 0))], []),
1660('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1661('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1662('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)], []),
1663('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)], []),
1664('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)], []),
1665('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)]))], []),
1666('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)]))], []),
1667('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)]))], []),
1668('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)]))], []),
1669('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)]))], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001670('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)], []),
1671('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)], []),
1672('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)], []),
1673('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)]))], []),
1674('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)]))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001675('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)], []),
1676('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)], []),
1677('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)], []),
1678('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
1679('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)], []),
Tim Peters400cbc32006-02-28 18:44:41 +00001680]
1681single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001682('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 +00001683]
1684eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001685('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001686('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1687('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1688('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001689('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
1690('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001691('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001692('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1693('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001694('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)])),
1695('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)])),
1696('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)])),
1697('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)])),
1698('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)])),
1699('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)])),
1700('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)])),
1701('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)])),
1702('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)])),
1703('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)])),
1704('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 -07001705('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1706('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 +02001707('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 -07001708('Expression', ('Constant', (1, 0), 10, None)),
1709('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001710('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1711('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 +00001712('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001713('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 -05001714('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001715('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1716('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 -05001717('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001718('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 +00001719]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001720main()