blob: e39d1f2e17a89e85486a28d9a3a5c0ab85f7497f [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
2import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003import os
4import sys
5import unittest
Benjamin Peterson9ed37432012-07-08 11:13:36 -07006import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00007from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07008
9from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000010
11def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000012 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000013 return t
14 elif isinstance(t, list):
15 return [to_tuple(e) for e in t]
16 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000017 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
18 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000019 if t._fields is None:
20 return tuple(result)
21 for f in t._fields:
22 result.append(to_tuple(getattr(t, f)))
23 return tuple(result)
24
Neal Norwitzee9b10a2008-03-31 05:29:39 +000025
Tim Peters400cbc32006-02-28 18:44:41 +000026# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030027# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000028exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050029 # None
30 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090031 # Module docstring
32 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000033 # FunctionDef
34 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090035 # FunctionDef with docstring
36 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050037 # FunctionDef with arg
38 "def f(a): pass",
39 # FunctionDef with arg and default value
40 "def f(a=0): pass",
41 # FunctionDef with varargs
42 "def f(*args): pass",
43 # FunctionDef with kwargs
44 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090045 # FunctionDef with all kind of args and docstring
46 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000047 # ClassDef
48 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090049 # ClassDef with docstring
50 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050051 # ClassDef, new style class
52 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000053 # Return
54 "def f():return 1",
55 # Delete
56 "del v",
57 # Assign
58 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020059 "a,b = c",
60 "(a,b) = c",
61 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000062 # AugAssign
63 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000064 # For
65 "for v in v:pass",
66 # While
67 "while v:pass",
68 # If
69 "if v:pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050070 # With
71 "with x as y: pass",
72 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000073 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000074 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000075 # TryExcept
76 "try:\n pass\nexcept Exception:\n pass",
77 # TryFinally
78 "try:\n pass\nfinally:\n pass",
79 # Assert
80 "assert v",
81 # Import
82 "import sys",
83 # ImportFrom
84 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000085 # Global
86 "global v",
87 # Expr
88 "1",
89 # Pass,
90 "pass",
91 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040092 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000093 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040094 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000095 # for statements with naked tuples (see http://bugs.python.org/issue6704)
96 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +020097 "for (a,b) in c: pass",
98 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050099 # Multiline generator expression (test for .lineno & .col_offset)
100 """(
101 (
102 Aa
103 ,
104 Bb
105 )
106 for
107 Aa
108 ,
109 Bb in Cc
110 )""",
111 # dictcomp
112 "{a : b for w in x for m in p if g}",
113 # dictcomp with naked tuple
114 "{a : b for v,w in x}",
115 # setcomp
116 "{r for l in x if g}",
117 # setcomp with naked tuple
118 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400119 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900120 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400121 # AsyncFor
122 "async def f():\n async for e in i: 1\n else: 2",
123 # AsyncWith
124 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400125 # PEP 448: Additional Unpacking Generalizations
126 "{**{1:2}, 2:3}",
127 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700128 # Asynchronous comprehensions
129 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200130 # Decorated FunctionDef
131 "@deco1\n@deco2()\ndef f(): pass",
132 # Decorated AsyncFunctionDef
133 "@deco1\n@deco2()\nasync def f(): pass",
134 # Decorated ClassDef
135 "@deco1\n@deco2()\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200136 # Decorator with generator argument
137 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000138 # Simple assignment expression
139 "(a := 1)",
140
Tim Peters400cbc32006-02-28 18:44:41 +0000141]
142
143# These are compiled through "single"
144# because of overlap with "eval", it just tests what
145# can't be tested with "eval"
146single_tests = [
147 "1+2"
148]
149
150# These are compiled through "eval"
151# It should test all expressions
152eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500153 # None
154 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000155 # BoolOp
156 "a and b",
157 # BinOp
158 "a + b",
159 # UnaryOp
160 "not v",
161 # Lambda
162 "lambda:None",
163 # Dict
164 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500165 # Empty dict
166 "{}",
167 # Set
168 "{None,}",
169 # Multiline dict (test for .lineno & .col_offset)
170 """{
171 1
172 :
173 2
174 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000175 # ListComp
176 "[a for b in c if d]",
177 # GeneratorExp
178 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200179 # Comprehensions with multiple for targets
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}",
186 "((a,b) for a,b in c)",
187 "((a,b) for (a,b) in c)",
188 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000189 # Yield - yield expressions can't work outside a function
190 #
191 # Compare
192 "1 < 2 < 3",
193 # Call
194 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200195 # Call with a generator argument
196 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000197 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000198 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000199 # Str
200 "'string'",
201 # Attribute
202 "a.b",
203 # Subscript
204 "a[b:c]",
205 # Name
206 "v",
207 # List
208 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500209 # Empty list
210 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000211 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000212 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500213 # Tuple
214 "(1,2,3)",
215 # Empty tuple
216 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000217 # Combination
218 "a.b.c.d(a.b[1:2])",
219
Tim Peters400cbc32006-02-28 18:44:41 +0000220]
221
222# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
223# excepthandler, arguments, keywords, alias
224
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000225class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000226
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500227 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000228 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000229 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000230 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000231 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200232 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000233 parent_pos = (ast_node.lineno, ast_node.col_offset)
234 for name in ast_node._fields:
235 value = getattr(ast_node, name)
236 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200237 first_pos = parent_pos
238 if value and name == 'decorator_list':
239 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000240 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200241 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000242 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500243 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000244
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500245 def test_AST_objects(self):
246 x = ast.AST()
247 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700248 x.foobar = 42
249 self.assertEqual(x.foobar, 42)
250 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500251
252 with self.assertRaises(AttributeError):
253 x.vararg
254
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500255 with self.assertRaises(TypeError):
256 # "_ast.AST constructor takes 0 positional arguments"
257 ast.AST(2)
258
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700259 def test_AST_garbage_collection(self):
260 class X:
261 pass
262 a = ast.AST()
263 a.x = X()
264 a.x.a = a
265 ref = weakref.ref(a.x)
266 del a
267 support.gc_collect()
268 self.assertIsNone(ref())
269
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000270 def test_snippets(self):
271 for input, output, kind in ((exec_tests, exec_results, "exec"),
272 (single_tests, single_results, "single"),
273 (eval_tests, eval_results, "eval")):
274 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400275 with self.subTest(action="parsing", input=i):
276 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
277 self.assertEqual(to_tuple(ast_tree), o)
278 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100279 with self.subTest(action="compiling", input=i, kind=kind):
280 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000281
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000282 def test_ast_validation(self):
283 # compile() is the only function that calls PyAST_Validate
284 snippets_to_validate = exec_tests + single_tests + eval_tests
285 for snippet in snippets_to_validate:
286 tree = ast.parse(snippet)
287 compile(tree, '<string>', 'exec')
288
Benjamin Peterson78565b22009-06-28 19:19:51 +0000289 def test_slice(self):
290 slc = ast.parse("x[::]").body[0].value.slice
291 self.assertIsNone(slc.upper)
292 self.assertIsNone(slc.lower)
293 self.assertIsNone(slc.step)
294
295 def test_from_import(self):
296 im = ast.parse("from . import y").body[0]
297 self.assertIsNone(im.module)
298
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400299 def test_non_interned_future_from_ast(self):
300 mod = ast.parse("from __future__ import division")
301 self.assertIsInstance(mod.body[0], ast.ImportFrom)
302 mod.body[0].module = " __future__ ".strip()
303 compile(mod, "<test>", "exec")
304
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000305 def test_base_classes(self):
306 self.assertTrue(issubclass(ast.For, ast.stmt))
307 self.assertTrue(issubclass(ast.Name, ast.expr))
308 self.assertTrue(issubclass(ast.stmt, ast.AST))
309 self.assertTrue(issubclass(ast.expr, ast.AST))
310 self.assertTrue(issubclass(ast.comprehension, ast.AST))
311 self.assertTrue(issubclass(ast.Gt, ast.AST))
312
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500313 def test_field_attr_existence(self):
314 for name, item in ast.__dict__.items():
315 if isinstance(item, type) and name != 'AST' and name[0].isupper():
316 x = item()
317 if isinstance(x, ast.AST):
318 self.assertEqual(type(x._fields), tuple)
319
320 def test_arguments(self):
321 x = ast.arguments()
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500322 self.assertEqual(x._fields, ('args', 'vararg', 'kwonlyargs',
323 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500324
325 with self.assertRaises(AttributeError):
326 x.vararg
327
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700328 x = ast.arguments(*range(1, 7))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500329 self.assertEqual(x.vararg, 2)
330
331 def test_field_attr_writable(self):
332 x = ast.Num()
333 # We can assign to _fields
334 x._fields = 666
335 self.assertEqual(x._fields, 666)
336
337 def test_classattrs(self):
338 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700339 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300340
341 with self.assertRaises(AttributeError):
342 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500343
344 with self.assertRaises(AttributeError):
345 x.n
346
347 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300348 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500349 self.assertEqual(x.n, 42)
350
351 with self.assertRaises(AttributeError):
352 x.lineno
353
354 with self.assertRaises(AttributeError):
355 x.foobar
356
357 x = ast.Num(lineno=2)
358 self.assertEqual(x.lineno, 2)
359
360 x = ast.Num(42, lineno=0)
361 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700362 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300363 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500364 self.assertEqual(x.n, 42)
365
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700366 self.assertRaises(TypeError, ast.Num, 1, None, 2)
367 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500368
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300369 self.assertEqual(ast.Num(42).n, 42)
370 self.assertEqual(ast.Num(4.25).n, 4.25)
371 self.assertEqual(ast.Num(4.25j).n, 4.25j)
372 self.assertEqual(ast.Str('42').s, '42')
373 self.assertEqual(ast.Bytes(b'42').s, b'42')
374 self.assertIs(ast.NameConstant(True).value, True)
375 self.assertIs(ast.NameConstant(False).value, False)
376 self.assertIs(ast.NameConstant(None).value, None)
377
378 self.assertEqual(ast.Constant(42).value, 42)
379 self.assertEqual(ast.Constant(4.25).value, 4.25)
380 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
381 self.assertEqual(ast.Constant('42').value, '42')
382 self.assertEqual(ast.Constant(b'42').value, b'42')
383 self.assertIs(ast.Constant(True).value, True)
384 self.assertIs(ast.Constant(False).value, False)
385 self.assertIs(ast.Constant(None).value, None)
386 self.assertIs(ast.Constant(...).value, ...)
387
388 def test_realtype(self):
389 self.assertEqual(type(ast.Num(42)), ast.Constant)
390 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
391 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
392 self.assertEqual(type(ast.Str('42')), ast.Constant)
393 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
394 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
395 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
396 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
397 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
398
399 def test_isinstance(self):
400 self.assertTrue(isinstance(ast.Num(42), ast.Num))
401 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
402 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
403 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
404 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
405 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
406 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
407 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
408 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
409
410 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
411 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
412 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
413 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
414 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
415 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
416 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
417 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
418 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
419
420 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
421 self.assertFalse(isinstance(ast.Num(42), ast.Str))
422 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
423 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
424 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800425 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
426 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300427
428 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
429 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
430 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
431 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
432 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800433 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
434 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300435
436 self.assertFalse(isinstance(ast.Constant(), ast.Num))
437 self.assertFalse(isinstance(ast.Constant(), ast.Str))
438 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
439 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
440 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
441
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200442 class S(str): pass
443 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
444 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
445
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300446 def test_subclasses(self):
447 class N(ast.Num):
448 def __init__(self, *args, **kwargs):
449 super().__init__(*args, **kwargs)
450 self.z = 'spam'
451 class N2(ast.Num):
452 pass
453
454 n = N(42)
455 self.assertEqual(n.n, 42)
456 self.assertEqual(n.z, 'spam')
457 self.assertEqual(type(n), N)
458 self.assertTrue(isinstance(n, N))
459 self.assertTrue(isinstance(n, ast.Num))
460 self.assertFalse(isinstance(n, N2))
461 self.assertFalse(isinstance(ast.Num(42), N))
462 n = N(n=42)
463 self.assertEqual(n.n, 42)
464 self.assertEqual(type(n), N)
465
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500466 def test_module(self):
467 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800468 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500469 self.assertEqual(x.body, body)
470
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000471 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100472 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500473 x = ast.BinOp()
474 self.assertEqual(x._fields, ('left', 'op', 'right'))
475
476 # Random attribute allowed too
477 x.foobarbaz = 5
478 self.assertEqual(x.foobarbaz, 5)
479
480 n1 = ast.Num(1)
481 n3 = ast.Num(3)
482 addop = ast.Add()
483 x = ast.BinOp(n1, addop, n3)
484 self.assertEqual(x.left, n1)
485 self.assertEqual(x.op, addop)
486 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500487
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500488 x = ast.BinOp(1, 2, 3)
489 self.assertEqual(x.left, 1)
490 self.assertEqual(x.op, 2)
491 self.assertEqual(x.right, 3)
492
Georg Brandl0c77a822008-06-10 16:37:50 +0000493 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000494 self.assertEqual(x.left, 1)
495 self.assertEqual(x.op, 2)
496 self.assertEqual(x.right, 3)
497 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000498
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500499 # node raises exception when given too many arguments
500 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500501 # node raises exception when given too many arguments
502 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000503
504 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000505 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000506 self.assertEqual(x.left, 1)
507 self.assertEqual(x.op, 2)
508 self.assertEqual(x.right, 3)
509 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000510
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500511 # Random kwargs also allowed
512 x = ast.BinOp(1, 2, 3, foobarbaz=42)
513 self.assertEqual(x.foobarbaz, 42)
514
515 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000516 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000517 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500518 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000519
520 def test_pickling(self):
521 import pickle
522 mods = [pickle]
523 try:
524 import cPickle
525 mods.append(cPickle)
526 except ImportError:
527 pass
528 protocols = [0, 1, 2]
529 for mod in mods:
530 for protocol in protocols:
531 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
532 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000533 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000534
Benjamin Peterson5b066812010-11-20 01:38:49 +0000535 def test_invalid_sum(self):
536 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800537 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000538 with self.assertRaises(TypeError) as cm:
539 compile(m, "<test>", "exec")
540 self.assertIn("but got <_ast.expr", str(cm.exception))
541
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500542 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800543 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500544 ast.fix_missing_locations(m)
545 with self.assertRaises(TypeError) as cm:
546 compile(m, "<test>", "exec")
547 self.assertIn("identifier must be of type str", str(cm.exception))
548
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000549 def test_empty_yield_from(self):
550 # Issue 16546: yield from value is not optional.
551 empty_yield_from = ast.parse("def f():\n yield from g()")
552 empty_yield_from.body[0].body[0].value.value = None
553 with self.assertRaises(ValueError) as cm:
554 compile(empty_yield_from, "<test>", "exec")
555 self.assertIn("field value is required", str(cm.exception))
556
Oren Milman7dc46d82017-09-30 20:16:24 +0300557 @support.cpython_only
558 def test_issue31592(self):
559 # There shouldn't be an assertion failure in case of a bad
560 # unicodedata.normalize().
561 import unicodedata
562 def bad_normalize(*args):
563 return None
564 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
565 self.assertRaises(TypeError, ast.parse, '\u03D5')
566
Georg Brandl0c77a822008-06-10 16:37:50 +0000567
568class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700569 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000570
571 def test_parse(self):
572 a = ast.parse('foo(1 + 1)')
573 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
574 self.assertEqual(ast.dump(a), ast.dump(b))
575
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400576 def test_parse_in_error(self):
577 try:
578 1/0
579 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400580 with self.assertRaises(SyntaxError) as e:
581 ast.literal_eval(r"'\U'")
582 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400583
Georg Brandl0c77a822008-06-10 16:37:50 +0000584 def test_dump(self):
585 node = ast.parse('spam(eggs, "and cheese")')
586 self.assertEqual(ast.dump(node),
587 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700588 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800589 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000590 )
591 self.assertEqual(ast.dump(node, annotate_fields=False),
592 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700593 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000594 )
595 self.assertEqual(ast.dump(node, include_attributes=True),
596 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000597 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
598 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700599 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000600 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
601 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800602 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000603 )
604
605 def test_copy_location(self):
606 src = ast.parse('1 + 1', mode='eval')
607 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
608 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700609 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000610 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
611 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
612 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000613 )
614
615 def test_fix_missing_locations(self):
616 src = ast.parse('write("spam")')
617 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400618 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000619 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000620 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000621 self.assertEqual(ast.dump(src, include_attributes=True),
622 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000623 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700624 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000625 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
626 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
627 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
628 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
629 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
630 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800631 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
632 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000633 )
634
635 def test_increment_lineno(self):
636 src = ast.parse('1 + 1', mode='eval')
637 self.assertEqual(ast.increment_lineno(src, n=3), src)
638 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700639 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
640 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000641 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
642 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000643 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000644 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000645 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000646 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
647 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700648 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
649 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000650 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
651 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000652 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000653
654 def test_iter_fields(self):
655 node = ast.parse('foo()', mode='eval')
656 d = dict(ast.iter_fields(node.body))
657 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400658 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000659
660 def test_iter_child_nodes(self):
661 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
662 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
663 iterator = ast.iter_child_nodes(node.body)
664 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300665 self.assertEqual(next(iterator).value, 23)
666 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000667 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700668 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000669 )
670
671 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300672 node = ast.parse('"""line one\n line two"""')
673 self.assertEqual(ast.get_docstring(node),
674 'line one\nline two')
675
676 node = ast.parse('class foo:\n """line one\n line two"""')
677 self.assertEqual(ast.get_docstring(node.body[0]),
678 'line one\nline two')
679
Georg Brandl0c77a822008-06-10 16:37:50 +0000680 node = ast.parse('def foo():\n """line one\n line two"""')
681 self.assertEqual(ast.get_docstring(node.body[0]),
682 'line one\nline two')
683
Yury Selivanov2f07a662015-07-23 08:54:35 +0300684 node = ast.parse('async def foo():\n """spam\n ham"""')
685 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300686
687 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800688 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300689 node = ast.parse('x = "not docstring"')
690 self.assertIsNone(ast.get_docstring(node))
691 node = ast.parse('def foo():\n pass')
692 self.assertIsNone(ast.get_docstring(node))
693
694 node = ast.parse('class foo:\n pass')
695 self.assertIsNone(ast.get_docstring(node.body[0]))
696 node = ast.parse('class foo:\n x = "not docstring"')
697 self.assertIsNone(ast.get_docstring(node.body[0]))
698 node = ast.parse('class foo:\n def bar(self): pass')
699 self.assertIsNone(ast.get_docstring(node.body[0]))
700
701 node = ast.parse('def foo():\n pass')
702 self.assertIsNone(ast.get_docstring(node.body[0]))
703 node = ast.parse('def foo():\n x = "not docstring"')
704 self.assertIsNone(ast.get_docstring(node.body[0]))
705
706 node = ast.parse('async def foo():\n pass')
707 self.assertIsNone(ast.get_docstring(node.body[0]))
708 node = ast.parse('async def foo():\n x = "not docstring"')
709 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300710
Anthony Sottile995d9b92019-01-12 20:05:13 -0800711 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
712 node = ast.parse(
713 '"""line one\nline two"""\n\n'
714 'def foo():\n """line one\n line two"""\n\n'
715 ' def bar():\n """line one\n line two"""\n'
716 ' """line one\n line two"""\n'
717 '"""line one\nline two"""\n\n'
718 )
719 self.assertEqual(node.body[0].col_offset, 0)
720 self.assertEqual(node.body[0].lineno, 1)
721 self.assertEqual(node.body[1].body[0].col_offset, 2)
722 self.assertEqual(node.body[1].body[0].lineno, 5)
723 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
724 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
725 self.assertEqual(node.body[1].body[2].col_offset, 2)
726 self.assertEqual(node.body[1].body[2].lineno, 11)
727 self.assertEqual(node.body[2].col_offset, 0)
728 self.assertEqual(node.body[2].lineno, 13)
729
Georg Brandl0c77a822008-06-10 16:37:50 +0000730 def test_literal_eval(self):
731 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
732 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
733 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000734 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000735 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000736 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200737 self.assertEqual(ast.literal_eval('6'), 6)
738 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000739 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000740 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200741 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
742 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
743 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
744 self.assertRaises(ValueError, ast.literal_eval, '++6')
745 self.assertRaises(ValueError, ast.literal_eval, '+True')
746 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000747
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200748 def test_literal_eval_complex(self):
749 # Issue #4907
750 self.assertEqual(ast.literal_eval('6j'), 6j)
751 self.assertEqual(ast.literal_eval('-6j'), -6j)
752 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
753 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
754 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
755 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
756 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
757 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
758 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
759 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
760 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
761 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
762 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
763 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
764 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
765 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
766 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
767 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000768
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100769 def test_bad_integer(self):
770 # issue13436: Bad error message with invalid numeric values
771 body = [ast.ImportFrom(module='time',
772 names=[ast.alias(name='sleep')],
773 level=None,
774 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800775 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100776 with self.assertRaises(ValueError) as cm:
777 compile(mod, 'test', 'exec')
778 self.assertIn("invalid integer value: None", str(cm.exception))
779
Berker Peksag0a5bd512016-04-29 19:50:02 +0300780 def test_level_as_none(self):
781 body = [ast.ImportFrom(module='time',
782 names=[ast.alias(name='sleep')],
783 level=None,
784 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800785 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300786 code = compile(mod, 'test', 'exec')
787 ns = {}
788 exec(code, ns)
789 self.assertIn('sleep', ns)
790
Georg Brandl0c77a822008-06-10 16:37:50 +0000791
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500792class ASTValidatorTests(unittest.TestCase):
793
794 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
795 mod.lineno = mod.col_offset = 0
796 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300797 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500798 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300799 else:
800 with self.assertRaises(exc) as cm:
801 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500802 self.assertIn(msg, str(cm.exception))
803
804 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800805 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500806 self.mod(mod, msg, exc=exc)
807
808 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800809 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500810 self.mod(mod, msg)
811
812 def test_module(self):
813 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
814 self.mod(m, "must have Load context", "single")
815 m = ast.Expression(ast.Name("x", ast.Store()))
816 self.mod(m, "must have Load context", "eval")
817
818 def _check_arguments(self, fac, check):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700819 def arguments(args=None, vararg=None,
820 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500821 defaults=None, kw_defaults=None):
822 if args is None:
823 args = []
824 if kwonlyargs is None:
825 kwonlyargs = []
826 if defaults is None:
827 defaults = []
828 if kw_defaults is None:
829 kw_defaults = []
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700830 args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
831 kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500832 return fac(args)
833 args = [ast.arg("x", ast.Name("x", ast.Store()))]
834 check(arguments(args=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500835 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500836 check(arguments(defaults=[ast.Num(3)]),
837 "more positional defaults than args")
838 check(arguments(kw_defaults=[ast.Num(4)]),
839 "length of kwonlyargs is not the same as kw_defaults")
840 args = [ast.arg("x", ast.Name("x", ast.Load()))]
841 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
842 "must have Load context")
843 args = [ast.arg("a", ast.Name("x", ast.Load())),
844 ast.arg("b", ast.Name("y", ast.Load()))]
845 check(arguments(kwonlyargs=args,
846 kw_defaults=[None, ast.Name("x", ast.Store())]),
847 "must have Load context")
848
849 def test_funcdef(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700850 a = ast.arguments([], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300851 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500852 self.stmt(f, "empty body on FunctionDef")
853 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300854 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500855 self.stmt(f, "must have Load context")
856 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300857 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500858 self.stmt(f, "must have Load context")
859 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300860 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500861 self._check_arguments(fac, self.stmt)
862
863 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400864 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500865 if bases is None:
866 bases = []
867 if keywords is None:
868 keywords = []
869 if body is None:
870 body = [ast.Pass()]
871 if decorator_list is None:
872 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400873 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300874 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500875 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
876 "must have Load context")
877 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
878 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500879 self.stmt(cls(body=[]), "empty body on ClassDef")
880 self.stmt(cls(body=[None]), "None disallowed")
881 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
882 "must have Load context")
883
884 def test_delete(self):
885 self.stmt(ast.Delete([]), "empty targets on Delete")
886 self.stmt(ast.Delete([None]), "None disallowed")
887 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
888 "must have Del context")
889
890 def test_assign(self):
891 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
892 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
893 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
894 "must have Store context")
895 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
896 ast.Name("y", ast.Store())),
897 "must have Load context")
898
899 def test_augassign(self):
900 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
901 ast.Name("y", ast.Load()))
902 self.stmt(aug, "must have Store context")
903 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
904 ast.Name("y", ast.Store()))
905 self.stmt(aug, "must have Load context")
906
907 def test_for(self):
908 x = ast.Name("x", ast.Store())
909 y = ast.Name("y", ast.Load())
910 p = ast.Pass()
911 self.stmt(ast.For(x, y, [], []), "empty body on For")
912 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
913 "must have Store context")
914 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
915 "must have Load context")
916 e = ast.Expr(ast.Name("x", ast.Store()))
917 self.stmt(ast.For(x, y, [e], []), "must have Load context")
918 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
919
920 def test_while(self):
921 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
922 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
923 "must have Load context")
924 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
925 [ast.Expr(ast.Name("x", ast.Store()))]),
926 "must have Load context")
927
928 def test_if(self):
929 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
930 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
931 self.stmt(i, "must have Load context")
932 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
933 self.stmt(i, "must have Load context")
934 i = ast.If(ast.Num(3), [ast.Pass()],
935 [ast.Expr(ast.Name("x", ast.Store()))])
936 self.stmt(i, "must have Load context")
937
938 def test_with(self):
939 p = ast.Pass()
940 self.stmt(ast.With([], [p]), "empty items on With")
941 i = ast.withitem(ast.Num(3), None)
942 self.stmt(ast.With([i], []), "empty body on With")
943 i = ast.withitem(ast.Name("x", ast.Store()), None)
944 self.stmt(ast.With([i], [p]), "must have Load context")
945 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
946 self.stmt(ast.With([i], [p]), "must have Store context")
947
948 def test_raise(self):
949 r = ast.Raise(None, ast.Num(3))
950 self.stmt(r, "Raise with cause but no exception")
951 r = ast.Raise(ast.Name("x", ast.Store()), None)
952 self.stmt(r, "must have Load context")
953 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
954 self.stmt(r, "must have Load context")
955
956 def test_try(self):
957 p = ast.Pass()
958 t = ast.Try([], [], [], [p])
959 self.stmt(t, "empty body on Try")
960 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
961 self.stmt(t, "must have Load context")
962 t = ast.Try([p], [], [], [])
963 self.stmt(t, "Try has neither except handlers nor finalbody")
964 t = ast.Try([p], [], [p], [p])
965 self.stmt(t, "Try has orelse but no except handlers")
966 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
967 self.stmt(t, "empty body on ExceptHandler")
968 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
969 self.stmt(ast.Try([p], e, [], []), "must have Load context")
970 e = [ast.ExceptHandler(None, "x", [p])]
971 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
972 self.stmt(t, "must have Load context")
973 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
974 self.stmt(t, "must have Load context")
975
976 def test_assert(self):
977 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
978 "must have Load context")
979 assrt = ast.Assert(ast.Name("x", ast.Load()),
980 ast.Name("y", ast.Store()))
981 self.stmt(assrt, "must have Load context")
982
983 def test_import(self):
984 self.stmt(ast.Import([]), "empty names on Import")
985
986 def test_importfrom(self):
987 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +0300988 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500989 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
990
991 def test_global(self):
992 self.stmt(ast.Global([]), "empty names on Global")
993
994 def test_nonlocal(self):
995 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
996
997 def test_expr(self):
998 e = ast.Expr(ast.Name("x", ast.Store()))
999 self.stmt(e, "must have Load context")
1000
1001 def test_boolop(self):
1002 b = ast.BoolOp(ast.And(), [])
1003 self.expr(b, "less than 2 values")
1004 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1005 self.expr(b, "less than 2 values")
1006 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1007 self.expr(b, "None disallowed")
1008 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1009 self.expr(b, "must have Load context")
1010
1011 def test_unaryop(self):
1012 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1013 self.expr(u, "must have Load context")
1014
1015 def test_lambda(self):
Benjamin Petersoncda75be2013-03-18 10:48:58 -07001016 a = ast.arguments([], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001017 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1018 "must have Load context")
1019 def fac(args):
1020 return ast.Lambda(args, ast.Name("x", ast.Load()))
1021 self._check_arguments(fac, self.expr)
1022
1023 def test_ifexp(self):
1024 l = ast.Name("x", ast.Load())
1025 s = ast.Name("y", ast.Store())
1026 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001027 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001028
1029 def test_dict(self):
1030 d = ast.Dict([], [ast.Name("x", ast.Load())])
1031 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001032 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1033 self.expr(d, "None disallowed")
1034
1035 def test_set(self):
1036 self.expr(ast.Set([None]), "None disallowed")
1037 s = ast.Set([ast.Name("x", ast.Store())])
1038 self.expr(s, "must have Load context")
1039
1040 def _check_comprehension(self, fac):
1041 self.expr(fac([]), "comprehension with no generators")
1042 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001043 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001044 self.expr(fac([g]), "must have Store context")
1045 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001046 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001047 self.expr(fac([g]), "must have Load context")
1048 x = ast.Name("x", ast.Store())
1049 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001050 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001051 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001052 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001053 self.expr(fac([g]), "must have Load context")
1054
1055 def _simple_comp(self, fac):
1056 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001057 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001058 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1059 "must have Load context")
1060 def wrap(gens):
1061 return fac(ast.Name("x", ast.Store()), gens)
1062 self._check_comprehension(wrap)
1063
1064 def test_listcomp(self):
1065 self._simple_comp(ast.ListComp)
1066
1067 def test_setcomp(self):
1068 self._simple_comp(ast.SetComp)
1069
1070 def test_generatorexp(self):
1071 self._simple_comp(ast.GeneratorExp)
1072
1073 def test_dictcomp(self):
1074 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001075 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001076 c = ast.DictComp(ast.Name("x", ast.Store()),
1077 ast.Name("y", ast.Load()), [g])
1078 self.expr(c, "must have Load context")
1079 c = ast.DictComp(ast.Name("x", ast.Load()),
1080 ast.Name("y", ast.Store()), [g])
1081 self.expr(c, "must have Load context")
1082 def factory(comps):
1083 k = ast.Name("x", ast.Load())
1084 v = ast.Name("y", ast.Load())
1085 return ast.DictComp(k, v, comps)
1086 self._check_comprehension(factory)
1087
1088 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001089 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1090 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001091
1092 def test_compare(self):
1093 left = ast.Name("x", ast.Load())
1094 comp = ast.Compare(left, [ast.In()], [])
1095 self.expr(comp, "no comparators")
1096 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1097 self.expr(comp, "different number of comparators and operands")
1098 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001099 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001100 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001101 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001102
1103 def test_call(self):
1104 func = ast.Name("x", ast.Load())
1105 args = [ast.Name("y", ast.Load())]
1106 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001107 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001108 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001109 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001110 self.expr(call, "None disallowed")
1111 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001112 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001113 self.expr(call, "must have Load context")
1114
1115 def test_num(self):
1116 class subint(int):
1117 pass
1118 class subfloat(float):
1119 pass
1120 class subcomplex(complex):
1121 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001122 for obj in "0", "hello":
1123 self.expr(ast.Num(obj))
1124 for obj in subint(), subfloat(), subcomplex():
1125 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001126
1127 def test_attribute(self):
1128 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1129 self.expr(attr, "must have Load context")
1130
1131 def test_subscript(self):
1132 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1133 ast.Load())
1134 self.expr(sub, "must have Load context")
1135 x = ast.Name("x", ast.Load())
1136 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1137 ast.Load())
1138 self.expr(sub, "must have Load context")
1139 s = ast.Name("x", ast.Store())
1140 for args in (s, None, None), (None, s, None), (None, None, s):
1141 sl = ast.Slice(*args)
1142 self.expr(ast.Subscript(x, sl, ast.Load()),
1143 "must have Load context")
1144 sl = ast.ExtSlice([])
1145 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1146 sl = ast.ExtSlice([ast.Index(s)])
1147 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1148
1149 def test_starred(self):
1150 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1151 ast.Store())
1152 assign = ast.Assign([left], ast.Num(4))
1153 self.stmt(assign, "must have Store context")
1154
1155 def _sequence(self, fac):
1156 self.expr(fac([None], ast.Load()), "None disallowed")
1157 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1158 "must have Load context")
1159
1160 def test_list(self):
1161 self._sequence(ast.List)
1162
1163 def test_tuple(self):
1164 self._sequence(ast.Tuple)
1165
Benjamin Peterson442f2092012-12-06 17:41:04 -05001166 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001167 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001168
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001169 def test_stdlib_validates(self):
1170 stdlib = os.path.dirname(ast.__file__)
1171 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1172 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1173 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001174 with self.subTest(module):
1175 fn = os.path.join(stdlib, module)
1176 with open(fn, "r", encoding="utf-8") as fp:
1177 source = fp.read()
1178 mod = ast.parse(source, fn)
1179 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001180
1181
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001182class ConstantTests(unittest.TestCase):
1183 """Tests on the ast.Constant node type."""
1184
1185 def compile_constant(self, value):
1186 tree = ast.parse("x = 123")
1187
1188 node = tree.body[0].value
1189 new_node = ast.Constant(value=value)
1190 ast.copy_location(new_node, node)
1191 tree.body[0].value = new_node
1192
1193 code = compile(tree, "<string>", "exec")
1194
1195 ns = {}
1196 exec(code, ns)
1197 return ns['x']
1198
Victor Stinnerbe59d142016-01-27 00:39:12 +01001199 def test_validation(self):
1200 with self.assertRaises(TypeError) as cm:
1201 self.compile_constant([1, 2, 3])
1202 self.assertEqual(str(cm.exception),
1203 "got an invalid type in Constant: list")
1204
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001205 def test_singletons(self):
1206 for const in (None, False, True, Ellipsis, b'', frozenset()):
1207 with self.subTest(const=const):
1208 value = self.compile_constant(const)
1209 self.assertIs(value, const)
1210
1211 def test_values(self):
1212 nested_tuple = (1,)
1213 nested_frozenset = frozenset({1})
1214 for level in range(3):
1215 nested_tuple = (nested_tuple, 2)
1216 nested_frozenset = frozenset({nested_frozenset, 2})
1217 values = (123, 123.0, 123j,
1218 "unicode", b'bytes',
1219 tuple("tuple"), frozenset("frozenset"),
1220 nested_tuple, nested_frozenset)
1221 for value in values:
1222 with self.subTest(value=value):
1223 result = self.compile_constant(value)
1224 self.assertEqual(result, value)
1225
1226 def test_assign_to_constant(self):
1227 tree = ast.parse("x = 1")
1228
1229 target = tree.body[0].targets[0]
1230 new_target = ast.Constant(value=1)
1231 ast.copy_location(new_target, target)
1232 tree.body[0].targets[0] = new_target
1233
1234 with self.assertRaises(ValueError) as cm:
1235 compile(tree, "string", "exec")
1236 self.assertEqual(str(cm.exception),
1237 "expression which can't be assigned "
1238 "to in Store context")
1239
1240 def test_get_docstring(self):
1241 tree = ast.parse("'docstring'\nx = 1")
1242 self.assertEqual(ast.get_docstring(tree), 'docstring')
1243
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001244 def get_load_const(self, tree):
1245 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1246 # instructions
1247 co = compile(tree, '<string>', 'exec')
1248 consts = []
1249 for instr in dis.get_instructions(co):
1250 if instr.opname == 'LOAD_CONST':
1251 consts.append(instr.argval)
1252 return consts
1253
1254 @support.cpython_only
1255 def test_load_const(self):
1256 consts = [None,
1257 True, False,
1258 124,
1259 2.0,
1260 3j,
1261 "unicode",
1262 b'bytes',
1263 (1, 2, 3)]
1264
Victor Stinnera2724092016-02-08 18:17:58 +01001265 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1266 code += '\nx = ...'
1267 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001268
1269 tree = ast.parse(code)
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 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001274 for assign, const in zip(tree.body, consts):
1275 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001276 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001277 ast.copy_location(new_node, assign.value)
1278 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001279
Victor Stinnera2724092016-02-08 18:17:58 +01001280 self.assertEqual(self.get_load_const(tree),
1281 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001282
1283 def test_literal_eval(self):
1284 tree = ast.parse("1 + 2")
1285 binop = tree.body[0].value
1286
1287 new_left = ast.Constant(value=10)
1288 ast.copy_location(new_left, binop.left)
1289 binop.left = new_left
1290
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001291 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001292 ast.copy_location(new_right, binop.right)
1293 binop.right = new_right
1294
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001295 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001296
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001297 def test_string_kind(self):
1298 c = ast.parse('"x"', mode='eval').body
1299 self.assertEqual(c.value, "x")
1300 self.assertEqual(c.kind, None)
1301
1302 c = ast.parse('u"x"', mode='eval').body
1303 self.assertEqual(c.value, "x")
1304 self.assertEqual(c.kind, "u")
1305
1306 c = ast.parse('r"x"', mode='eval').body
1307 self.assertEqual(c.value, "x")
1308 self.assertEqual(c.kind, None)
1309
1310 c = ast.parse('b"x"', mode='eval').body
1311 self.assertEqual(c.value, b"x")
1312 self.assertEqual(c.kind, None)
1313
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001314
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001315class EndPositionTests(unittest.TestCase):
1316 """Tests for end position of AST nodes.
1317
1318 Testing end positions of nodes requires a bit of extra care
1319 because of how LL parsers work.
1320 """
1321 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1322 self.assertEqual(ast_node.end_lineno, end_lineno)
1323 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1324
1325 def _check_content(self, source, ast_node, content):
1326 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1327
1328 def _parse_value(self, s):
1329 # Use duck-typing to support both single expression
1330 # and a right hand side of an assignment statement.
1331 return ast.parse(s).body[0].value
1332
1333 def test_lambda(self):
1334 s = 'lambda x, *y: None'
1335 lam = self._parse_value(s)
1336 self._check_content(s, lam.body, 'None')
1337 self._check_content(s, lam.args.args[0], 'x')
1338 self._check_content(s, lam.args.vararg, 'y')
1339
1340 def test_func_def(self):
1341 s = dedent('''
1342 def func(x: int,
1343 *args: str,
1344 z: float = 0,
1345 **kwargs: Any) -> bool:
1346 return True
1347 ''').strip()
1348 fdef = ast.parse(s).body[0]
1349 self._check_end_pos(fdef, 5, 15)
1350 self._check_content(s, fdef.body[0], 'return True')
1351 self._check_content(s, fdef.args.args[0], 'x: int')
1352 self._check_content(s, fdef.args.args[0].annotation, 'int')
1353 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1354 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1355
1356 def test_call(self):
1357 s = 'func(x, y=2, **kw)'
1358 call = self._parse_value(s)
1359 self._check_content(s, call.func, 'func')
1360 self._check_content(s, call.keywords[0].value, '2')
1361 self._check_content(s, call.keywords[1].value, 'kw')
1362
1363 def test_call_noargs(self):
1364 s = 'x[0]()'
1365 call = self._parse_value(s)
1366 self._check_content(s, call.func, 'x[0]')
1367 self._check_end_pos(call, 1, 6)
1368
1369 def test_class_def(self):
1370 s = dedent('''
1371 class C(A, B):
1372 x: int = 0
1373 ''').strip()
1374 cdef = ast.parse(s).body[0]
1375 self._check_end_pos(cdef, 2, 14)
1376 self._check_content(s, cdef.bases[1], 'B')
1377 self._check_content(s, cdef.body[0], 'x: int = 0')
1378
1379 def test_class_kw(self):
1380 s = 'class S(metaclass=abc.ABCMeta): pass'
1381 cdef = ast.parse(s).body[0]
1382 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1383
1384 def test_multi_line_str(self):
1385 s = dedent('''
1386 x = """Some multi-line text.
1387
1388 It goes on starting from same indent."""
1389 ''').strip()
1390 assign = ast.parse(s).body[0]
1391 self._check_end_pos(assign, 3, 40)
1392 self._check_end_pos(assign.value, 3, 40)
1393
1394 def test_continued_str(self):
1395 s = dedent('''
1396 x = "first part" \\
1397 "second part"
1398 ''').strip()
1399 assign = ast.parse(s).body[0]
1400 self._check_end_pos(assign, 2, 13)
1401 self._check_end_pos(assign.value, 2, 13)
1402
1403 def test_suites(self):
1404 # We intentionally put these into the same string to check
1405 # that empty lines are not part of the suite.
1406 s = dedent('''
1407 while True:
1408 pass
1409
1410 if one():
1411 x = None
1412 elif other():
1413 y = None
1414 else:
1415 z = None
1416
1417 for x, y in stuff:
1418 assert True
1419
1420 try:
1421 raise RuntimeError
1422 except TypeError as e:
1423 pass
1424
1425 pass
1426 ''').strip()
1427 mod = ast.parse(s)
1428 while_loop = mod.body[0]
1429 if_stmt = mod.body[1]
1430 for_loop = mod.body[2]
1431 try_stmt = mod.body[3]
1432 pass_stmt = mod.body[4]
1433
1434 self._check_end_pos(while_loop, 2, 8)
1435 self._check_end_pos(if_stmt, 9, 12)
1436 self._check_end_pos(for_loop, 12, 15)
1437 self._check_end_pos(try_stmt, 17, 8)
1438 self._check_end_pos(pass_stmt, 19, 4)
1439
1440 self._check_content(s, while_loop.test, 'True')
1441 self._check_content(s, if_stmt.body[0], 'x = None')
1442 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1443 self._check_content(s, for_loop.target, 'x, y')
1444 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1445 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1446
1447 def test_fstring(self):
1448 s = 'x = f"abc {x + y} abc"'
1449 fstr = self._parse_value(s)
1450 binop = fstr.values[1].value
1451 self._check_content(s, binop, 'x + y')
1452
1453 def test_fstring_multi_line(self):
1454 s = dedent('''
1455 f"""Some multi-line text.
1456 {
1457 arg_one
1458 +
1459 arg_two
1460 }
1461 It goes on..."""
1462 ''').strip()
1463 fstr = self._parse_value(s)
1464 binop = fstr.values[1].value
1465 self._check_end_pos(binop, 5, 7)
1466 self._check_content(s, binop.left, 'arg_one')
1467 self._check_content(s, binop.right, 'arg_two')
1468
1469 def test_import_from_multi_line(self):
1470 s = dedent('''
1471 from x.y.z import (
1472 a, b, c as c
1473 )
1474 ''').strip()
1475 imp = ast.parse(s).body[0]
1476 self._check_end_pos(imp, 3, 1)
1477
1478 def test_slices(self):
1479 s1 = 'f()[1, 2] [0]'
1480 s2 = 'x[ a.b: c.d]'
1481 sm = dedent('''
1482 x[ a.b: f () ,
1483 g () : c.d
1484 ]
1485 ''').strip()
1486 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1487 self._check_content(s1, i1.value, 'f()[1, 2]')
1488 self._check_content(s1, i1.value.slice.value, '1, 2')
1489 self._check_content(s2, i2.slice.lower, 'a.b')
1490 self._check_content(s2, i2.slice.upper, 'c.d')
1491 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1492 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1493 self._check_end_pos(im, 3, 3)
1494
1495 def test_binop(self):
1496 s = dedent('''
1497 (1 * 2 + (3 ) +
1498 4
1499 )
1500 ''').strip()
1501 binop = self._parse_value(s)
1502 self._check_end_pos(binop, 2, 6)
1503 self._check_content(s, binop.right, '4')
1504 self._check_content(s, binop.left, '1 * 2 + (3 )')
1505 self._check_content(s, binop.left.right, '3')
1506
1507 def test_boolop(self):
1508 s = dedent('''
1509 if (one_condition and
1510 (other_condition or yet_another_one)):
1511 pass
1512 ''').strip()
1513 bop = ast.parse(s).body[0].test
1514 self._check_end_pos(bop, 2, 44)
1515 self._check_content(s, bop.values[1],
1516 'other_condition or yet_another_one')
1517
1518 def test_tuples(self):
1519 s1 = 'x = () ;'
1520 s2 = 'x = 1 , ;'
1521 s3 = 'x = (1 , 2 ) ;'
1522 sm = dedent('''
1523 x = (
1524 a, b,
1525 )
1526 ''').strip()
1527 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1528 self._check_content(s1, t1, '()')
1529 self._check_content(s2, t2, '1 ,')
1530 self._check_content(s3, t3, '(1 , 2 )')
1531 self._check_end_pos(tm, 3, 1)
1532
1533 def test_attribute_spaces(self):
1534 s = 'func(x. y .z)'
1535 call = self._parse_value(s)
1536 self._check_content(s, call, s)
1537 self._check_content(s, call.args[0], 'x. y .z')
1538
1539 def test_displays(self):
1540 s1 = '[{}, {1, }, {1, 2,} ]'
1541 s2 = '{a: b, f (): g () ,}'
1542 c1 = self._parse_value(s1)
1543 c2 = self._parse_value(s2)
1544 self._check_content(s1, c1.elts[0], '{}')
1545 self._check_content(s1, c1.elts[1], '{1, }')
1546 self._check_content(s1, c1.elts[2], '{1, 2,}')
1547 self._check_content(s2, c2.keys[1], 'f ()')
1548 self._check_content(s2, c2.values[1], 'g ()')
1549
1550 def test_comprehensions(self):
1551 s = dedent('''
1552 x = [{x for x, y in stuff
1553 if cond.x} for stuff in things]
1554 ''').strip()
1555 cmp = self._parse_value(s)
1556 self._check_end_pos(cmp, 2, 37)
1557 self._check_content(s, cmp.generators[0].iter, 'things')
1558 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1559 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1560 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1561
1562 def test_yield_await(self):
1563 s = dedent('''
1564 async def f():
1565 yield x
1566 await y
1567 ''').strip()
1568 fdef = ast.parse(s).body[0]
1569 self._check_content(s, fdef.body[0].value, 'yield x')
1570 self._check_content(s, fdef.body[1].value, 'await y')
1571
1572 def test_source_segment_multi(self):
1573 s_orig = dedent('''
1574 x = (
1575 a, b,
1576 ) + ()
1577 ''').strip()
1578 s_tuple = dedent('''
1579 (
1580 a, b,
1581 )
1582 ''').strip()
1583 binop = self._parse_value(s_orig)
1584 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1585
1586 def test_source_segment_padded(self):
1587 s_orig = dedent('''
1588 class C:
1589 def fun(self) -> None:
1590 "ЖЖЖЖЖ"
1591 ''').strip()
1592 s_method = ' def fun(self) -> None:\n' \
1593 ' "ЖЖЖЖЖ"'
1594 cdef = ast.parse(s_orig).body[0]
1595 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1596 s_method)
1597
1598 def test_source_segment_endings(self):
1599 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1600 v, w, x, y, z = ast.parse(s).body
1601 self._check_content(s, v, 'v = 1')
1602 self._check_content(s, w, 'w = 1')
1603 self._check_content(s, x, 'x = 1')
1604 self._check_content(s, y, 'y = 1')
1605 self._check_content(s, z, 'z = 1')
1606
1607 def test_source_segment_tabs(self):
1608 s = dedent('''
1609 class C:
1610 \t\f def fun(self) -> None:
1611 \t\f pass
1612 ''').strip()
1613 s_method = ' \t\f def fun(self) -> None:\n' \
1614 ' \t\f pass'
1615
1616 cdef = ast.parse(s).body[0]
1617 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1618
1619
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001620def main():
1621 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001622 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001623 if sys.argv[1:] == ['-g']:
1624 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1625 (eval_tests, "eval")):
1626 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001627 for statement in statements:
1628 tree = ast.parse(statement, "?", kind)
1629 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001630 print("]")
1631 print("main()")
1632 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001633 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001634
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001635#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001636exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001637('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1638('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001639('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001640('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 -08001641('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 -07001642('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 -08001643('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1644('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 -07001645('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 -08001646('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001647('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001648('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001649('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 -08001650('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001651('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001652('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1653('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1654('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 -07001655('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001656('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1657('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1658('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1659('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1660('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 -07001661('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 -08001662('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1663('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1664('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1665('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1666('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1667('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001668('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001669('Module', [('Pass', (1, 0))], []),
1670('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1671('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1672('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)], []),
1673('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)], []),
1674('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)], []),
1675('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)]))], []),
1676('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)]))], []),
1677('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)]))], []),
1678('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)]))], []),
1679('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 -07001680('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)], []),
1681('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)], []),
1682('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)], []),
1683('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)]))], []),
1684('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 -08001685('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)], []),
1686('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)], []),
1687('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)], []),
1688('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
1689('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []),
Pablo Galindo0c9258a2019-03-18 13:51:53 +00001690('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Tim Peters400cbc32006-02-28 18:44:41 +00001691]
1692single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001693('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 +00001694]
1695eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001696('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001697('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1698('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1699('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001700('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
1701('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001702('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001703('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1704('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001705('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)])),
1706('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)])),
1707('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)])),
1708('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)])),
1709('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)])),
1710('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)])),
1711('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)])),
1712('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)])),
1713('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)])),
1714('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)])),
1715('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 -07001716('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1717('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 +02001718('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 -07001719('Expression', ('Constant', (1, 0), 10, None)),
1720('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001721('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1722('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 +00001723('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001724('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 -05001725('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001726('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1727('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 -05001728('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001729('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 +00001730]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001731main()