blob: 69ed83cd8b68b68719b36728d555d26cffac9b32 [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
Miss Islington (bot)522a3942019-08-26 00:43:33 -07006import warnings
Benjamin Peterson9ed37432012-07-08 11:13:36 -07007import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07009
10from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000011
12def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000013 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000014 return t
15 elif isinstance(t, list):
16 return [to_tuple(e) for e in t]
17 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000018 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
19 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000020 if t._fields is None:
21 return tuple(result)
22 for f in t._fields:
23 result.append(to_tuple(getattr(t, f)))
24 return tuple(result)
25
Neal Norwitzee9b10a2008-03-31 05:29:39 +000026
Tim Peters400cbc32006-02-28 18:44:41 +000027# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030028# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000029exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050030 # None
31 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090032 # Module docstring
33 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000034 # FunctionDef
35 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090036 # FunctionDef with docstring
37 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050038 # FunctionDef with arg
39 "def f(a): pass",
40 # FunctionDef with arg and default value
41 "def f(a=0): pass",
42 # FunctionDef with varargs
43 "def f(*args): pass",
44 # FunctionDef with kwargs
45 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090046 # FunctionDef with all kind of args and docstring
47 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000048 # ClassDef
49 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090050 # ClassDef with docstring
51 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050052 # ClassDef, new style class
53 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000054 # Return
55 "def f():return 1",
56 # Delete
57 "del v",
58 # Assign
59 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020060 "a,b = c",
61 "(a,b) = c",
62 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000063 # AugAssign
64 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000065 # For
66 "for v in v:pass",
67 # While
68 "while v:pass",
69 # If
70 "if v:pass",
Miss Islington (bot)3b18b172019-12-13 08:21:54 -080071 # If-Elif
72 "if a:\n pass\nelif b:\n pass",
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -080073 # If-Elif-Else
74 "if a:\n pass\nelif b:\n pass\nelse:\n pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050075 # With
76 "with x as y: pass",
77 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000078 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000079 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000080 # TryExcept
81 "try:\n pass\nexcept Exception:\n pass",
82 # TryFinally
83 "try:\n pass\nfinally:\n pass",
84 # Assert
85 "assert v",
86 # Import
87 "import sys",
88 # ImportFrom
89 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000090 # Global
91 "global v",
92 # Expr
93 "1",
94 # Pass,
95 "pass",
96 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040097 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000098 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040099 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +0000100 # for statements with naked tuples (see http://bugs.python.org/issue6704)
101 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200102 "for (a,b) in c: pass",
103 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500104 # Multiline generator expression (test for .lineno & .col_offset)
105 """(
106 (
107 Aa
108 ,
109 Bb
110 )
111 for
112 Aa
113 ,
114 Bb in Cc
115 )""",
116 # dictcomp
117 "{a : b for w in x for m in p if g}",
118 # dictcomp with naked tuple
119 "{a : b for v,w in x}",
120 # setcomp
121 "{r for l in x if g}",
122 # setcomp with naked tuple
123 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400124 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900125 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400126 # AsyncFor
127 "async def f():\n async for e in i: 1\n else: 2",
128 # AsyncWith
129 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400130 # PEP 448: Additional Unpacking Generalizations
131 "{**{1:2}, 2:3}",
132 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700133 # Asynchronous comprehensions
134 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200135 # Decorated FunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700136 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200137 # Decorated AsyncFunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700138 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200139 # Decorated ClassDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700140 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200141 # Decorator with generator argument
142 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000143 # Simple assignment expression
144 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100145 # Positional-only arguments
146 "def f(a, /,): pass",
147 "def f(a, /, c, d, e): pass",
148 "def f(a, /, c, *, d, e): pass",
149 "def f(a, /, c, *, d, e, **kwargs): pass",
150 # Positional-only arguments with defaults
151 "def f(a=1, /,): pass",
152 "def f(a=1, /, b=2, c=4): pass",
153 "def f(a=1, /, b=2, *, c=4): pass",
154 "def f(a=1, /, b=2, *, c): pass",
155 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
156 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000157
Tim Peters400cbc32006-02-28 18:44:41 +0000158]
159
160# These are compiled through "single"
161# because of overlap with "eval", it just tests what
162# can't be tested with "eval"
163single_tests = [
164 "1+2"
165]
166
167# These are compiled through "eval"
168# It should test all expressions
169eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500170 # None
171 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000172 # BoolOp
173 "a and b",
174 # BinOp
175 "a + b",
176 # UnaryOp
177 "not v",
178 # Lambda
179 "lambda:None",
180 # Dict
181 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500182 # Empty dict
183 "{}",
184 # Set
185 "{None,}",
186 # Multiline dict (test for .lineno & .col_offset)
187 """{
188 1
189 :
190 2
191 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000192 # ListComp
193 "[a for b in c if d]",
194 # GeneratorExp
195 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200196 # Comprehensions with multiple for targets
197 "[(a,b) for a,b in c]",
198 "[(a,b) for (a,b) in c]",
199 "[(a,b) for [a,b] in c]",
200 "{(a,b) for a,b in c}",
201 "{(a,b) for (a,b) in c}",
202 "{(a,b) for [a,b] in c}",
203 "((a,b) for a,b in c)",
204 "((a,b) for (a,b) in c)",
205 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000206 # Yield - yield expressions can't work outside a function
207 #
208 # Compare
209 "1 < 2 < 3",
210 # Call
211 "f(1,2,c=3,*d,**e)",
Pablo Galindob1f20442019-12-18 01:41:58 +0000212 # Call with multi-character starred
213 "f(*[0, 1])",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200214 # Call with a generator argument
215 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000216 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000217 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000218 # Str
219 "'string'",
220 # Attribute
221 "a.b",
222 # Subscript
223 "a[b:c]",
224 # Name
225 "v",
226 # List
227 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500228 # Empty list
229 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000230 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000231 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500232 # Tuple
233 "(1,2,3)",
234 # Empty tuple
235 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000236 # Combination
237 "a.b.c.d(a.b[1:2])",
238
Tim Peters400cbc32006-02-28 18:44:41 +0000239]
240
241# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
242# excepthandler, arguments, keywords, alias
243
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000244class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000245
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500246 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000247 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000248 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000249 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000250 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200251 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000252 parent_pos = (ast_node.lineno, ast_node.col_offset)
253 for name in ast_node._fields:
254 value = getattr(ast_node, name)
255 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200256 first_pos = parent_pos
257 if value and name == 'decorator_list':
258 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000259 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200260 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000261 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500262 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000263
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500264 def test_AST_objects(self):
265 x = ast.AST()
266 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700267 x.foobar = 42
268 self.assertEqual(x.foobar, 42)
269 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500270
271 with self.assertRaises(AttributeError):
272 x.vararg
273
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500274 with self.assertRaises(TypeError):
275 # "_ast.AST constructor takes 0 positional arguments"
276 ast.AST(2)
277
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700278 def test_AST_garbage_collection(self):
279 class X:
280 pass
281 a = ast.AST()
282 a.x = X()
283 a.x.a = a
284 ref = weakref.ref(a.x)
285 del a
286 support.gc_collect()
287 self.assertIsNone(ref())
288
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000289 def test_snippets(self):
290 for input, output, kind in ((exec_tests, exec_results, "exec"),
291 (single_tests, single_results, "single"),
292 (eval_tests, eval_results, "eval")):
293 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400294 with self.subTest(action="parsing", input=i):
295 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
296 self.assertEqual(to_tuple(ast_tree), o)
297 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100298 with self.subTest(action="compiling", input=i, kind=kind):
299 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000300
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000301 def test_ast_validation(self):
302 # compile() is the only function that calls PyAST_Validate
303 snippets_to_validate = exec_tests + single_tests + eval_tests
304 for snippet in snippets_to_validate:
305 tree = ast.parse(snippet)
306 compile(tree, '<string>', 'exec')
307
Benjamin Peterson78565b22009-06-28 19:19:51 +0000308 def test_slice(self):
309 slc = ast.parse("x[::]").body[0].value.slice
310 self.assertIsNone(slc.upper)
311 self.assertIsNone(slc.lower)
312 self.assertIsNone(slc.step)
313
314 def test_from_import(self):
315 im = ast.parse("from . import y").body[0]
316 self.assertIsNone(im.module)
317
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400318 def test_non_interned_future_from_ast(self):
319 mod = ast.parse("from __future__ import division")
320 self.assertIsInstance(mod.body[0], ast.ImportFrom)
321 mod.body[0].module = " __future__ ".strip()
322 compile(mod, "<test>", "exec")
323
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000324 def test_base_classes(self):
325 self.assertTrue(issubclass(ast.For, ast.stmt))
326 self.assertTrue(issubclass(ast.Name, ast.expr))
327 self.assertTrue(issubclass(ast.stmt, ast.AST))
328 self.assertTrue(issubclass(ast.expr, ast.AST))
329 self.assertTrue(issubclass(ast.comprehension, ast.AST))
330 self.assertTrue(issubclass(ast.Gt, ast.AST))
331
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500332 def test_field_attr_existence(self):
333 for name, item in ast.__dict__.items():
334 if isinstance(item, type) and name != 'AST' and name[0].isupper():
335 x = item()
336 if isinstance(x, ast.AST):
337 self.assertEqual(type(x._fields), tuple)
338
339 def test_arguments(self):
340 x = ast.arguments()
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -0700341 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
342 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500343
344 with self.assertRaises(AttributeError):
345 x.vararg
346
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100347 x = ast.arguments(*range(1, 8))
348 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500349
350 def test_field_attr_writable(self):
351 x = ast.Num()
352 # We can assign to _fields
353 x._fields = 666
354 self.assertEqual(x._fields, 666)
355
356 def test_classattrs(self):
357 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700358 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300359
360 with self.assertRaises(AttributeError):
361 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500362
363 with self.assertRaises(AttributeError):
364 x.n
365
366 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300367 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500368 self.assertEqual(x.n, 42)
369
370 with self.assertRaises(AttributeError):
371 x.lineno
372
373 with self.assertRaises(AttributeError):
374 x.foobar
375
376 x = ast.Num(lineno=2)
377 self.assertEqual(x.lineno, 2)
378
379 x = ast.Num(42, lineno=0)
380 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700381 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300382 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500383 self.assertEqual(x.n, 42)
384
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700385 self.assertRaises(TypeError, ast.Num, 1, None, 2)
386 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500387
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300388 self.assertEqual(ast.Num(42).n, 42)
389 self.assertEqual(ast.Num(4.25).n, 4.25)
390 self.assertEqual(ast.Num(4.25j).n, 4.25j)
391 self.assertEqual(ast.Str('42').s, '42')
392 self.assertEqual(ast.Bytes(b'42').s, b'42')
393 self.assertIs(ast.NameConstant(True).value, True)
394 self.assertIs(ast.NameConstant(False).value, False)
395 self.assertIs(ast.NameConstant(None).value, None)
396
397 self.assertEqual(ast.Constant(42).value, 42)
398 self.assertEqual(ast.Constant(4.25).value, 4.25)
399 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
400 self.assertEqual(ast.Constant('42').value, '42')
401 self.assertEqual(ast.Constant(b'42').value, b'42')
402 self.assertIs(ast.Constant(True).value, True)
403 self.assertIs(ast.Constant(False).value, False)
404 self.assertIs(ast.Constant(None).value, None)
405 self.assertIs(ast.Constant(...).value, ...)
406
407 def test_realtype(self):
408 self.assertEqual(type(ast.Num(42)), ast.Constant)
409 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
410 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
411 self.assertEqual(type(ast.Str('42')), ast.Constant)
412 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
413 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
414 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
415 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
416 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
417
418 def test_isinstance(self):
419 self.assertTrue(isinstance(ast.Num(42), ast.Num))
420 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
421 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
422 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
423 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
424 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
425 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
426 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
427 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
428
429 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
430 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
431 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
432 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
433 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
434 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
435 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
436 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
437 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
438
439 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
440 self.assertFalse(isinstance(ast.Num(42), ast.Str))
441 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
442 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
443 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800444 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
445 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300446
447 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
448 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
449 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
450 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
451 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800452 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
453 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300454
455 self.assertFalse(isinstance(ast.Constant(), ast.Num))
456 self.assertFalse(isinstance(ast.Constant(), ast.Str))
457 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
458 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
459 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
460
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200461 class S(str): pass
462 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
463 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
464
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300465 def test_subclasses(self):
466 class N(ast.Num):
467 def __init__(self, *args, **kwargs):
468 super().__init__(*args, **kwargs)
469 self.z = 'spam'
470 class N2(ast.Num):
471 pass
472
473 n = N(42)
474 self.assertEqual(n.n, 42)
475 self.assertEqual(n.z, 'spam')
476 self.assertEqual(type(n), N)
477 self.assertTrue(isinstance(n, N))
478 self.assertTrue(isinstance(n, ast.Num))
479 self.assertFalse(isinstance(n, N2))
480 self.assertFalse(isinstance(ast.Num(42), N))
481 n = N(n=42)
482 self.assertEqual(n.n, 42)
483 self.assertEqual(type(n), N)
484
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500485 def test_module(self):
486 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800487 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500488 self.assertEqual(x.body, body)
489
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000490 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100491 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500492 x = ast.BinOp()
493 self.assertEqual(x._fields, ('left', 'op', 'right'))
494
495 # Random attribute allowed too
496 x.foobarbaz = 5
497 self.assertEqual(x.foobarbaz, 5)
498
499 n1 = ast.Num(1)
500 n3 = ast.Num(3)
501 addop = ast.Add()
502 x = ast.BinOp(n1, addop, n3)
503 self.assertEqual(x.left, n1)
504 self.assertEqual(x.op, addop)
505 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500506
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500507 x = ast.BinOp(1, 2, 3)
508 self.assertEqual(x.left, 1)
509 self.assertEqual(x.op, 2)
510 self.assertEqual(x.right, 3)
511
Georg Brandl0c77a822008-06-10 16:37:50 +0000512 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000513 self.assertEqual(x.left, 1)
514 self.assertEqual(x.op, 2)
515 self.assertEqual(x.right, 3)
516 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000517
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500518 # node raises exception when given too many arguments
519 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500520 # node raises exception when given too many arguments
521 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000522
523 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000524 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000525 self.assertEqual(x.left, 1)
526 self.assertEqual(x.op, 2)
527 self.assertEqual(x.right, 3)
528 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000529
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500530 # Random kwargs also allowed
531 x = ast.BinOp(1, 2, 3, foobarbaz=42)
532 self.assertEqual(x.foobarbaz, 42)
533
534 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000535 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000536 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500537 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000538
539 def test_pickling(self):
540 import pickle
541 mods = [pickle]
542 try:
543 import cPickle
544 mods.append(cPickle)
545 except ImportError:
546 pass
547 protocols = [0, 1, 2]
548 for mod in mods:
549 for protocol in protocols:
550 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
551 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000552 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000553
Benjamin Peterson5b066812010-11-20 01:38:49 +0000554 def test_invalid_sum(self):
555 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800556 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000557 with self.assertRaises(TypeError) as cm:
558 compile(m, "<test>", "exec")
559 self.assertIn("but got <_ast.expr", str(cm.exception))
560
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500561 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800562 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500563 ast.fix_missing_locations(m)
564 with self.assertRaises(TypeError) as cm:
565 compile(m, "<test>", "exec")
566 self.assertIn("identifier must be of type str", str(cm.exception))
567
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000568 def test_empty_yield_from(self):
569 # Issue 16546: yield from value is not optional.
570 empty_yield_from = ast.parse("def f():\n yield from g()")
571 empty_yield_from.body[0].body[0].value.value = None
572 with self.assertRaises(ValueError) as cm:
573 compile(empty_yield_from, "<test>", "exec")
574 self.assertIn("field value is required", str(cm.exception))
575
Oren Milman7dc46d82017-09-30 20:16:24 +0300576 @support.cpython_only
577 def test_issue31592(self):
578 # There shouldn't be an assertion failure in case of a bad
579 # unicodedata.normalize().
580 import unicodedata
581 def bad_normalize(*args):
582 return None
583 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
584 self.assertRaises(TypeError, ast.parse, '\u03D5')
585
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700586 def test_issue18374_binop_col_offset(self):
587 tree = ast.parse('4+5+6+7')
588 parent_binop = tree.body[0].value
589 child_binop = parent_binop.left
590 grandchild_binop = child_binop.left
591 self.assertEqual(parent_binop.col_offset, 0)
592 self.assertEqual(parent_binop.end_col_offset, 7)
593 self.assertEqual(child_binop.col_offset, 0)
594 self.assertEqual(child_binop.end_col_offset, 5)
595 self.assertEqual(grandchild_binop.col_offset, 0)
596 self.assertEqual(grandchild_binop.end_col_offset, 3)
597
598 tree = ast.parse('4+5-\\\n 6-7')
599 parent_binop = tree.body[0].value
600 child_binop = parent_binop.left
601 grandchild_binop = child_binop.left
602 self.assertEqual(parent_binop.col_offset, 0)
603 self.assertEqual(parent_binop.lineno, 1)
604 self.assertEqual(parent_binop.end_col_offset, 4)
605 self.assertEqual(parent_binop.end_lineno, 2)
606
607 self.assertEqual(child_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700608 self.assertEqual(child_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700609 self.assertEqual(child_binop.end_col_offset, 2)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700610 self.assertEqual(child_binop.end_lineno, 2)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700611
612 self.assertEqual(grandchild_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700613 self.assertEqual(grandchild_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700614 self.assertEqual(grandchild_binop.end_col_offset, 3)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700615 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000616
617class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700618 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000619
620 def test_parse(self):
621 a = ast.parse('foo(1 + 1)')
622 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
623 self.assertEqual(ast.dump(a), ast.dump(b))
624
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400625 def test_parse_in_error(self):
626 try:
627 1/0
628 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400629 with self.assertRaises(SyntaxError) as e:
630 ast.literal_eval(r"'\U'")
631 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400632
Georg Brandl0c77a822008-06-10 16:37:50 +0000633 def test_dump(self):
634 node = ast.parse('spam(eggs, "and cheese")')
635 self.assertEqual(ast.dump(node),
636 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700637 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800638 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000639 )
640 self.assertEqual(ast.dump(node, annotate_fields=False),
641 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700642 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000643 )
644 self.assertEqual(ast.dump(node, include_attributes=True),
645 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000646 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
647 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700648 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000649 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
650 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800651 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000652 )
653
Serhiy Storchaka097eae52019-08-29 10:50:28 +0300654 def test_dump_incomplete(self):
655 node = ast.Raise(lineno=3, col_offset=4)
656 self.assertEqual(ast.dump(node),
657 "Raise()"
658 )
659 self.assertEqual(ast.dump(node, include_attributes=True),
660 "Raise(lineno=3, col_offset=4)"
661 )
662 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
663 self.assertEqual(ast.dump(node),
664 "Raise(exc=Name(id='e', ctx=Load()))"
665 )
666 self.assertEqual(ast.dump(node, annotate_fields=False),
667 "Raise(Name('e', Load()))"
668 )
669 self.assertEqual(ast.dump(node, include_attributes=True),
670 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
671 )
672 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
673 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
674 )
675 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
676 self.assertEqual(ast.dump(node),
677 "Raise(cause=Name(id='e', ctx=Load()))"
678 )
679 self.assertEqual(ast.dump(node, annotate_fields=False),
680 "Raise(cause=Name('e', Load()))"
681 )
682
Georg Brandl0c77a822008-06-10 16:37:50 +0000683 def test_copy_location(self):
684 src = ast.parse('1 + 1', mode='eval')
685 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
686 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700687 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000688 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
689 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
690 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000691 )
692
693 def test_fix_missing_locations(self):
694 src = ast.parse('write("spam")')
695 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400696 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000697 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000698 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000699 self.assertEqual(ast.dump(src, include_attributes=True),
700 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000701 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700702 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000703 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
704 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
705 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
706 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
707 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
708 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800709 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
710 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000711 )
712
713 def test_increment_lineno(self):
714 src = ast.parse('1 + 1', mode='eval')
715 self.assertEqual(ast.increment_lineno(src, n=3), src)
716 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700717 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
718 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000719 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
720 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000721 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000722 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000723 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000724 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
725 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700726 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
727 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000728 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
729 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000730 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000731
732 def test_iter_fields(self):
733 node = ast.parse('foo()', mode='eval')
734 d = dict(ast.iter_fields(node.body))
735 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400736 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000737
738 def test_iter_child_nodes(self):
739 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
740 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
741 iterator = ast.iter_child_nodes(node.body)
742 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300743 self.assertEqual(next(iterator).value, 23)
744 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000745 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700746 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000747 )
748
749 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300750 node = ast.parse('"""line one\n line two"""')
751 self.assertEqual(ast.get_docstring(node),
752 'line one\nline two')
753
754 node = ast.parse('class foo:\n """line one\n line two"""')
755 self.assertEqual(ast.get_docstring(node.body[0]),
756 'line one\nline two')
757
Georg Brandl0c77a822008-06-10 16:37:50 +0000758 node = ast.parse('def foo():\n """line one\n line two"""')
759 self.assertEqual(ast.get_docstring(node.body[0]),
760 'line one\nline two')
761
Yury Selivanov2f07a662015-07-23 08:54:35 +0300762 node = ast.parse('async def foo():\n """spam\n ham"""')
763 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300764
765 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800766 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300767 node = ast.parse('x = "not docstring"')
768 self.assertIsNone(ast.get_docstring(node))
769 node = ast.parse('def foo():\n pass')
770 self.assertIsNone(ast.get_docstring(node))
771
772 node = ast.parse('class foo:\n pass')
773 self.assertIsNone(ast.get_docstring(node.body[0]))
774 node = ast.parse('class foo:\n x = "not docstring"')
775 self.assertIsNone(ast.get_docstring(node.body[0]))
776 node = ast.parse('class foo:\n def bar(self): pass')
777 self.assertIsNone(ast.get_docstring(node.body[0]))
778
779 node = ast.parse('def foo():\n pass')
780 self.assertIsNone(ast.get_docstring(node.body[0]))
781 node = ast.parse('def foo():\n x = "not docstring"')
782 self.assertIsNone(ast.get_docstring(node.body[0]))
783
784 node = ast.parse('async def foo():\n pass')
785 self.assertIsNone(ast.get_docstring(node.body[0]))
786 node = ast.parse('async def foo():\n x = "not docstring"')
787 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300788
Anthony Sottile995d9b92019-01-12 20:05:13 -0800789 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
790 node = ast.parse(
791 '"""line one\nline two"""\n\n'
792 'def foo():\n """line one\n line two"""\n\n'
793 ' def bar():\n """line one\n line two"""\n'
794 ' """line one\n line two"""\n'
795 '"""line one\nline two"""\n\n'
796 )
797 self.assertEqual(node.body[0].col_offset, 0)
798 self.assertEqual(node.body[0].lineno, 1)
799 self.assertEqual(node.body[1].body[0].col_offset, 2)
800 self.assertEqual(node.body[1].body[0].lineno, 5)
801 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
802 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
803 self.assertEqual(node.body[1].body[2].col_offset, 2)
804 self.assertEqual(node.body[1].body[2].lineno, 11)
805 self.assertEqual(node.body[2].col_offset, 0)
806 self.assertEqual(node.body[2].lineno, 13)
807
Miss Islington (bot)3b18b172019-12-13 08:21:54 -0800808 def test_elif_stmt_start_position(self):
809 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
810 elif_stmt = node.body[0].orelse[0]
811 self.assertEqual(elif_stmt.lineno, 3)
812 self.assertEqual(elif_stmt.col_offset, 0)
813
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -0800814 def test_elif_stmt_start_position_with_else(self):
815 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
816 elif_stmt = node.body[0].orelse[0]
817 self.assertEqual(elif_stmt.lineno, 3)
818 self.assertEqual(elif_stmt.col_offset, 0)
819
Pablo Galindob1f20442019-12-18 01:41:58 +0000820 def test_starred_expr_end_position_within_call(self):
821 node = ast.parse('f(*[0, 1])')
822 starred_expr = node.body[0].value.args[0]
823 self.assertEqual(starred_expr.end_lineno, 1)
824 self.assertEqual(starred_expr.end_col_offset, 9)
825
Georg Brandl0c77a822008-06-10 16:37:50 +0000826 def test_literal_eval(self):
827 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
828 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
829 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000830 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000831 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000832 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200833 self.assertEqual(ast.literal_eval('6'), 6)
834 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000835 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000836 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200837 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
838 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
839 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
840 self.assertRaises(ValueError, ast.literal_eval, '++6')
841 self.assertRaises(ValueError, ast.literal_eval, '+True')
842 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000843
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200844 def test_literal_eval_complex(self):
845 # Issue #4907
846 self.assertEqual(ast.literal_eval('6j'), 6j)
847 self.assertEqual(ast.literal_eval('-6j'), -6j)
848 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
849 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
850 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
851 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
852 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
853 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
854 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
855 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
856 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
857 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
858 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
859 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
860 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
861 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
862 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
863 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000864
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100865 def test_bad_integer(self):
866 # issue13436: Bad error message with invalid numeric values
867 body = [ast.ImportFrom(module='time',
868 names=[ast.alias(name='sleep')],
869 level=None,
870 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800871 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100872 with self.assertRaises(ValueError) as cm:
873 compile(mod, 'test', 'exec')
874 self.assertIn("invalid integer value: None", str(cm.exception))
875
Berker Peksag0a5bd512016-04-29 19:50:02 +0300876 def test_level_as_none(self):
877 body = [ast.ImportFrom(module='time',
878 names=[ast.alias(name='sleep')],
879 level=None,
880 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800881 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300882 code = compile(mod, 'test', 'exec')
883 ns = {}
884 exec(code, ns)
885 self.assertIn('sleep', ns)
886
Georg Brandl0c77a822008-06-10 16:37:50 +0000887
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500888class ASTValidatorTests(unittest.TestCase):
889
890 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
891 mod.lineno = mod.col_offset = 0
892 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300893 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500894 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300895 else:
896 with self.assertRaises(exc) as cm:
897 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500898 self.assertIn(msg, str(cm.exception))
899
900 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800901 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500902 self.mod(mod, msg, exc=exc)
903
904 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800905 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500906 self.mod(mod, msg)
907
908 def test_module(self):
909 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
910 self.mod(m, "must have Load context", "single")
911 m = ast.Expression(ast.Name("x", ast.Store()))
912 self.mod(m, "must have Load context", "eval")
913
914 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100915 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700916 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500917 defaults=None, kw_defaults=None):
918 if args is None:
919 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100920 if posonlyargs is None:
921 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500922 if kwonlyargs is None:
923 kwonlyargs = []
924 if defaults is None:
925 defaults = []
926 if kw_defaults is None:
927 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100928 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
929 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500930 return fac(args)
931 args = [ast.arg("x", ast.Name("x", ast.Store()))]
932 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100933 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500934 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500935 check(arguments(defaults=[ast.Num(3)]),
936 "more positional defaults than args")
937 check(arguments(kw_defaults=[ast.Num(4)]),
938 "length of kwonlyargs is not the same as kw_defaults")
939 args = [ast.arg("x", ast.Name("x", ast.Load()))]
940 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
941 "must have Load context")
942 args = [ast.arg("a", ast.Name("x", ast.Load())),
943 ast.arg("b", ast.Name("y", ast.Load()))]
944 check(arguments(kwonlyargs=args,
945 kw_defaults=[None, ast.Name("x", ast.Store())]),
946 "must have Load context")
947
948 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100949 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300950 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500951 self.stmt(f, "empty body on FunctionDef")
952 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300953 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500954 self.stmt(f, "must have Load context")
955 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300956 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500957 self.stmt(f, "must have Load context")
958 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300959 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500960 self._check_arguments(fac, self.stmt)
961
962 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400963 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500964 if bases is None:
965 bases = []
966 if keywords is None:
967 keywords = []
968 if body is None:
969 body = [ast.Pass()]
970 if decorator_list is None:
971 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400972 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300973 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500974 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
975 "must have Load context")
976 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
977 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500978 self.stmt(cls(body=[]), "empty body on ClassDef")
979 self.stmt(cls(body=[None]), "None disallowed")
980 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
981 "must have Load context")
982
983 def test_delete(self):
984 self.stmt(ast.Delete([]), "empty targets on Delete")
985 self.stmt(ast.Delete([None]), "None disallowed")
986 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
987 "must have Del context")
988
989 def test_assign(self):
990 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
991 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
992 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
993 "must have Store context")
994 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
995 ast.Name("y", ast.Store())),
996 "must have Load context")
997
998 def test_augassign(self):
999 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1000 ast.Name("y", ast.Load()))
1001 self.stmt(aug, "must have Store context")
1002 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1003 ast.Name("y", ast.Store()))
1004 self.stmt(aug, "must have Load context")
1005
1006 def test_for(self):
1007 x = ast.Name("x", ast.Store())
1008 y = ast.Name("y", ast.Load())
1009 p = ast.Pass()
1010 self.stmt(ast.For(x, y, [], []), "empty body on For")
1011 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1012 "must have Store context")
1013 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1014 "must have Load context")
1015 e = ast.Expr(ast.Name("x", ast.Store()))
1016 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1017 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1018
1019 def test_while(self):
1020 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1021 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1022 "must have Load context")
1023 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1024 [ast.Expr(ast.Name("x", ast.Store()))]),
1025 "must have Load context")
1026
1027 def test_if(self):
1028 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1029 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1030 self.stmt(i, "must have Load context")
1031 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1032 self.stmt(i, "must have Load context")
1033 i = ast.If(ast.Num(3), [ast.Pass()],
1034 [ast.Expr(ast.Name("x", ast.Store()))])
1035 self.stmt(i, "must have Load context")
1036
1037 def test_with(self):
1038 p = ast.Pass()
1039 self.stmt(ast.With([], [p]), "empty items on With")
1040 i = ast.withitem(ast.Num(3), None)
1041 self.stmt(ast.With([i], []), "empty body on With")
1042 i = ast.withitem(ast.Name("x", ast.Store()), None)
1043 self.stmt(ast.With([i], [p]), "must have Load context")
1044 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1045 self.stmt(ast.With([i], [p]), "must have Store context")
1046
1047 def test_raise(self):
1048 r = ast.Raise(None, ast.Num(3))
1049 self.stmt(r, "Raise with cause but no exception")
1050 r = ast.Raise(ast.Name("x", ast.Store()), None)
1051 self.stmt(r, "must have Load context")
1052 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1053 self.stmt(r, "must have Load context")
1054
1055 def test_try(self):
1056 p = ast.Pass()
1057 t = ast.Try([], [], [], [p])
1058 self.stmt(t, "empty body on Try")
1059 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1060 self.stmt(t, "must have Load context")
1061 t = ast.Try([p], [], [], [])
1062 self.stmt(t, "Try has neither except handlers nor finalbody")
1063 t = ast.Try([p], [], [p], [p])
1064 self.stmt(t, "Try has orelse but no except handlers")
1065 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1066 self.stmt(t, "empty body on ExceptHandler")
1067 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1068 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1069 e = [ast.ExceptHandler(None, "x", [p])]
1070 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1071 self.stmt(t, "must have Load context")
1072 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1073 self.stmt(t, "must have Load context")
1074
1075 def test_assert(self):
1076 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1077 "must have Load context")
1078 assrt = ast.Assert(ast.Name("x", ast.Load()),
1079 ast.Name("y", ast.Store()))
1080 self.stmt(assrt, "must have Load context")
1081
1082 def test_import(self):
1083 self.stmt(ast.Import([]), "empty names on Import")
1084
1085 def test_importfrom(self):
1086 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001087 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001088 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1089
1090 def test_global(self):
1091 self.stmt(ast.Global([]), "empty names on Global")
1092
1093 def test_nonlocal(self):
1094 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1095
1096 def test_expr(self):
1097 e = ast.Expr(ast.Name("x", ast.Store()))
1098 self.stmt(e, "must have Load context")
1099
1100 def test_boolop(self):
1101 b = ast.BoolOp(ast.And(), [])
1102 self.expr(b, "less than 2 values")
1103 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1104 self.expr(b, "less than 2 values")
1105 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1106 self.expr(b, "None disallowed")
1107 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1108 self.expr(b, "must have Load context")
1109
1110 def test_unaryop(self):
1111 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1112 self.expr(u, "must have Load context")
1113
1114 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001115 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001116 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1117 "must have Load context")
1118 def fac(args):
1119 return ast.Lambda(args, ast.Name("x", ast.Load()))
1120 self._check_arguments(fac, self.expr)
1121
1122 def test_ifexp(self):
1123 l = ast.Name("x", ast.Load())
1124 s = ast.Name("y", ast.Store())
1125 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001126 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001127
1128 def test_dict(self):
1129 d = ast.Dict([], [ast.Name("x", ast.Load())])
1130 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001131 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1132 self.expr(d, "None disallowed")
1133
1134 def test_set(self):
1135 self.expr(ast.Set([None]), "None disallowed")
1136 s = ast.Set([ast.Name("x", ast.Store())])
1137 self.expr(s, "must have Load context")
1138
1139 def _check_comprehension(self, fac):
1140 self.expr(fac([]), "comprehension with no generators")
1141 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001142 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001143 self.expr(fac([g]), "must have Store context")
1144 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001145 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001146 self.expr(fac([g]), "must have Load context")
1147 x = ast.Name("x", ast.Store())
1148 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001149 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001150 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001151 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001152 self.expr(fac([g]), "must have Load context")
1153
1154 def _simple_comp(self, fac):
1155 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001156 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001157 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1158 "must have Load context")
1159 def wrap(gens):
1160 return fac(ast.Name("x", ast.Store()), gens)
1161 self._check_comprehension(wrap)
1162
1163 def test_listcomp(self):
1164 self._simple_comp(ast.ListComp)
1165
1166 def test_setcomp(self):
1167 self._simple_comp(ast.SetComp)
1168
1169 def test_generatorexp(self):
1170 self._simple_comp(ast.GeneratorExp)
1171
1172 def test_dictcomp(self):
1173 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001174 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001175 c = ast.DictComp(ast.Name("x", ast.Store()),
1176 ast.Name("y", ast.Load()), [g])
1177 self.expr(c, "must have Load context")
1178 c = ast.DictComp(ast.Name("x", ast.Load()),
1179 ast.Name("y", ast.Store()), [g])
1180 self.expr(c, "must have Load context")
1181 def factory(comps):
1182 k = ast.Name("x", ast.Load())
1183 v = ast.Name("y", ast.Load())
1184 return ast.DictComp(k, v, comps)
1185 self._check_comprehension(factory)
1186
1187 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001188 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1189 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001190
1191 def test_compare(self):
1192 left = ast.Name("x", ast.Load())
1193 comp = ast.Compare(left, [ast.In()], [])
1194 self.expr(comp, "no comparators")
1195 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1196 self.expr(comp, "different number of comparators and operands")
1197 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001198 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001199 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001200 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001201
1202 def test_call(self):
1203 func = ast.Name("x", ast.Load())
1204 args = [ast.Name("y", ast.Load())]
1205 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001206 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001207 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001208 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001209 self.expr(call, "None disallowed")
1210 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001211 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001212 self.expr(call, "must have Load context")
1213
1214 def test_num(self):
1215 class subint(int):
1216 pass
1217 class subfloat(float):
1218 pass
1219 class subcomplex(complex):
1220 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001221 for obj in "0", "hello":
1222 self.expr(ast.Num(obj))
1223 for obj in subint(), subfloat(), subcomplex():
1224 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001225
1226 def test_attribute(self):
1227 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1228 self.expr(attr, "must have Load context")
1229
1230 def test_subscript(self):
1231 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1232 ast.Load())
1233 self.expr(sub, "must have Load context")
1234 x = ast.Name("x", ast.Load())
1235 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1236 ast.Load())
1237 self.expr(sub, "must have Load context")
1238 s = ast.Name("x", ast.Store())
1239 for args in (s, None, None), (None, s, None), (None, None, s):
1240 sl = ast.Slice(*args)
1241 self.expr(ast.Subscript(x, sl, ast.Load()),
1242 "must have Load context")
1243 sl = ast.ExtSlice([])
1244 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1245 sl = ast.ExtSlice([ast.Index(s)])
1246 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1247
1248 def test_starred(self):
1249 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1250 ast.Store())
1251 assign = ast.Assign([left], ast.Num(4))
1252 self.stmt(assign, "must have Store context")
1253
1254 def _sequence(self, fac):
1255 self.expr(fac([None], ast.Load()), "None disallowed")
1256 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1257 "must have Load context")
1258
1259 def test_list(self):
1260 self._sequence(ast.List)
1261
1262 def test_tuple(self):
1263 self._sequence(ast.Tuple)
1264
Benjamin Peterson442f2092012-12-06 17:41:04 -05001265 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001266 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001267
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001268 def test_stdlib_validates(self):
1269 stdlib = os.path.dirname(ast.__file__)
1270 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1271 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1272 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001273 with self.subTest(module):
1274 fn = os.path.join(stdlib, module)
1275 with open(fn, "r", encoding="utf-8") as fp:
1276 source = fp.read()
1277 mod = ast.parse(source, fn)
1278 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001279
1280
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001281class ConstantTests(unittest.TestCase):
1282 """Tests on the ast.Constant node type."""
1283
1284 def compile_constant(self, value):
1285 tree = ast.parse("x = 123")
1286
1287 node = tree.body[0].value
1288 new_node = ast.Constant(value=value)
1289 ast.copy_location(new_node, node)
1290 tree.body[0].value = new_node
1291
1292 code = compile(tree, "<string>", "exec")
1293
1294 ns = {}
1295 exec(code, ns)
1296 return ns['x']
1297
Victor Stinnerbe59d142016-01-27 00:39:12 +01001298 def test_validation(self):
1299 with self.assertRaises(TypeError) as cm:
1300 self.compile_constant([1, 2, 3])
1301 self.assertEqual(str(cm.exception),
1302 "got an invalid type in Constant: list")
1303
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001304 def test_singletons(self):
1305 for const in (None, False, True, Ellipsis, b'', frozenset()):
1306 with self.subTest(const=const):
1307 value = self.compile_constant(const)
1308 self.assertIs(value, const)
1309
1310 def test_values(self):
1311 nested_tuple = (1,)
1312 nested_frozenset = frozenset({1})
1313 for level in range(3):
1314 nested_tuple = (nested_tuple, 2)
1315 nested_frozenset = frozenset({nested_frozenset, 2})
1316 values = (123, 123.0, 123j,
1317 "unicode", b'bytes',
1318 tuple("tuple"), frozenset("frozenset"),
1319 nested_tuple, nested_frozenset)
1320 for value in values:
1321 with self.subTest(value=value):
1322 result = self.compile_constant(value)
1323 self.assertEqual(result, value)
1324
1325 def test_assign_to_constant(self):
1326 tree = ast.parse("x = 1")
1327
1328 target = tree.body[0].targets[0]
1329 new_target = ast.Constant(value=1)
1330 ast.copy_location(new_target, target)
1331 tree.body[0].targets[0] = new_target
1332
1333 with self.assertRaises(ValueError) as cm:
1334 compile(tree, "string", "exec")
1335 self.assertEqual(str(cm.exception),
1336 "expression which can't be assigned "
1337 "to in Store context")
1338
1339 def test_get_docstring(self):
1340 tree = ast.parse("'docstring'\nx = 1")
1341 self.assertEqual(ast.get_docstring(tree), 'docstring')
1342
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001343 def get_load_const(self, tree):
1344 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1345 # instructions
1346 co = compile(tree, '<string>', 'exec')
1347 consts = []
1348 for instr in dis.get_instructions(co):
1349 if instr.opname == 'LOAD_CONST':
1350 consts.append(instr.argval)
1351 return consts
1352
1353 @support.cpython_only
1354 def test_load_const(self):
1355 consts = [None,
1356 True, False,
1357 124,
1358 2.0,
1359 3j,
1360 "unicode",
1361 b'bytes',
1362 (1, 2, 3)]
1363
Victor Stinnera2724092016-02-08 18:17:58 +01001364 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1365 code += '\nx = ...'
1366 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001367
1368 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001369 self.assertEqual(self.get_load_const(tree),
1370 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001371
1372 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001373 for assign, const in zip(tree.body, consts):
1374 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001375 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001376 ast.copy_location(new_node, assign.value)
1377 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001378
Victor Stinnera2724092016-02-08 18:17:58 +01001379 self.assertEqual(self.get_load_const(tree),
1380 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001381
1382 def test_literal_eval(self):
1383 tree = ast.parse("1 + 2")
1384 binop = tree.body[0].value
1385
1386 new_left = ast.Constant(value=10)
1387 ast.copy_location(new_left, binop.left)
1388 binop.left = new_left
1389
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001390 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001391 ast.copy_location(new_right, binop.right)
1392 binop.right = new_right
1393
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001394 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001395
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001396 def test_string_kind(self):
1397 c = ast.parse('"x"', mode='eval').body
1398 self.assertEqual(c.value, "x")
1399 self.assertEqual(c.kind, None)
1400
1401 c = ast.parse('u"x"', mode='eval').body
1402 self.assertEqual(c.value, "x")
1403 self.assertEqual(c.kind, "u")
1404
1405 c = ast.parse('r"x"', mode='eval').body
1406 self.assertEqual(c.value, "x")
1407 self.assertEqual(c.kind, None)
1408
1409 c = ast.parse('b"x"', mode='eval').body
1410 self.assertEqual(c.value, b"x")
1411 self.assertEqual(c.kind, None)
1412
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001413
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001414class EndPositionTests(unittest.TestCase):
1415 """Tests for end position of AST nodes.
1416
1417 Testing end positions of nodes requires a bit of extra care
1418 because of how LL parsers work.
1419 """
1420 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1421 self.assertEqual(ast_node.end_lineno, end_lineno)
1422 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1423
1424 def _check_content(self, source, ast_node, content):
1425 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1426
1427 def _parse_value(self, s):
1428 # Use duck-typing to support both single expression
1429 # and a right hand side of an assignment statement.
1430 return ast.parse(s).body[0].value
1431
1432 def test_lambda(self):
1433 s = 'lambda x, *y: None'
1434 lam = self._parse_value(s)
1435 self._check_content(s, lam.body, 'None')
1436 self._check_content(s, lam.args.args[0], 'x')
1437 self._check_content(s, lam.args.vararg, 'y')
1438
1439 def test_func_def(self):
1440 s = dedent('''
1441 def func(x: int,
1442 *args: str,
1443 z: float = 0,
1444 **kwargs: Any) -> bool:
1445 return True
1446 ''').strip()
1447 fdef = ast.parse(s).body[0]
1448 self._check_end_pos(fdef, 5, 15)
1449 self._check_content(s, fdef.body[0], 'return True')
1450 self._check_content(s, fdef.args.args[0], 'x: int')
1451 self._check_content(s, fdef.args.args[0].annotation, 'int')
1452 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1453 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1454
1455 def test_call(self):
1456 s = 'func(x, y=2, **kw)'
1457 call = self._parse_value(s)
1458 self._check_content(s, call.func, 'func')
1459 self._check_content(s, call.keywords[0].value, '2')
1460 self._check_content(s, call.keywords[1].value, 'kw')
1461
1462 def test_call_noargs(self):
1463 s = 'x[0]()'
1464 call = self._parse_value(s)
1465 self._check_content(s, call.func, 'x[0]')
1466 self._check_end_pos(call, 1, 6)
1467
1468 def test_class_def(self):
1469 s = dedent('''
1470 class C(A, B):
1471 x: int = 0
1472 ''').strip()
1473 cdef = ast.parse(s).body[0]
1474 self._check_end_pos(cdef, 2, 14)
1475 self._check_content(s, cdef.bases[1], 'B')
1476 self._check_content(s, cdef.body[0], 'x: int = 0')
1477
1478 def test_class_kw(self):
1479 s = 'class S(metaclass=abc.ABCMeta): pass'
1480 cdef = ast.parse(s).body[0]
1481 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1482
1483 def test_multi_line_str(self):
1484 s = dedent('''
1485 x = """Some multi-line text.
1486
1487 It goes on starting from same indent."""
1488 ''').strip()
1489 assign = ast.parse(s).body[0]
1490 self._check_end_pos(assign, 3, 40)
1491 self._check_end_pos(assign.value, 3, 40)
1492
1493 def test_continued_str(self):
1494 s = dedent('''
1495 x = "first part" \\
1496 "second part"
1497 ''').strip()
1498 assign = ast.parse(s).body[0]
1499 self._check_end_pos(assign, 2, 13)
1500 self._check_end_pos(assign.value, 2, 13)
1501
1502 def test_suites(self):
1503 # We intentionally put these into the same string to check
1504 # that empty lines are not part of the suite.
1505 s = dedent('''
1506 while True:
1507 pass
1508
1509 if one():
1510 x = None
1511 elif other():
1512 y = None
1513 else:
1514 z = None
1515
1516 for x, y in stuff:
1517 assert True
1518
1519 try:
1520 raise RuntimeError
1521 except TypeError as e:
1522 pass
1523
1524 pass
1525 ''').strip()
1526 mod = ast.parse(s)
1527 while_loop = mod.body[0]
1528 if_stmt = mod.body[1]
1529 for_loop = mod.body[2]
1530 try_stmt = mod.body[3]
1531 pass_stmt = mod.body[4]
1532
1533 self._check_end_pos(while_loop, 2, 8)
1534 self._check_end_pos(if_stmt, 9, 12)
1535 self._check_end_pos(for_loop, 12, 15)
1536 self._check_end_pos(try_stmt, 17, 8)
1537 self._check_end_pos(pass_stmt, 19, 4)
1538
1539 self._check_content(s, while_loop.test, 'True')
1540 self._check_content(s, if_stmt.body[0], 'x = None')
1541 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1542 self._check_content(s, for_loop.target, 'x, y')
1543 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1544 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1545
1546 def test_fstring(self):
1547 s = 'x = f"abc {x + y} abc"'
1548 fstr = self._parse_value(s)
1549 binop = fstr.values[1].value
1550 self._check_content(s, binop, 'x + y')
1551
1552 def test_fstring_multi_line(self):
1553 s = dedent('''
1554 f"""Some multi-line text.
1555 {
1556 arg_one
1557 +
1558 arg_two
1559 }
1560 It goes on..."""
1561 ''').strip()
1562 fstr = self._parse_value(s)
1563 binop = fstr.values[1].value
1564 self._check_end_pos(binop, 5, 7)
1565 self._check_content(s, binop.left, 'arg_one')
1566 self._check_content(s, binop.right, 'arg_two')
1567
1568 def test_import_from_multi_line(self):
1569 s = dedent('''
1570 from x.y.z import (
1571 a, b, c as c
1572 )
1573 ''').strip()
1574 imp = ast.parse(s).body[0]
1575 self._check_end_pos(imp, 3, 1)
1576
1577 def test_slices(self):
1578 s1 = 'f()[1, 2] [0]'
1579 s2 = 'x[ a.b: c.d]'
1580 sm = dedent('''
1581 x[ a.b: f () ,
1582 g () : c.d
1583 ]
1584 ''').strip()
1585 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1586 self._check_content(s1, i1.value, 'f()[1, 2]')
1587 self._check_content(s1, i1.value.slice.value, '1, 2')
1588 self._check_content(s2, i2.slice.lower, 'a.b')
1589 self._check_content(s2, i2.slice.upper, 'c.d')
1590 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1591 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1592 self._check_end_pos(im, 3, 3)
1593
1594 def test_binop(self):
1595 s = dedent('''
1596 (1 * 2 + (3 ) +
1597 4
1598 )
1599 ''').strip()
1600 binop = self._parse_value(s)
1601 self._check_end_pos(binop, 2, 6)
1602 self._check_content(s, binop.right, '4')
1603 self._check_content(s, binop.left, '1 * 2 + (3 )')
1604 self._check_content(s, binop.left.right, '3')
1605
1606 def test_boolop(self):
1607 s = dedent('''
1608 if (one_condition and
1609 (other_condition or yet_another_one)):
1610 pass
1611 ''').strip()
1612 bop = ast.parse(s).body[0].test
1613 self._check_end_pos(bop, 2, 44)
1614 self._check_content(s, bop.values[1],
1615 'other_condition or yet_another_one')
1616
1617 def test_tuples(self):
1618 s1 = 'x = () ;'
1619 s2 = 'x = 1 , ;'
1620 s3 = 'x = (1 , 2 ) ;'
1621 sm = dedent('''
1622 x = (
1623 a, b,
1624 )
1625 ''').strip()
1626 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1627 self._check_content(s1, t1, '()')
1628 self._check_content(s2, t2, '1 ,')
1629 self._check_content(s3, t3, '(1 , 2 )')
1630 self._check_end_pos(tm, 3, 1)
1631
1632 def test_attribute_spaces(self):
1633 s = 'func(x. y .z)'
1634 call = self._parse_value(s)
1635 self._check_content(s, call, s)
1636 self._check_content(s, call.args[0], 'x. y .z')
1637
1638 def test_displays(self):
1639 s1 = '[{}, {1, }, {1, 2,} ]'
1640 s2 = '{a: b, f (): g () ,}'
1641 c1 = self._parse_value(s1)
1642 c2 = self._parse_value(s2)
1643 self._check_content(s1, c1.elts[0], '{}')
1644 self._check_content(s1, c1.elts[1], '{1, }')
1645 self._check_content(s1, c1.elts[2], '{1, 2,}')
1646 self._check_content(s2, c2.keys[1], 'f ()')
1647 self._check_content(s2, c2.values[1], 'g ()')
1648
1649 def test_comprehensions(self):
1650 s = dedent('''
1651 x = [{x for x, y in stuff
1652 if cond.x} for stuff in things]
1653 ''').strip()
1654 cmp = self._parse_value(s)
1655 self._check_end_pos(cmp, 2, 37)
1656 self._check_content(s, cmp.generators[0].iter, 'things')
1657 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1658 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1659 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1660
1661 def test_yield_await(self):
1662 s = dedent('''
1663 async def f():
1664 yield x
1665 await y
1666 ''').strip()
1667 fdef = ast.parse(s).body[0]
1668 self._check_content(s, fdef.body[0].value, 'yield x')
1669 self._check_content(s, fdef.body[1].value, 'await y')
1670
1671 def test_source_segment_multi(self):
1672 s_orig = dedent('''
1673 x = (
1674 a, b,
1675 ) + ()
1676 ''').strip()
1677 s_tuple = dedent('''
1678 (
1679 a, b,
1680 )
1681 ''').strip()
1682 binop = self._parse_value(s_orig)
1683 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1684
1685 def test_source_segment_padded(self):
1686 s_orig = dedent('''
1687 class C:
1688 def fun(self) -> None:
1689 "ЖЖЖЖЖ"
1690 ''').strip()
1691 s_method = ' def fun(self) -> None:\n' \
1692 ' "ЖЖЖЖЖ"'
1693 cdef = ast.parse(s_orig).body[0]
1694 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1695 s_method)
1696
1697 def test_source_segment_endings(self):
1698 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1699 v, w, x, y, z = ast.parse(s).body
1700 self._check_content(s, v, 'v = 1')
1701 self._check_content(s, w, 'w = 1')
1702 self._check_content(s, x, 'x = 1')
1703 self._check_content(s, y, 'y = 1')
1704 self._check_content(s, z, 'z = 1')
1705
1706 def test_source_segment_tabs(self):
1707 s = dedent('''
1708 class C:
1709 \t\f def fun(self) -> None:
1710 \t\f pass
1711 ''').strip()
1712 s_method = ' \t\f def fun(self) -> None:\n' \
1713 ' \t\f pass'
1714
1715 cdef = ast.parse(s).body[0]
1716 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1717
1718
Miss Islington (bot)522a3942019-08-26 00:43:33 -07001719class NodeVisitorTests(unittest.TestCase):
1720 def test_old_constant_nodes(self):
1721 class Visitor(ast.NodeVisitor):
1722 def visit_Num(self, node):
1723 log.append((node.lineno, 'Num', node.n))
1724 def visit_Str(self, node):
1725 log.append((node.lineno, 'Str', node.s))
1726 def visit_Bytes(self, node):
1727 log.append((node.lineno, 'Bytes', node.s))
1728 def visit_NameConstant(self, node):
1729 log.append((node.lineno, 'NameConstant', node.value))
1730 def visit_Ellipsis(self, node):
1731 log.append((node.lineno, 'Ellipsis', ...))
1732 mod = ast.parse(dedent('''\
1733 i = 42
1734 f = 4.25
1735 c = 4.25j
1736 s = 'string'
1737 b = b'bytes'
1738 t = True
1739 n = None
1740 e = ...
1741 '''))
1742 visitor = Visitor()
1743 log = []
1744 with warnings.catch_warnings(record=True) as wlog:
1745 warnings.filterwarnings('always', '', PendingDeprecationWarning)
1746 visitor.visit(mod)
1747 self.assertEqual(log, [
1748 (1, 'Num', 42),
1749 (2, 'Num', 4.25),
1750 (3, 'Num', 4.25j),
1751 (4, 'Str', 'string'),
1752 (5, 'Bytes', b'bytes'),
1753 (6, 'NameConstant', True),
1754 (7, 'NameConstant', None),
1755 (8, 'Ellipsis', ...),
1756 ])
1757 self.assertEqual([str(w.message) for w in wlog], [
1758 'visit_Num is deprecated; add visit_Constant',
1759 'visit_Num is deprecated; add visit_Constant',
1760 'visit_Num is deprecated; add visit_Constant',
1761 'visit_Str is deprecated; add visit_Constant',
1762 'visit_Bytes is deprecated; add visit_Constant',
1763 'visit_NameConstant is deprecated; add visit_Constant',
1764 'visit_NameConstant is deprecated; add visit_Constant',
1765 'visit_Ellipsis is deprecated; add visit_Constant',
1766 ])
1767
1768
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001769def main():
1770 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001771 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001772 if sys.argv[1:] == ['-g']:
1773 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1774 (eval_tests, "eval")):
1775 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001776 for statement in statements:
1777 tree = ast.parse(statement, "?", kind)
1778 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001779 print("]")
1780 print("main()")
1781 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001782 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001783
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001784#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001785exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001786('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1787('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001788('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1789('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring', None))], [], None, None)], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001790('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1791('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0, None)]), [('Pass', (1, 12))], [], None, None)], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001792('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1793('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001794('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 -08001795('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001796('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001797('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001798('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 -08001799('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001800('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001801('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1802('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1803('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 -07001804('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001805('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1806('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1807('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
Miss Islington (bot)3b18b172019-12-13 08:21:54 -08001808('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []),
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -08001809('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001810('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1811('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 -07001812('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 -08001813('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1814('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1815('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1816('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1817('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1818('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001819('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001820('Module', [('Pass', (1, 0))], []),
1821('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1822('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1823('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)], []),
1824('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)], []),
1825('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)], []),
1826('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)]))], []),
1827('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)]))], []),
1828('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)]))], []),
1829('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)]))], []),
1830('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001831('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)], []),
1832('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)], []),
1833('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1, None))], None)], [], None, None)], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001834('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)]))], []),
1835('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001836('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)], []),
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -07001837('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
1838('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
1839('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001840('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 +00001841('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -07001842('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1843('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None), ('arg', (1, 15), 'd', None, None), ('arg', (1, 18), 'e', None, None)], None, [], [], None, []), [('Pass', (1, 22))], [], None, None)], []),
1844('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], None, []), [('Pass', (1, 25))], [], None, None)], []),
1845('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 12), 'c', None, None)], None, [('arg', (1, 18), 'd', None, None), ('arg', (1, 21), 'e', None, None)], [None, None], ('arg', (1, 26), 'kwargs', None, None), []), [('Pass', (1, 35))], [], None, None)], []),
1846('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1847('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None), ('arg', (1, 19), 'c', None, None)], None, [], [], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None), ('Constant', (1, 21), 4, None)]), [('Pass', (1, 25))], [], None, None)], []),
1848('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 28))], [], None, None)], []),
1849('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], None, [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 26))], [], None, None)], []),
1850('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [('Constant', (1, 24), 4, None)], ('arg', (1, 29), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 38))], [], None, None)], []),
1851('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [('arg', (1, 14), 'b', None, None)], None, [('arg', (1, 22), 'c', None, None)], [None], ('arg', (1, 27), 'kwargs', None, None), [('Constant', (1, 8), 1, None), ('Constant', (1, 16), 2, None)]), [('Pass', (1, 36))], [], None, None)], []),
Tim Peters400cbc32006-02-28 18:44:41 +00001852]
1853single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001854('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 +00001855]
1856eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001857('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001858('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1859('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1860('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001861('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001862('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001863('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001864('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1865('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001866('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)])),
1867('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)])),
1868('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)])),
1869('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)])),
1870('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)])),
1871('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)])),
1872('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)])),
1873('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)])),
1874('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)])),
1875('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)])),
1876('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 -07001877('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1878('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',)))])),
Pablo Galindob1f20442019-12-18 01:41:58 +00001879('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001880('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 -07001881('Expression', ('Constant', (1, 0), 10, None)),
1882('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001883('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1884('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 +00001885('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001886('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 -05001887('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001888('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1889('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 -05001890('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001891('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 +00001892]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001893main()