blob: 609c8b2c6a7fa168ce56ca0de69f29dab389a342 [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()
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300329 self.assertEqual(x._fields, ('value',))
330
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)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300352 self.assertEqual(x._fields, ('value',))
353 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500354 self.assertEqual(x.n, 42)
355
356 self.assertRaises(TypeError, ast.Num, 1, 2)
357 self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0)
358
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):
559
560 def test_parse(self):
561 a = ast.parse('foo(1 + 1)')
562 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
563 self.assertEqual(ast.dump(a), ast.dump(b))
564
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400565 def test_parse_in_error(self):
566 try:
567 1/0
568 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400569 with self.assertRaises(SyntaxError) as e:
570 ast.literal_eval(r"'\U'")
571 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400572
Georg Brandl0c77a822008-06-10 16:37:50 +0000573 def test_dump(self):
574 node = ast.parse('spam(eggs, "and cheese")')
575 self.assertEqual(ast.dump(node),
576 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300577 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800578 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000579 )
580 self.assertEqual(ast.dump(node, annotate_fields=False),
581 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800582 "Constant('and cheese')], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000583 )
584 self.assertEqual(ast.dump(node, include_attributes=True),
585 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000586 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
587 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
588 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', "
589 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
590 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800591 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000592 )
593
594 def test_copy_location(self):
595 src = ast.parse('1 + 1', mode='eval')
596 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
597 self.assertEqual(ast.dump(src, include_attributes=True),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000598 'Expression(body=BinOp(left=Constant(value=1, lineno=1, col_offset=0, '
599 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
600 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
601 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000602 )
603
604 def test_fix_missing_locations(self):
605 src = ast.parse('write("spam")')
606 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400607 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000608 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000609 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000610 self.assertEqual(ast.dump(src, include_attributes=True),
611 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000612 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
613 "args=[Constant(value='spam', lineno=1, col_offset=6, end_lineno=1, "
614 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
615 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
616 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
617 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
618 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
619 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800620 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
621 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000622 )
623
624 def test_increment_lineno(self):
625 src = ast.parse('1 + 1', mode='eval')
626 self.assertEqual(ast.increment_lineno(src, n=3), src)
627 self.assertEqual(ast.dump(src, include_attributes=True),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000628 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
629 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
630 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
631 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000632 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000633 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000634 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000635 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
636 self.assertEqual(ast.dump(src, include_attributes=True),
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000637 'Expression(body=BinOp(left=Constant(value=1, lineno=4, col_offset=0, '
638 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, '
639 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
640 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000641 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000642
643 def test_iter_fields(self):
644 node = ast.parse('foo()', mode='eval')
645 d = dict(ast.iter_fields(node.body))
646 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400647 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000648
649 def test_iter_child_nodes(self):
650 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
651 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
652 iterator = ast.iter_child_nodes(node.body)
653 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300654 self.assertEqual(next(iterator).value, 23)
655 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000656 self.assertEqual(ast.dump(next(iterator)),
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300657 "keyword(arg='eggs', value=Constant(value='leek'))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000658 )
659
660 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300661 node = ast.parse('"""line one\n line two"""')
662 self.assertEqual(ast.get_docstring(node),
663 'line one\nline two')
664
665 node = ast.parse('class foo:\n """line one\n line two"""')
666 self.assertEqual(ast.get_docstring(node.body[0]),
667 'line one\nline two')
668
Georg Brandl0c77a822008-06-10 16:37:50 +0000669 node = ast.parse('def foo():\n """line one\n line two"""')
670 self.assertEqual(ast.get_docstring(node.body[0]),
671 'line one\nline two')
672
Yury Selivanov2f07a662015-07-23 08:54:35 +0300673 node = ast.parse('async def foo():\n """spam\n ham"""')
674 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300675
676 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800677 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300678 node = ast.parse('x = "not docstring"')
679 self.assertIsNone(ast.get_docstring(node))
680 node = ast.parse('def foo():\n pass')
681 self.assertIsNone(ast.get_docstring(node))
682
683 node = ast.parse('class foo:\n pass')
684 self.assertIsNone(ast.get_docstring(node.body[0]))
685 node = ast.parse('class foo:\n x = "not docstring"')
686 self.assertIsNone(ast.get_docstring(node.body[0]))
687 node = ast.parse('class foo:\n def bar(self): pass')
688 self.assertIsNone(ast.get_docstring(node.body[0]))
689
690 node = ast.parse('def foo():\n pass')
691 self.assertIsNone(ast.get_docstring(node.body[0]))
692 node = ast.parse('def foo():\n x = "not docstring"')
693 self.assertIsNone(ast.get_docstring(node.body[0]))
694
695 node = ast.parse('async def foo():\n pass')
696 self.assertIsNone(ast.get_docstring(node.body[0]))
697 node = ast.parse('async def foo():\n x = "not docstring"')
698 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300699
Anthony Sottile995d9b92019-01-12 20:05:13 -0800700 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
701 node = ast.parse(
702 '"""line one\nline two"""\n\n'
703 'def foo():\n """line one\n line two"""\n\n'
704 ' def bar():\n """line one\n line two"""\n'
705 ' """line one\n line two"""\n'
706 '"""line one\nline two"""\n\n'
707 )
708 self.assertEqual(node.body[0].col_offset, 0)
709 self.assertEqual(node.body[0].lineno, 1)
710 self.assertEqual(node.body[1].body[0].col_offset, 2)
711 self.assertEqual(node.body[1].body[0].lineno, 5)
712 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
713 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
714 self.assertEqual(node.body[1].body[2].col_offset, 2)
715 self.assertEqual(node.body[1].body[2].lineno, 11)
716 self.assertEqual(node.body[2].col_offset, 0)
717 self.assertEqual(node.body[2].lineno, 13)
718
Georg Brandl0c77a822008-06-10 16:37:50 +0000719 def test_literal_eval(self):
720 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
721 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
722 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000723 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000724 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000725 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200726 self.assertEqual(ast.literal_eval('6'), 6)
727 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000728 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000729 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200730 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
731 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
732 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
733 self.assertRaises(ValueError, ast.literal_eval, '++6')
734 self.assertRaises(ValueError, ast.literal_eval, '+True')
735 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000736
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200737 def test_literal_eval_complex(self):
738 # Issue #4907
739 self.assertEqual(ast.literal_eval('6j'), 6j)
740 self.assertEqual(ast.literal_eval('-6j'), -6j)
741 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
742 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
743 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
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.25+6.75j'), 3.25+6.75j)
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+6j)'), 3+6j)
752 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
753 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
754 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
755 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
756 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000757
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100758 def test_bad_integer(self):
759 # issue13436: Bad error message with invalid numeric values
760 body = [ast.ImportFrom(module='time',
761 names=[ast.alias(name='sleep')],
762 level=None,
763 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800764 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100765 with self.assertRaises(ValueError) as cm:
766 compile(mod, 'test', 'exec')
767 self.assertIn("invalid integer value: None", str(cm.exception))
768
Berker Peksag0a5bd512016-04-29 19:50:02 +0300769 def test_level_as_none(self):
770 body = [ast.ImportFrom(module='time',
771 names=[ast.alias(name='sleep')],
772 level=None,
773 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800774 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300775 code = compile(mod, 'test', 'exec')
776 ns = {}
777 exec(code, ns)
778 self.assertIn('sleep', ns)
779
Georg Brandl0c77a822008-06-10 16:37:50 +0000780
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500781class ASTValidatorTests(unittest.TestCase):
782
783 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
784 mod.lineno = mod.col_offset = 0
785 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300786 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500787 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300788 else:
789 with self.assertRaises(exc) as cm:
790 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500791 self.assertIn(msg, str(cm.exception))
792
793 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800794 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500795 self.mod(mod, msg, exc=exc)
796
797 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800798 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500799 self.mod(mod, msg)
800
801 def test_module(self):
802 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
803 self.mod(m, "must have Load context", "single")
804 m = ast.Expression(ast.Name("x", ast.Store()))
805 self.mod(m, "must have Load context", "eval")
806
807 def _check_arguments(self, fac, check):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700808 def arguments(args=None, vararg=None,
809 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500810 defaults=None, kw_defaults=None):
811 if args is None:
812 args = []
813 if kwonlyargs is None:
814 kwonlyargs = []
815 if defaults is None:
816 defaults = []
817 if kw_defaults is None:
818 kw_defaults = []
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700819 args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
820 kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500821 return fac(args)
822 args = [ast.arg("x", ast.Name("x", ast.Store()))]
823 check(arguments(args=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500824 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500825 check(arguments(defaults=[ast.Num(3)]),
826 "more positional defaults than args")
827 check(arguments(kw_defaults=[ast.Num(4)]),
828 "length of kwonlyargs is not the same as kw_defaults")
829 args = [ast.arg("x", ast.Name("x", ast.Load()))]
830 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
831 "must have Load context")
832 args = [ast.arg("a", ast.Name("x", ast.Load())),
833 ast.arg("b", ast.Name("y", ast.Load()))]
834 check(arguments(kwonlyargs=args,
835 kw_defaults=[None, ast.Name("x", ast.Store())]),
836 "must have Load context")
837
838 def test_funcdef(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700839 a = ast.arguments([], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300840 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500841 self.stmt(f, "empty body on FunctionDef")
842 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300843 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500844 self.stmt(f, "must have Load context")
845 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300846 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500847 self.stmt(f, "must have Load context")
848 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300849 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500850 self._check_arguments(fac, self.stmt)
851
852 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400853 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500854 if bases is None:
855 bases = []
856 if keywords is None:
857 keywords = []
858 if body is None:
859 body = [ast.Pass()]
860 if decorator_list is None:
861 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400862 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300863 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500864 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
865 "must have Load context")
866 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
867 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500868 self.stmt(cls(body=[]), "empty body on ClassDef")
869 self.stmt(cls(body=[None]), "None disallowed")
870 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
871 "must have Load context")
872
873 def test_delete(self):
874 self.stmt(ast.Delete([]), "empty targets on Delete")
875 self.stmt(ast.Delete([None]), "None disallowed")
876 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
877 "must have Del context")
878
879 def test_assign(self):
880 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
881 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
882 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
883 "must have Store context")
884 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
885 ast.Name("y", ast.Store())),
886 "must have Load context")
887
888 def test_augassign(self):
889 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
890 ast.Name("y", ast.Load()))
891 self.stmt(aug, "must have Store context")
892 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
893 ast.Name("y", ast.Store()))
894 self.stmt(aug, "must have Load context")
895
896 def test_for(self):
897 x = ast.Name("x", ast.Store())
898 y = ast.Name("y", ast.Load())
899 p = ast.Pass()
900 self.stmt(ast.For(x, y, [], []), "empty body on For")
901 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
902 "must have Store context")
903 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
904 "must have Load context")
905 e = ast.Expr(ast.Name("x", ast.Store()))
906 self.stmt(ast.For(x, y, [e], []), "must have Load context")
907 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
908
909 def test_while(self):
910 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
911 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
912 "must have Load context")
913 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
914 [ast.Expr(ast.Name("x", ast.Store()))]),
915 "must have Load context")
916
917 def test_if(self):
918 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
919 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
920 self.stmt(i, "must have Load context")
921 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
922 self.stmt(i, "must have Load context")
923 i = ast.If(ast.Num(3), [ast.Pass()],
924 [ast.Expr(ast.Name("x", ast.Store()))])
925 self.stmt(i, "must have Load context")
926
927 def test_with(self):
928 p = ast.Pass()
929 self.stmt(ast.With([], [p]), "empty items on With")
930 i = ast.withitem(ast.Num(3), None)
931 self.stmt(ast.With([i], []), "empty body on With")
932 i = ast.withitem(ast.Name("x", ast.Store()), None)
933 self.stmt(ast.With([i], [p]), "must have Load context")
934 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
935 self.stmt(ast.With([i], [p]), "must have Store context")
936
937 def test_raise(self):
938 r = ast.Raise(None, ast.Num(3))
939 self.stmt(r, "Raise with cause but no exception")
940 r = ast.Raise(ast.Name("x", ast.Store()), None)
941 self.stmt(r, "must have Load context")
942 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
943 self.stmt(r, "must have Load context")
944
945 def test_try(self):
946 p = ast.Pass()
947 t = ast.Try([], [], [], [p])
948 self.stmt(t, "empty body on Try")
949 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
950 self.stmt(t, "must have Load context")
951 t = ast.Try([p], [], [], [])
952 self.stmt(t, "Try has neither except handlers nor finalbody")
953 t = ast.Try([p], [], [p], [p])
954 self.stmt(t, "Try has orelse but no except handlers")
955 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
956 self.stmt(t, "empty body on ExceptHandler")
957 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
958 self.stmt(ast.Try([p], e, [], []), "must have Load context")
959 e = [ast.ExceptHandler(None, "x", [p])]
960 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
961 self.stmt(t, "must have Load context")
962 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
963 self.stmt(t, "must have Load context")
964
965 def test_assert(self):
966 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
967 "must have Load context")
968 assrt = ast.Assert(ast.Name("x", ast.Load()),
969 ast.Name("y", ast.Store()))
970 self.stmt(assrt, "must have Load context")
971
972 def test_import(self):
973 self.stmt(ast.Import([]), "empty names on Import")
974
975 def test_importfrom(self):
976 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +0300977 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500978 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
979
980 def test_global(self):
981 self.stmt(ast.Global([]), "empty names on Global")
982
983 def test_nonlocal(self):
984 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
985
986 def test_expr(self):
987 e = ast.Expr(ast.Name("x", ast.Store()))
988 self.stmt(e, "must have Load context")
989
990 def test_boolop(self):
991 b = ast.BoolOp(ast.And(), [])
992 self.expr(b, "less than 2 values")
993 b = ast.BoolOp(ast.And(), [ast.Num(3)])
994 self.expr(b, "less than 2 values")
995 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
996 self.expr(b, "None disallowed")
997 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
998 self.expr(b, "must have Load context")
999
1000 def test_unaryop(self):
1001 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1002 self.expr(u, "must have Load context")
1003
1004 def test_lambda(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001005 a = ast.arguments([], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001006 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1007 "must have Load context")
1008 def fac(args):
1009 return ast.Lambda(args, ast.Name("x", ast.Load()))
1010 self._check_arguments(fac, self.expr)
1011
1012 def test_ifexp(self):
1013 l = ast.Name("x", ast.Load())
1014 s = ast.Name("y", ast.Store())
1015 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001016 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001017
1018 def test_dict(self):
1019 d = ast.Dict([], [ast.Name("x", ast.Load())])
1020 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001021 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1022 self.expr(d, "None disallowed")
1023
1024 def test_set(self):
1025 self.expr(ast.Set([None]), "None disallowed")
1026 s = ast.Set([ast.Name("x", ast.Store())])
1027 self.expr(s, "must have Load context")
1028
1029 def _check_comprehension(self, fac):
1030 self.expr(fac([]), "comprehension with no generators")
1031 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001032 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001033 self.expr(fac([g]), "must have Store context")
1034 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001035 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001036 self.expr(fac([g]), "must have Load context")
1037 x = ast.Name("x", ast.Store())
1038 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001039 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001040 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001041 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001042 self.expr(fac([g]), "must have Load context")
1043
1044 def _simple_comp(self, fac):
1045 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001046 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001047 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1048 "must have Load context")
1049 def wrap(gens):
1050 return fac(ast.Name("x", ast.Store()), gens)
1051 self._check_comprehension(wrap)
1052
1053 def test_listcomp(self):
1054 self._simple_comp(ast.ListComp)
1055
1056 def test_setcomp(self):
1057 self._simple_comp(ast.SetComp)
1058
1059 def test_generatorexp(self):
1060 self._simple_comp(ast.GeneratorExp)
1061
1062 def test_dictcomp(self):
1063 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001064 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001065 c = ast.DictComp(ast.Name("x", ast.Store()),
1066 ast.Name("y", ast.Load()), [g])
1067 self.expr(c, "must have Load context")
1068 c = ast.DictComp(ast.Name("x", ast.Load()),
1069 ast.Name("y", ast.Store()), [g])
1070 self.expr(c, "must have Load context")
1071 def factory(comps):
1072 k = ast.Name("x", ast.Load())
1073 v = ast.Name("y", ast.Load())
1074 return ast.DictComp(k, v, comps)
1075 self._check_comprehension(factory)
1076
1077 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001078 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1079 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001080
1081 def test_compare(self):
1082 left = ast.Name("x", ast.Load())
1083 comp = ast.Compare(left, [ast.In()], [])
1084 self.expr(comp, "no comparators")
1085 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1086 self.expr(comp, "different number of comparators and operands")
1087 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001088 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001089 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001090 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001091
1092 def test_call(self):
1093 func = ast.Name("x", ast.Load())
1094 args = [ast.Name("y", ast.Load())]
1095 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001096 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001097 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001098 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001099 self.expr(call, "None disallowed")
1100 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001101 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001102 self.expr(call, "must have Load context")
1103
1104 def test_num(self):
1105 class subint(int):
1106 pass
1107 class subfloat(float):
1108 pass
1109 class subcomplex(complex):
1110 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001111 for obj in "0", "hello":
1112 self.expr(ast.Num(obj))
1113 for obj in subint(), subfloat(), subcomplex():
1114 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001115
1116 def test_attribute(self):
1117 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1118 self.expr(attr, "must have Load context")
1119
1120 def test_subscript(self):
1121 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1122 ast.Load())
1123 self.expr(sub, "must have Load context")
1124 x = ast.Name("x", ast.Load())
1125 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1126 ast.Load())
1127 self.expr(sub, "must have Load context")
1128 s = ast.Name("x", ast.Store())
1129 for args in (s, None, None), (None, s, None), (None, None, s):
1130 sl = ast.Slice(*args)
1131 self.expr(ast.Subscript(x, sl, ast.Load()),
1132 "must have Load context")
1133 sl = ast.ExtSlice([])
1134 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1135 sl = ast.ExtSlice([ast.Index(s)])
1136 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1137
1138 def test_starred(self):
1139 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1140 ast.Store())
1141 assign = ast.Assign([left], ast.Num(4))
1142 self.stmt(assign, "must have Store context")
1143
1144 def _sequence(self, fac):
1145 self.expr(fac([None], ast.Load()), "None disallowed")
1146 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1147 "must have Load context")
1148
1149 def test_list(self):
1150 self._sequence(ast.List)
1151
1152 def test_tuple(self):
1153 self._sequence(ast.Tuple)
1154
Benjamin Peterson442f2092012-12-06 17:41:04 -05001155 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001156 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001157
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001158 def test_stdlib_validates(self):
1159 stdlib = os.path.dirname(ast.__file__)
1160 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1161 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1162 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001163 with self.subTest(module):
1164 fn = os.path.join(stdlib, module)
1165 with open(fn, "r", encoding="utf-8") as fp:
1166 source = fp.read()
1167 mod = ast.parse(source, fn)
1168 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001169
1170
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001171class ConstantTests(unittest.TestCase):
1172 """Tests on the ast.Constant node type."""
1173
1174 def compile_constant(self, value):
1175 tree = ast.parse("x = 123")
1176
1177 node = tree.body[0].value
1178 new_node = ast.Constant(value=value)
1179 ast.copy_location(new_node, node)
1180 tree.body[0].value = new_node
1181
1182 code = compile(tree, "<string>", "exec")
1183
1184 ns = {}
1185 exec(code, ns)
1186 return ns['x']
1187
Victor Stinnerbe59d142016-01-27 00:39:12 +01001188 def test_validation(self):
1189 with self.assertRaises(TypeError) as cm:
1190 self.compile_constant([1, 2, 3])
1191 self.assertEqual(str(cm.exception),
1192 "got an invalid type in Constant: list")
1193
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001194 def test_singletons(self):
1195 for const in (None, False, True, Ellipsis, b'', frozenset()):
1196 with self.subTest(const=const):
1197 value = self.compile_constant(const)
1198 self.assertIs(value, const)
1199
1200 def test_values(self):
1201 nested_tuple = (1,)
1202 nested_frozenset = frozenset({1})
1203 for level in range(3):
1204 nested_tuple = (nested_tuple, 2)
1205 nested_frozenset = frozenset({nested_frozenset, 2})
1206 values = (123, 123.0, 123j,
1207 "unicode", b'bytes',
1208 tuple("tuple"), frozenset("frozenset"),
1209 nested_tuple, nested_frozenset)
1210 for value in values:
1211 with self.subTest(value=value):
1212 result = self.compile_constant(value)
1213 self.assertEqual(result, value)
1214
1215 def test_assign_to_constant(self):
1216 tree = ast.parse("x = 1")
1217
1218 target = tree.body[0].targets[0]
1219 new_target = ast.Constant(value=1)
1220 ast.copy_location(new_target, target)
1221 tree.body[0].targets[0] = new_target
1222
1223 with self.assertRaises(ValueError) as cm:
1224 compile(tree, "string", "exec")
1225 self.assertEqual(str(cm.exception),
1226 "expression which can't be assigned "
1227 "to in Store context")
1228
1229 def test_get_docstring(self):
1230 tree = ast.parse("'docstring'\nx = 1")
1231 self.assertEqual(ast.get_docstring(tree), 'docstring')
1232
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001233 def get_load_const(self, tree):
1234 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1235 # instructions
1236 co = compile(tree, '<string>', 'exec')
1237 consts = []
1238 for instr in dis.get_instructions(co):
1239 if instr.opname == 'LOAD_CONST':
1240 consts.append(instr.argval)
1241 return consts
1242
1243 @support.cpython_only
1244 def test_load_const(self):
1245 consts = [None,
1246 True, False,
1247 124,
1248 2.0,
1249 3j,
1250 "unicode",
1251 b'bytes',
1252 (1, 2, 3)]
1253
Victor Stinnera2724092016-02-08 18:17:58 +01001254 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1255 code += '\nx = ...'
1256 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001257
1258 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001259 self.assertEqual(self.get_load_const(tree),
1260 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001261
1262 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001263 for assign, const in zip(tree.body, consts):
1264 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001265 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001266 ast.copy_location(new_node, assign.value)
1267 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001268
Victor Stinnera2724092016-02-08 18:17:58 +01001269 self.assertEqual(self.get_load_const(tree),
1270 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001271
1272 def test_literal_eval(self):
1273 tree = ast.parse("1 + 2")
1274 binop = tree.body[0].value
1275
1276 new_left = ast.Constant(value=10)
1277 ast.copy_location(new_left, binop.left)
1278 binop.left = new_left
1279
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001280 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001281 ast.copy_location(new_right, binop.right)
1282 binop.right = new_right
1283
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001284 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001285
1286
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001287class EndPositionTests(unittest.TestCase):
1288 """Tests for end position of AST nodes.
1289
1290 Testing end positions of nodes requires a bit of extra care
1291 because of how LL parsers work.
1292 """
1293 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1294 self.assertEqual(ast_node.end_lineno, end_lineno)
1295 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1296
1297 def _check_content(self, source, ast_node, content):
1298 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1299
1300 def _parse_value(self, s):
1301 # Use duck-typing to support both single expression
1302 # and a right hand side of an assignment statement.
1303 return ast.parse(s).body[0].value
1304
1305 def test_lambda(self):
1306 s = 'lambda x, *y: None'
1307 lam = self._parse_value(s)
1308 self._check_content(s, lam.body, 'None')
1309 self._check_content(s, lam.args.args[0], 'x')
1310 self._check_content(s, lam.args.vararg, 'y')
1311
1312 def test_func_def(self):
1313 s = dedent('''
1314 def func(x: int,
1315 *args: str,
1316 z: float = 0,
1317 **kwargs: Any) -> bool:
1318 return True
1319 ''').strip()
1320 fdef = ast.parse(s).body[0]
1321 self._check_end_pos(fdef, 5, 15)
1322 self._check_content(s, fdef.body[0], 'return True')
1323 self._check_content(s, fdef.args.args[0], 'x: int')
1324 self._check_content(s, fdef.args.args[0].annotation, 'int')
1325 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1326 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1327
1328 def test_call(self):
1329 s = 'func(x, y=2, **kw)'
1330 call = self._parse_value(s)
1331 self._check_content(s, call.func, 'func')
1332 self._check_content(s, call.keywords[0].value, '2')
1333 self._check_content(s, call.keywords[1].value, 'kw')
1334
1335 def test_call_noargs(self):
1336 s = 'x[0]()'
1337 call = self._parse_value(s)
1338 self._check_content(s, call.func, 'x[0]')
1339 self._check_end_pos(call, 1, 6)
1340
1341 def test_class_def(self):
1342 s = dedent('''
1343 class C(A, B):
1344 x: int = 0
1345 ''').strip()
1346 cdef = ast.parse(s).body[0]
1347 self._check_end_pos(cdef, 2, 14)
1348 self._check_content(s, cdef.bases[1], 'B')
1349 self._check_content(s, cdef.body[0], 'x: int = 0')
1350
1351 def test_class_kw(self):
1352 s = 'class S(metaclass=abc.ABCMeta): pass'
1353 cdef = ast.parse(s).body[0]
1354 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1355
1356 def test_multi_line_str(self):
1357 s = dedent('''
1358 x = """Some multi-line text.
1359
1360 It goes on starting from same indent."""
1361 ''').strip()
1362 assign = ast.parse(s).body[0]
1363 self._check_end_pos(assign, 3, 40)
1364 self._check_end_pos(assign.value, 3, 40)
1365
1366 def test_continued_str(self):
1367 s = dedent('''
1368 x = "first part" \\
1369 "second part"
1370 ''').strip()
1371 assign = ast.parse(s).body[0]
1372 self._check_end_pos(assign, 2, 13)
1373 self._check_end_pos(assign.value, 2, 13)
1374
1375 def test_suites(self):
1376 # We intentionally put these into the same string to check
1377 # that empty lines are not part of the suite.
1378 s = dedent('''
1379 while True:
1380 pass
1381
1382 if one():
1383 x = None
1384 elif other():
1385 y = None
1386 else:
1387 z = None
1388
1389 for x, y in stuff:
1390 assert True
1391
1392 try:
1393 raise RuntimeError
1394 except TypeError as e:
1395 pass
1396
1397 pass
1398 ''').strip()
1399 mod = ast.parse(s)
1400 while_loop = mod.body[0]
1401 if_stmt = mod.body[1]
1402 for_loop = mod.body[2]
1403 try_stmt = mod.body[3]
1404 pass_stmt = mod.body[4]
1405
1406 self._check_end_pos(while_loop, 2, 8)
1407 self._check_end_pos(if_stmt, 9, 12)
1408 self._check_end_pos(for_loop, 12, 15)
1409 self._check_end_pos(try_stmt, 17, 8)
1410 self._check_end_pos(pass_stmt, 19, 4)
1411
1412 self._check_content(s, while_loop.test, 'True')
1413 self._check_content(s, if_stmt.body[0], 'x = None')
1414 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1415 self._check_content(s, for_loop.target, 'x, y')
1416 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1417 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1418
1419 def test_fstring(self):
1420 s = 'x = f"abc {x + y} abc"'
1421 fstr = self._parse_value(s)
1422 binop = fstr.values[1].value
1423 self._check_content(s, binop, 'x + y')
1424
1425 def test_fstring_multi_line(self):
1426 s = dedent('''
1427 f"""Some multi-line text.
1428 {
1429 arg_one
1430 +
1431 arg_two
1432 }
1433 It goes on..."""
1434 ''').strip()
1435 fstr = self._parse_value(s)
1436 binop = fstr.values[1].value
1437 self._check_end_pos(binop, 5, 7)
1438 self._check_content(s, binop.left, 'arg_one')
1439 self._check_content(s, binop.right, 'arg_two')
1440
1441 def test_import_from_multi_line(self):
1442 s = dedent('''
1443 from x.y.z import (
1444 a, b, c as c
1445 )
1446 ''').strip()
1447 imp = ast.parse(s).body[0]
1448 self._check_end_pos(imp, 3, 1)
1449
1450 def test_slices(self):
1451 s1 = 'f()[1, 2] [0]'
1452 s2 = 'x[ a.b: c.d]'
1453 sm = dedent('''
1454 x[ a.b: f () ,
1455 g () : c.d
1456 ]
1457 ''').strip()
1458 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1459 self._check_content(s1, i1.value, 'f()[1, 2]')
1460 self._check_content(s1, i1.value.slice.value, '1, 2')
1461 self._check_content(s2, i2.slice.lower, 'a.b')
1462 self._check_content(s2, i2.slice.upper, 'c.d')
1463 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1464 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1465 self._check_end_pos(im, 3, 3)
1466
1467 def test_binop(self):
1468 s = dedent('''
1469 (1 * 2 + (3 ) +
1470 4
1471 )
1472 ''').strip()
1473 binop = self._parse_value(s)
1474 self._check_end_pos(binop, 2, 6)
1475 self._check_content(s, binop.right, '4')
1476 self._check_content(s, binop.left, '1 * 2 + (3 )')
1477 self._check_content(s, binop.left.right, '3')
1478
1479 def test_boolop(self):
1480 s = dedent('''
1481 if (one_condition and
1482 (other_condition or yet_another_one)):
1483 pass
1484 ''').strip()
1485 bop = ast.parse(s).body[0].test
1486 self._check_end_pos(bop, 2, 44)
1487 self._check_content(s, bop.values[1],
1488 'other_condition or yet_another_one')
1489
1490 def test_tuples(self):
1491 s1 = 'x = () ;'
1492 s2 = 'x = 1 , ;'
1493 s3 = 'x = (1 , 2 ) ;'
1494 sm = dedent('''
1495 x = (
1496 a, b,
1497 )
1498 ''').strip()
1499 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1500 self._check_content(s1, t1, '()')
1501 self._check_content(s2, t2, '1 ,')
1502 self._check_content(s3, t3, '(1 , 2 )')
1503 self._check_end_pos(tm, 3, 1)
1504
1505 def test_attribute_spaces(self):
1506 s = 'func(x. y .z)'
1507 call = self._parse_value(s)
1508 self._check_content(s, call, s)
1509 self._check_content(s, call.args[0], 'x. y .z')
1510
1511 def test_displays(self):
1512 s1 = '[{}, {1, }, {1, 2,} ]'
1513 s2 = '{a: b, f (): g () ,}'
1514 c1 = self._parse_value(s1)
1515 c2 = self._parse_value(s2)
1516 self._check_content(s1, c1.elts[0], '{}')
1517 self._check_content(s1, c1.elts[1], '{1, }')
1518 self._check_content(s1, c1.elts[2], '{1, 2,}')
1519 self._check_content(s2, c2.keys[1], 'f ()')
1520 self._check_content(s2, c2.values[1], 'g ()')
1521
1522 def test_comprehensions(self):
1523 s = dedent('''
1524 x = [{x for x, y in stuff
1525 if cond.x} for stuff in things]
1526 ''').strip()
1527 cmp = self._parse_value(s)
1528 self._check_end_pos(cmp, 2, 37)
1529 self._check_content(s, cmp.generators[0].iter, 'things')
1530 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1531 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1532 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1533
1534 def test_yield_await(self):
1535 s = dedent('''
1536 async def f():
1537 yield x
1538 await y
1539 ''').strip()
1540 fdef = ast.parse(s).body[0]
1541 self._check_content(s, fdef.body[0].value, 'yield x')
1542 self._check_content(s, fdef.body[1].value, 'await y')
1543
1544 def test_source_segment_multi(self):
1545 s_orig = dedent('''
1546 x = (
1547 a, b,
1548 ) + ()
1549 ''').strip()
1550 s_tuple = dedent('''
1551 (
1552 a, b,
1553 )
1554 ''').strip()
1555 binop = self._parse_value(s_orig)
1556 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1557
1558 def test_source_segment_padded(self):
1559 s_orig = dedent('''
1560 class C:
1561 def fun(self) -> None:
1562 "ЖЖЖЖЖ"
1563 ''').strip()
1564 s_method = ' def fun(self) -> None:\n' \
1565 ' "ЖЖЖЖЖ"'
1566 cdef = ast.parse(s_orig).body[0]
1567 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1568 s_method)
1569
1570 def test_source_segment_endings(self):
1571 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1572 v, w, x, y, z = ast.parse(s).body
1573 self._check_content(s, v, 'v = 1')
1574 self._check_content(s, w, 'w = 1')
1575 self._check_content(s, x, 'x = 1')
1576 self._check_content(s, y, 'y = 1')
1577 self._check_content(s, z, 'z = 1')
1578
1579 def test_source_segment_tabs(self):
1580 s = dedent('''
1581 class C:
1582 \t\f def fun(self) -> None:
1583 \t\f pass
1584 ''').strip()
1585 s_method = ' \t\f def fun(self) -> None:\n' \
1586 ' \t\f pass'
1587
1588 cdef = ast.parse(s).body[0]
1589 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1590
1591
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001592def main():
1593 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001594 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001595 if sys.argv[1:] == ['-g']:
1596 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1597 (eval_tests, "eval")):
1598 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001599 for statement in statements:
1600 tree = ast.parse(statement, "?", kind)
1601 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001602 print("]")
1603 print("main()")
1604 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001605 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001606
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001607#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001608exec_results = [
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001609('Module', [('Expr', (1, 0), ('Constant', (1, 0), None))], []),
1610('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring'))], []),
1611('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1612('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring'))], [], None, None)], []),
1613('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1614('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0)]), [('Pass', (1, 12))], [], None, None)], []),
1615('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1616('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
1617('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)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1), ('Constant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()'))], [], None, None)], []),
1618('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
1619('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C'))], [])], []),
1620('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
1621('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1))], [], None, None)], []),
1622('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
1623('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1), None)], []),
1624('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1625('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1626('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1627('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1))], []),
1628('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1629('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1630('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1631('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1632('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)], []),
1633('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string')], []), None)], []),
1634('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1635('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1636('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1637('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1638('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1639('Module', [('Global', (1, 0), ['v'])], []),
1640('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1))], []),
1641('Module', [('Pass', (1, 0))], []),
1642('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1643('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1644('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)], []),
1645('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)], []),
1646('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)], []),
1647('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)]))], []),
1648('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)]))], []),
1649('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)]))], []),
1650('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)]))], []),
1651('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)]))], []),
1652('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function')), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []),
1653('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))], [('Expr', (3, 7), ('Constant', (3, 7), 2))], None)], [], None, None)], []),
1654('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)], []),
1655('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2)], [('Dict', (1, 3), [('Constant', (1, 4), 1)], [('Constant', (1, 6), 2)]), ('Constant', (1, 12), 3)]))], []),
1656('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1), ('Constant', (1, 6), 2)]), ('Load',)), ('Constant', (1, 10), 3)]))], []),
1657('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)], []),
1658('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)], []),
1659('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)], []),
1660('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
1661('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 +00001662]
1663single_results = [
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001664('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1), ('Add',), ('Constant', (1, 2), 2)))]),
Tim Peters400cbc32006-02-28 18:44:41 +00001665]
1666eval_results = [
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001667('Expression', ('Constant', (1, 0), None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001668('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1669('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1670('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001671('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('Constant', (1, 7), None))),
1672('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1)], [('Constant', (1, 4), 2)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001673('Expression', ('Dict', (1, 0), [], [])),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001674('Expression', ('Set', (1, 0), [('Constant', (1, 1), None)])),
1675('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1)], [('Constant', (4, 10), 2)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001676('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)])),
1677('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)])),
1678('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)])),
1679('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)])),
1680('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)])),
1681('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)])),
1682('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)])),
1683('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)])),
1684('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)])),
1685('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)])),
1686('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)])),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001687('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2), ('Constant', (1, 8), 3)])),
1688('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1), ('Constant', (1, 4), 2), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001689('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)])], [])),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001690('Expression', ('Constant', (1, 0), 10)),
1691('Expression', ('Constant', (1, 0), 'string')),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001692('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1693('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 +00001694('Expression', ('Name', (1, 0), 'v', ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001695('Expression', ('List', (1, 0), [('Constant', (1, 1), 1), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001696('Expression', ('List', (1, 0), [], ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001697('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1), ('Constant', (1, 2), 2), ('Constant', (1, 4), 3)], ('Load',))),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001698('Expression', ('Tuple', (1, 0), [('Constant', (1, 1), 1), ('Constant', (1, 3), 2), ('Constant', (1, 5), 3)], ('Load',))),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001699('Expression', ('Tuple', (1, 0), [], ('Load',))),
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001700('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), ('Constant', (1, 14), 2), None), ('Load',))], [])),
Tim Peters400cbc32006-02-28 18:44:41 +00001701]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001702main()