blob: 266075094bcbae339534f0ae92369df76d3b55f7 [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",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050071 # With
72 "with x as y: pass",
73 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000074 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000075 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000076 # TryExcept
77 "try:\n pass\nexcept Exception:\n pass",
78 # TryFinally
79 "try:\n pass\nfinally:\n pass",
80 # Assert
81 "assert v",
82 # Import
83 "import sys",
84 # ImportFrom
85 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000086 # Global
87 "global v",
88 # Expr
89 "1",
90 # Pass,
91 "pass",
92 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040093 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000094 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040095 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +000096 # for statements with naked tuples (see http://bugs.python.org/issue6704)
97 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +020098 "for (a,b) in c: pass",
99 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500100 # Multiline generator expression (test for .lineno & .col_offset)
101 """(
102 (
103 Aa
104 ,
105 Bb
106 )
107 for
108 Aa
109 ,
110 Bb in Cc
111 )""",
112 # dictcomp
113 "{a : b for w in x for m in p if g}",
114 # dictcomp with naked tuple
115 "{a : b for v,w in x}",
116 # setcomp
117 "{r for l in x if g}",
118 # setcomp with naked tuple
119 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400120 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900121 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400122 # AsyncFor
123 "async def f():\n async for e in i: 1\n else: 2",
124 # AsyncWith
125 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400126 # PEP 448: Additional Unpacking Generalizations
127 "{**{1:2}, 2:3}",
128 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700129 # Asynchronous comprehensions
130 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200131 # Decorated FunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700132 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200133 # Decorated AsyncFunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700134 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200135 # Decorated ClassDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700136 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200137 # Decorator with generator argument
138 "@deco(a for a in b)\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000139 # Simple assignment expression
140 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100141 # Positional-only arguments
142 "def f(a, /,): pass",
143 "def f(a, /, c, d, e): pass",
144 "def f(a, /, c, *, d, e): pass",
145 "def f(a, /, c, *, d, e, **kwargs): pass",
146 # Positional-only arguments with defaults
147 "def f(a=1, /,): pass",
148 "def f(a=1, /, b=2, c=4): pass",
149 "def f(a=1, /, b=2, *, c=4): pass",
150 "def f(a=1, /, b=2, *, c): pass",
151 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
152 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000153
Tim Peters400cbc32006-02-28 18:44:41 +0000154]
155
156# These are compiled through "single"
157# because of overlap with "eval", it just tests what
158# can't be tested with "eval"
159single_tests = [
160 "1+2"
161]
162
163# These are compiled through "eval"
164# It should test all expressions
165eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500166 # None
167 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000168 # BoolOp
169 "a and b",
170 # BinOp
171 "a + b",
172 # UnaryOp
173 "not v",
174 # Lambda
175 "lambda:None",
176 # Dict
177 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500178 # Empty dict
179 "{}",
180 # Set
181 "{None,}",
182 # Multiline dict (test for .lineno & .col_offset)
183 """{
184 1
185 :
186 2
187 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000188 # ListComp
189 "[a for b in c if d]",
190 # GeneratorExp
191 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200192 # Comprehensions with multiple for targets
193 "[(a,b) for a,b in c]",
194 "[(a,b) for (a,b) in c]",
195 "[(a,b) for [a,b] in c]",
196 "{(a,b) for a,b in c}",
197 "{(a,b) for (a,b) in c}",
198 "{(a,b) for [a,b] in c}",
199 "((a,b) for a,b in c)",
200 "((a,b) for (a,b) in c)",
201 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000202 # Yield - yield expressions can't work outside a function
203 #
204 # Compare
205 "1 < 2 < 3",
206 # Call
207 "f(1,2,c=3,*d,**e)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200208 # Call with a generator argument
209 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000210 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000211 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000212 # Str
213 "'string'",
214 # Attribute
215 "a.b",
216 # Subscript
217 "a[b:c]",
218 # Name
219 "v",
220 # List
221 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500222 # Empty list
223 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000224 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000225 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500226 # Tuple
227 "(1,2,3)",
228 # Empty tuple
229 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000230 # Combination
231 "a.b.c.d(a.b[1:2])",
232
Tim Peters400cbc32006-02-28 18:44:41 +0000233]
234
235# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
236# excepthandler, arguments, keywords, alias
237
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000238class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000239
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500240 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000241 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000242 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000243 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000244 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200245 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000246 parent_pos = (ast_node.lineno, ast_node.col_offset)
247 for name in ast_node._fields:
248 value = getattr(ast_node, name)
249 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200250 first_pos = parent_pos
251 if value and name == 'decorator_list':
252 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000253 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200254 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000255 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500256 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000257
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500258 def test_AST_objects(self):
259 x = ast.AST()
260 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700261 x.foobar = 42
262 self.assertEqual(x.foobar, 42)
263 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500264
265 with self.assertRaises(AttributeError):
266 x.vararg
267
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500268 with self.assertRaises(TypeError):
269 # "_ast.AST constructor takes 0 positional arguments"
270 ast.AST(2)
271
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700272 def test_AST_garbage_collection(self):
273 class X:
274 pass
275 a = ast.AST()
276 a.x = X()
277 a.x.a = a
278 ref = weakref.ref(a.x)
279 del a
280 support.gc_collect()
281 self.assertIsNone(ref())
282
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000283 def test_snippets(self):
284 for input, output, kind in ((exec_tests, exec_results, "exec"),
285 (single_tests, single_results, "single"),
286 (eval_tests, eval_results, "eval")):
287 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400288 with self.subTest(action="parsing", input=i):
289 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
290 self.assertEqual(to_tuple(ast_tree), o)
291 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100292 with self.subTest(action="compiling", input=i, kind=kind):
293 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000294
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000295 def test_ast_validation(self):
296 # compile() is the only function that calls PyAST_Validate
297 snippets_to_validate = exec_tests + single_tests + eval_tests
298 for snippet in snippets_to_validate:
299 tree = ast.parse(snippet)
300 compile(tree, '<string>', 'exec')
301
Benjamin Peterson78565b22009-06-28 19:19:51 +0000302 def test_slice(self):
303 slc = ast.parse("x[::]").body[0].value.slice
304 self.assertIsNone(slc.upper)
305 self.assertIsNone(slc.lower)
306 self.assertIsNone(slc.step)
307
308 def test_from_import(self):
309 im = ast.parse("from . import y").body[0]
310 self.assertIsNone(im.module)
311
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400312 def test_non_interned_future_from_ast(self):
313 mod = ast.parse("from __future__ import division")
314 self.assertIsInstance(mod.body[0], ast.ImportFrom)
315 mod.body[0].module = " __future__ ".strip()
316 compile(mod, "<test>", "exec")
317
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000318 def test_base_classes(self):
319 self.assertTrue(issubclass(ast.For, ast.stmt))
320 self.assertTrue(issubclass(ast.Name, ast.expr))
321 self.assertTrue(issubclass(ast.stmt, ast.AST))
322 self.assertTrue(issubclass(ast.expr, ast.AST))
323 self.assertTrue(issubclass(ast.comprehension, ast.AST))
324 self.assertTrue(issubclass(ast.Gt, ast.AST))
325
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500326 def test_field_attr_existence(self):
327 for name, item in ast.__dict__.items():
328 if isinstance(item, type) and name != 'AST' and name[0].isupper():
329 x = item()
330 if isinstance(x, ast.AST):
331 self.assertEqual(type(x._fields), tuple)
332
333 def test_arguments(self):
334 x = ast.arguments()
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -0700335 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
336 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500337
338 with self.assertRaises(AttributeError):
339 x.vararg
340
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100341 x = ast.arguments(*range(1, 8))
342 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500343
344 def test_field_attr_writable(self):
345 x = ast.Num()
346 # We can assign to _fields
347 x._fields = 666
348 self.assertEqual(x._fields, 666)
349
350 def test_classattrs(self):
351 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700352 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300353
354 with self.assertRaises(AttributeError):
355 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500356
357 with self.assertRaises(AttributeError):
358 x.n
359
360 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300361 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500362 self.assertEqual(x.n, 42)
363
364 with self.assertRaises(AttributeError):
365 x.lineno
366
367 with self.assertRaises(AttributeError):
368 x.foobar
369
370 x = ast.Num(lineno=2)
371 self.assertEqual(x.lineno, 2)
372
373 x = ast.Num(42, lineno=0)
374 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700375 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300376 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500377 self.assertEqual(x.n, 42)
378
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700379 self.assertRaises(TypeError, ast.Num, 1, None, 2)
380 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500381
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300382 self.assertEqual(ast.Num(42).n, 42)
383 self.assertEqual(ast.Num(4.25).n, 4.25)
384 self.assertEqual(ast.Num(4.25j).n, 4.25j)
385 self.assertEqual(ast.Str('42').s, '42')
386 self.assertEqual(ast.Bytes(b'42').s, b'42')
387 self.assertIs(ast.NameConstant(True).value, True)
388 self.assertIs(ast.NameConstant(False).value, False)
389 self.assertIs(ast.NameConstant(None).value, None)
390
391 self.assertEqual(ast.Constant(42).value, 42)
392 self.assertEqual(ast.Constant(4.25).value, 4.25)
393 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
394 self.assertEqual(ast.Constant('42').value, '42')
395 self.assertEqual(ast.Constant(b'42').value, b'42')
396 self.assertIs(ast.Constant(True).value, True)
397 self.assertIs(ast.Constant(False).value, False)
398 self.assertIs(ast.Constant(None).value, None)
399 self.assertIs(ast.Constant(...).value, ...)
400
401 def test_realtype(self):
402 self.assertEqual(type(ast.Num(42)), ast.Constant)
403 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
404 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
405 self.assertEqual(type(ast.Str('42')), ast.Constant)
406 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
407 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
408 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
409 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
410 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
411
412 def test_isinstance(self):
413 self.assertTrue(isinstance(ast.Num(42), ast.Num))
414 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
415 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
416 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
417 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
418 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
419 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
420 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
421 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
422
423 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
424 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
425 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
426 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
427 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
428 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
429 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
430 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
431 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
432
433 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
434 self.assertFalse(isinstance(ast.Num(42), ast.Str))
435 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
436 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
437 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800438 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
439 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300440
441 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
442 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
443 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
444 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
445 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800446 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
447 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300448
449 self.assertFalse(isinstance(ast.Constant(), ast.Num))
450 self.assertFalse(isinstance(ast.Constant(), ast.Str))
451 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
452 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
453 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
454
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200455 class S(str): pass
456 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
457 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
458
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300459 def test_subclasses(self):
460 class N(ast.Num):
461 def __init__(self, *args, **kwargs):
462 super().__init__(*args, **kwargs)
463 self.z = 'spam'
464 class N2(ast.Num):
465 pass
466
467 n = N(42)
468 self.assertEqual(n.n, 42)
469 self.assertEqual(n.z, 'spam')
470 self.assertEqual(type(n), N)
471 self.assertTrue(isinstance(n, N))
472 self.assertTrue(isinstance(n, ast.Num))
473 self.assertFalse(isinstance(n, N2))
474 self.assertFalse(isinstance(ast.Num(42), N))
475 n = N(n=42)
476 self.assertEqual(n.n, 42)
477 self.assertEqual(type(n), N)
478
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500479 def test_module(self):
480 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800481 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500482 self.assertEqual(x.body, body)
483
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000484 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100485 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500486 x = ast.BinOp()
487 self.assertEqual(x._fields, ('left', 'op', 'right'))
488
489 # Random attribute allowed too
490 x.foobarbaz = 5
491 self.assertEqual(x.foobarbaz, 5)
492
493 n1 = ast.Num(1)
494 n3 = ast.Num(3)
495 addop = ast.Add()
496 x = ast.BinOp(n1, addop, n3)
497 self.assertEqual(x.left, n1)
498 self.assertEqual(x.op, addop)
499 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500500
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500501 x = ast.BinOp(1, 2, 3)
502 self.assertEqual(x.left, 1)
503 self.assertEqual(x.op, 2)
504 self.assertEqual(x.right, 3)
505
Georg Brandl0c77a822008-06-10 16:37:50 +0000506 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000507 self.assertEqual(x.left, 1)
508 self.assertEqual(x.op, 2)
509 self.assertEqual(x.right, 3)
510 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000511
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500512 # node raises exception when given too many arguments
513 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500514 # node raises exception when given too many arguments
515 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000516
517 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000518 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000519 self.assertEqual(x.left, 1)
520 self.assertEqual(x.op, 2)
521 self.assertEqual(x.right, 3)
522 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000523
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500524 # Random kwargs also allowed
525 x = ast.BinOp(1, 2, 3, foobarbaz=42)
526 self.assertEqual(x.foobarbaz, 42)
527
528 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000529 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000530 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500531 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000532
533 def test_pickling(self):
534 import pickle
535 mods = [pickle]
536 try:
537 import cPickle
538 mods.append(cPickle)
539 except ImportError:
540 pass
541 protocols = [0, 1, 2]
542 for mod in mods:
543 for protocol in protocols:
544 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
545 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000547
Benjamin Peterson5b066812010-11-20 01:38:49 +0000548 def test_invalid_sum(self):
549 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800550 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000551 with self.assertRaises(TypeError) as cm:
552 compile(m, "<test>", "exec")
553 self.assertIn("but got <_ast.expr", str(cm.exception))
554
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500555 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800556 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500557 ast.fix_missing_locations(m)
558 with self.assertRaises(TypeError) as cm:
559 compile(m, "<test>", "exec")
560 self.assertIn("identifier must be of type str", str(cm.exception))
561
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000562 def test_empty_yield_from(self):
563 # Issue 16546: yield from value is not optional.
564 empty_yield_from = ast.parse("def f():\n yield from g()")
565 empty_yield_from.body[0].body[0].value.value = None
566 with self.assertRaises(ValueError) as cm:
567 compile(empty_yield_from, "<test>", "exec")
568 self.assertIn("field value is required", str(cm.exception))
569
Oren Milman7dc46d82017-09-30 20:16:24 +0300570 @support.cpython_only
571 def test_issue31592(self):
572 # There shouldn't be an assertion failure in case of a bad
573 # unicodedata.normalize().
574 import unicodedata
575 def bad_normalize(*args):
576 return None
577 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
578 self.assertRaises(TypeError, ast.parse, '\u03D5')
579
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700580 def test_issue18374_binop_col_offset(self):
581 tree = ast.parse('4+5+6+7')
582 parent_binop = tree.body[0].value
583 child_binop = parent_binop.left
584 grandchild_binop = child_binop.left
585 self.assertEqual(parent_binop.col_offset, 0)
586 self.assertEqual(parent_binop.end_col_offset, 7)
587 self.assertEqual(child_binop.col_offset, 0)
588 self.assertEqual(child_binop.end_col_offset, 5)
589 self.assertEqual(grandchild_binop.col_offset, 0)
590 self.assertEqual(grandchild_binop.end_col_offset, 3)
591
592 tree = ast.parse('4+5-\\\n 6-7')
593 parent_binop = tree.body[0].value
594 child_binop = parent_binop.left
595 grandchild_binop = child_binop.left
596 self.assertEqual(parent_binop.col_offset, 0)
597 self.assertEqual(parent_binop.lineno, 1)
598 self.assertEqual(parent_binop.end_col_offset, 4)
599 self.assertEqual(parent_binop.end_lineno, 2)
600
601 self.assertEqual(child_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700602 self.assertEqual(child_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700603 self.assertEqual(child_binop.end_col_offset, 2)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700604 self.assertEqual(child_binop.end_lineno, 2)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700605
606 self.assertEqual(grandchild_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700607 self.assertEqual(grandchild_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700608 self.assertEqual(grandchild_binop.end_col_offset, 3)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700609 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000610
611class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700612 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000613
614 def test_parse(self):
615 a = ast.parse('foo(1 + 1)')
616 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
617 self.assertEqual(ast.dump(a), ast.dump(b))
618
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400619 def test_parse_in_error(self):
620 try:
621 1/0
622 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400623 with self.assertRaises(SyntaxError) as e:
624 ast.literal_eval(r"'\U'")
625 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400626
Georg Brandl0c77a822008-06-10 16:37:50 +0000627 def test_dump(self):
628 node = ast.parse('spam(eggs, "and cheese")')
629 self.assertEqual(ast.dump(node),
630 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700631 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800632 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000633 )
634 self.assertEqual(ast.dump(node, annotate_fields=False),
635 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700636 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000637 )
638 self.assertEqual(ast.dump(node, include_attributes=True),
639 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000640 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
641 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700642 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000643 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
644 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800645 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000646 )
647
Serhiy Storchaka097eae52019-08-29 10:50:28 +0300648 def test_dump_incomplete(self):
649 node = ast.Raise(lineno=3, col_offset=4)
650 self.assertEqual(ast.dump(node),
651 "Raise()"
652 )
653 self.assertEqual(ast.dump(node, include_attributes=True),
654 "Raise(lineno=3, col_offset=4)"
655 )
656 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
657 self.assertEqual(ast.dump(node),
658 "Raise(exc=Name(id='e', ctx=Load()))"
659 )
660 self.assertEqual(ast.dump(node, annotate_fields=False),
661 "Raise(Name('e', Load()))"
662 )
663 self.assertEqual(ast.dump(node, include_attributes=True),
664 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
665 )
666 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
667 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
668 )
669 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
670 self.assertEqual(ast.dump(node),
671 "Raise(cause=Name(id='e', ctx=Load()))"
672 )
673 self.assertEqual(ast.dump(node, annotate_fields=False),
674 "Raise(cause=Name('e', Load()))"
675 )
676
Georg Brandl0c77a822008-06-10 16:37:50 +0000677 def test_copy_location(self):
678 src = ast.parse('1 + 1', mode='eval')
679 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
680 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700681 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000682 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
683 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
684 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000685 )
686
687 def test_fix_missing_locations(self):
688 src = ast.parse('write("spam")')
689 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400690 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000691 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000692 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000693 self.assertEqual(ast.dump(src, include_attributes=True),
694 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000695 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700696 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000697 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
698 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
699 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
700 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
701 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
702 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800703 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
704 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000705 )
706
707 def test_increment_lineno(self):
708 src = ast.parse('1 + 1', mode='eval')
709 self.assertEqual(ast.increment_lineno(src, n=3), src)
710 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700711 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
712 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000713 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
714 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000715 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000716 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000717 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000718 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
719 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700720 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
721 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000722 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
723 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000724 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000725
726 def test_iter_fields(self):
727 node = ast.parse('foo()', mode='eval')
728 d = dict(ast.iter_fields(node.body))
729 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400730 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000731
732 def test_iter_child_nodes(self):
733 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
734 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
735 iterator = ast.iter_child_nodes(node.body)
736 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300737 self.assertEqual(next(iterator).value, 23)
738 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000739 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700740 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000741 )
742
743 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300744 node = ast.parse('"""line one\n line two"""')
745 self.assertEqual(ast.get_docstring(node),
746 'line one\nline two')
747
748 node = ast.parse('class foo:\n """line one\n line two"""')
749 self.assertEqual(ast.get_docstring(node.body[0]),
750 'line one\nline two')
751
Georg Brandl0c77a822008-06-10 16:37:50 +0000752 node = ast.parse('def foo():\n """line one\n line two"""')
753 self.assertEqual(ast.get_docstring(node.body[0]),
754 'line one\nline two')
755
Yury Selivanov2f07a662015-07-23 08:54:35 +0300756 node = ast.parse('async def foo():\n """spam\n ham"""')
757 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300758
759 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800760 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300761 node = ast.parse('x = "not docstring"')
762 self.assertIsNone(ast.get_docstring(node))
763 node = ast.parse('def foo():\n pass')
764 self.assertIsNone(ast.get_docstring(node))
765
766 node = ast.parse('class foo:\n pass')
767 self.assertIsNone(ast.get_docstring(node.body[0]))
768 node = ast.parse('class foo:\n x = "not docstring"')
769 self.assertIsNone(ast.get_docstring(node.body[0]))
770 node = ast.parse('class foo:\n def bar(self): pass')
771 self.assertIsNone(ast.get_docstring(node.body[0]))
772
773 node = ast.parse('def foo():\n pass')
774 self.assertIsNone(ast.get_docstring(node.body[0]))
775 node = ast.parse('def foo():\n x = "not docstring"')
776 self.assertIsNone(ast.get_docstring(node.body[0]))
777
778 node = ast.parse('async def foo():\n pass')
779 self.assertIsNone(ast.get_docstring(node.body[0]))
780 node = ast.parse('async def foo():\n x = "not docstring"')
781 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300782
Anthony Sottile995d9b92019-01-12 20:05:13 -0800783 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
784 node = ast.parse(
785 '"""line one\nline two"""\n\n'
786 'def foo():\n """line one\n line two"""\n\n'
787 ' def bar():\n """line one\n line two"""\n'
788 ' """line one\n line two"""\n'
789 '"""line one\nline two"""\n\n'
790 )
791 self.assertEqual(node.body[0].col_offset, 0)
792 self.assertEqual(node.body[0].lineno, 1)
793 self.assertEqual(node.body[1].body[0].col_offset, 2)
794 self.assertEqual(node.body[1].body[0].lineno, 5)
795 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
796 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
797 self.assertEqual(node.body[1].body[2].col_offset, 2)
798 self.assertEqual(node.body[1].body[2].lineno, 11)
799 self.assertEqual(node.body[2].col_offset, 0)
800 self.assertEqual(node.body[2].lineno, 13)
801
Georg Brandl0c77a822008-06-10 16:37:50 +0000802 def test_literal_eval(self):
803 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
804 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
805 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000806 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000807 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000808 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200809 self.assertEqual(ast.literal_eval('6'), 6)
810 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000811 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000812 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200813 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
814 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
815 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
816 self.assertRaises(ValueError, ast.literal_eval, '++6')
817 self.assertRaises(ValueError, ast.literal_eval, '+True')
818 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000819
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200820 def test_literal_eval_complex(self):
821 # Issue #4907
822 self.assertEqual(ast.literal_eval('6j'), 6j)
823 self.assertEqual(ast.literal_eval('-6j'), -6j)
824 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
825 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
826 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
827 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
828 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
829 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
830 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
831 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
832 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
833 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
834 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
835 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
836 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
837 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
838 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
839 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000840
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100841 def test_bad_integer(self):
842 # issue13436: Bad error message with invalid numeric values
843 body = [ast.ImportFrom(module='time',
844 names=[ast.alias(name='sleep')],
845 level=None,
846 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800847 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100848 with self.assertRaises(ValueError) as cm:
849 compile(mod, 'test', 'exec')
850 self.assertIn("invalid integer value: None", str(cm.exception))
851
Berker Peksag0a5bd512016-04-29 19:50:02 +0300852 def test_level_as_none(self):
853 body = [ast.ImportFrom(module='time',
854 names=[ast.alias(name='sleep')],
855 level=None,
856 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800857 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300858 code = compile(mod, 'test', 'exec')
859 ns = {}
860 exec(code, ns)
861 self.assertIn('sleep', ns)
862
Georg Brandl0c77a822008-06-10 16:37:50 +0000863
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500864class ASTValidatorTests(unittest.TestCase):
865
866 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
867 mod.lineno = mod.col_offset = 0
868 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300869 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500870 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300871 else:
872 with self.assertRaises(exc) as cm:
873 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500874 self.assertIn(msg, str(cm.exception))
875
876 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800877 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500878 self.mod(mod, msg, exc=exc)
879
880 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800881 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500882 self.mod(mod, msg)
883
884 def test_module(self):
885 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
886 self.mod(m, "must have Load context", "single")
887 m = ast.Expression(ast.Name("x", ast.Store()))
888 self.mod(m, "must have Load context", "eval")
889
890 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100891 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700892 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500893 defaults=None, kw_defaults=None):
894 if args is None:
895 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100896 if posonlyargs is None:
897 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500898 if kwonlyargs is None:
899 kwonlyargs = []
900 if defaults is None:
901 defaults = []
902 if kw_defaults is None:
903 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100904 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
905 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500906 return fac(args)
907 args = [ast.arg("x", ast.Name("x", ast.Store()))]
908 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100909 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500910 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500911 check(arguments(defaults=[ast.Num(3)]),
912 "more positional defaults than args")
913 check(arguments(kw_defaults=[ast.Num(4)]),
914 "length of kwonlyargs is not the same as kw_defaults")
915 args = [ast.arg("x", ast.Name("x", ast.Load()))]
916 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
917 "must have Load context")
918 args = [ast.arg("a", ast.Name("x", ast.Load())),
919 ast.arg("b", ast.Name("y", ast.Load()))]
920 check(arguments(kwonlyargs=args,
921 kw_defaults=[None, ast.Name("x", ast.Store())]),
922 "must have Load context")
923
924 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100925 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300926 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500927 self.stmt(f, "empty body on FunctionDef")
928 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300929 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500930 self.stmt(f, "must have Load context")
931 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300932 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500933 self.stmt(f, "must have Load context")
934 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300935 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500936 self._check_arguments(fac, self.stmt)
937
938 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400939 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500940 if bases is None:
941 bases = []
942 if keywords is None:
943 keywords = []
944 if body is None:
945 body = [ast.Pass()]
946 if decorator_list is None:
947 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400948 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300949 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500950 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
951 "must have Load context")
952 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
953 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500954 self.stmt(cls(body=[]), "empty body on ClassDef")
955 self.stmt(cls(body=[None]), "None disallowed")
956 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
957 "must have Load context")
958
959 def test_delete(self):
960 self.stmt(ast.Delete([]), "empty targets on Delete")
961 self.stmt(ast.Delete([None]), "None disallowed")
962 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
963 "must have Del context")
964
965 def test_assign(self):
966 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
967 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
968 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
969 "must have Store context")
970 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
971 ast.Name("y", ast.Store())),
972 "must have Load context")
973
974 def test_augassign(self):
975 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
976 ast.Name("y", ast.Load()))
977 self.stmt(aug, "must have Store context")
978 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
979 ast.Name("y", ast.Store()))
980 self.stmt(aug, "must have Load context")
981
982 def test_for(self):
983 x = ast.Name("x", ast.Store())
984 y = ast.Name("y", ast.Load())
985 p = ast.Pass()
986 self.stmt(ast.For(x, y, [], []), "empty body on For")
987 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
988 "must have Store context")
989 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
990 "must have Load context")
991 e = ast.Expr(ast.Name("x", ast.Store()))
992 self.stmt(ast.For(x, y, [e], []), "must have Load context")
993 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
994
995 def test_while(self):
996 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
997 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
998 "must have Load context")
999 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1000 [ast.Expr(ast.Name("x", ast.Store()))]),
1001 "must have Load context")
1002
1003 def test_if(self):
1004 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1005 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1006 self.stmt(i, "must have Load context")
1007 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1008 self.stmt(i, "must have Load context")
1009 i = ast.If(ast.Num(3), [ast.Pass()],
1010 [ast.Expr(ast.Name("x", ast.Store()))])
1011 self.stmt(i, "must have Load context")
1012
1013 def test_with(self):
1014 p = ast.Pass()
1015 self.stmt(ast.With([], [p]), "empty items on With")
1016 i = ast.withitem(ast.Num(3), None)
1017 self.stmt(ast.With([i], []), "empty body on With")
1018 i = ast.withitem(ast.Name("x", ast.Store()), None)
1019 self.stmt(ast.With([i], [p]), "must have Load context")
1020 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1021 self.stmt(ast.With([i], [p]), "must have Store context")
1022
1023 def test_raise(self):
1024 r = ast.Raise(None, ast.Num(3))
1025 self.stmt(r, "Raise with cause but no exception")
1026 r = ast.Raise(ast.Name("x", ast.Store()), None)
1027 self.stmt(r, "must have Load context")
1028 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1029 self.stmt(r, "must have Load context")
1030
1031 def test_try(self):
1032 p = ast.Pass()
1033 t = ast.Try([], [], [], [p])
1034 self.stmt(t, "empty body on Try")
1035 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1036 self.stmt(t, "must have Load context")
1037 t = ast.Try([p], [], [], [])
1038 self.stmt(t, "Try has neither except handlers nor finalbody")
1039 t = ast.Try([p], [], [p], [p])
1040 self.stmt(t, "Try has orelse but no except handlers")
1041 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1042 self.stmt(t, "empty body on ExceptHandler")
1043 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1044 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1045 e = [ast.ExceptHandler(None, "x", [p])]
1046 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1047 self.stmt(t, "must have Load context")
1048 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1049 self.stmt(t, "must have Load context")
1050
1051 def test_assert(self):
1052 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1053 "must have Load context")
1054 assrt = ast.Assert(ast.Name("x", ast.Load()),
1055 ast.Name("y", ast.Store()))
1056 self.stmt(assrt, "must have Load context")
1057
1058 def test_import(self):
1059 self.stmt(ast.Import([]), "empty names on Import")
1060
1061 def test_importfrom(self):
1062 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001063 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001064 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1065
1066 def test_global(self):
1067 self.stmt(ast.Global([]), "empty names on Global")
1068
1069 def test_nonlocal(self):
1070 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1071
1072 def test_expr(self):
1073 e = ast.Expr(ast.Name("x", ast.Store()))
1074 self.stmt(e, "must have Load context")
1075
1076 def test_boolop(self):
1077 b = ast.BoolOp(ast.And(), [])
1078 self.expr(b, "less than 2 values")
1079 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1080 self.expr(b, "less than 2 values")
1081 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1082 self.expr(b, "None disallowed")
1083 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1084 self.expr(b, "must have Load context")
1085
1086 def test_unaryop(self):
1087 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1088 self.expr(u, "must have Load context")
1089
1090 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001091 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001092 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1093 "must have Load context")
1094 def fac(args):
1095 return ast.Lambda(args, ast.Name("x", ast.Load()))
1096 self._check_arguments(fac, self.expr)
1097
1098 def test_ifexp(self):
1099 l = ast.Name("x", ast.Load())
1100 s = ast.Name("y", ast.Store())
1101 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001102 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001103
1104 def test_dict(self):
1105 d = ast.Dict([], [ast.Name("x", ast.Load())])
1106 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001107 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1108 self.expr(d, "None disallowed")
1109
1110 def test_set(self):
1111 self.expr(ast.Set([None]), "None disallowed")
1112 s = ast.Set([ast.Name("x", ast.Store())])
1113 self.expr(s, "must have Load context")
1114
1115 def _check_comprehension(self, fac):
1116 self.expr(fac([]), "comprehension with no generators")
1117 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001118 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001119 self.expr(fac([g]), "must have Store context")
1120 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001121 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001122 self.expr(fac([g]), "must have Load context")
1123 x = ast.Name("x", ast.Store())
1124 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001125 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001126 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001127 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001128 self.expr(fac([g]), "must have Load context")
1129
1130 def _simple_comp(self, fac):
1131 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001132 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001133 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1134 "must have Load context")
1135 def wrap(gens):
1136 return fac(ast.Name("x", ast.Store()), gens)
1137 self._check_comprehension(wrap)
1138
1139 def test_listcomp(self):
1140 self._simple_comp(ast.ListComp)
1141
1142 def test_setcomp(self):
1143 self._simple_comp(ast.SetComp)
1144
1145 def test_generatorexp(self):
1146 self._simple_comp(ast.GeneratorExp)
1147
1148 def test_dictcomp(self):
1149 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001150 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001151 c = ast.DictComp(ast.Name("x", ast.Store()),
1152 ast.Name("y", ast.Load()), [g])
1153 self.expr(c, "must have Load context")
1154 c = ast.DictComp(ast.Name("x", ast.Load()),
1155 ast.Name("y", ast.Store()), [g])
1156 self.expr(c, "must have Load context")
1157 def factory(comps):
1158 k = ast.Name("x", ast.Load())
1159 v = ast.Name("y", ast.Load())
1160 return ast.DictComp(k, v, comps)
1161 self._check_comprehension(factory)
1162
1163 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001164 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1165 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001166
1167 def test_compare(self):
1168 left = ast.Name("x", ast.Load())
1169 comp = ast.Compare(left, [ast.In()], [])
1170 self.expr(comp, "no comparators")
1171 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1172 self.expr(comp, "different number of comparators and operands")
1173 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001174 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001175 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001176 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001177
1178 def test_call(self):
1179 func = ast.Name("x", ast.Load())
1180 args = [ast.Name("y", ast.Load())]
1181 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001182 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001183 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001184 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001185 self.expr(call, "None disallowed")
1186 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001187 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001188 self.expr(call, "must have Load context")
1189
1190 def test_num(self):
1191 class subint(int):
1192 pass
1193 class subfloat(float):
1194 pass
1195 class subcomplex(complex):
1196 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001197 for obj in "0", "hello":
1198 self.expr(ast.Num(obj))
1199 for obj in subint(), subfloat(), subcomplex():
1200 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001201
1202 def test_attribute(self):
1203 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1204 self.expr(attr, "must have Load context")
1205
1206 def test_subscript(self):
1207 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1208 ast.Load())
1209 self.expr(sub, "must have Load context")
1210 x = ast.Name("x", ast.Load())
1211 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1212 ast.Load())
1213 self.expr(sub, "must have Load context")
1214 s = ast.Name("x", ast.Store())
1215 for args in (s, None, None), (None, s, None), (None, None, s):
1216 sl = ast.Slice(*args)
1217 self.expr(ast.Subscript(x, sl, ast.Load()),
1218 "must have Load context")
1219 sl = ast.ExtSlice([])
1220 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1221 sl = ast.ExtSlice([ast.Index(s)])
1222 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1223
1224 def test_starred(self):
1225 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1226 ast.Store())
1227 assign = ast.Assign([left], ast.Num(4))
1228 self.stmt(assign, "must have Store context")
1229
1230 def _sequence(self, fac):
1231 self.expr(fac([None], ast.Load()), "None disallowed")
1232 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1233 "must have Load context")
1234
1235 def test_list(self):
1236 self._sequence(ast.List)
1237
1238 def test_tuple(self):
1239 self._sequence(ast.Tuple)
1240
Benjamin Peterson442f2092012-12-06 17:41:04 -05001241 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001242 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001243
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001244 def test_stdlib_validates(self):
1245 stdlib = os.path.dirname(ast.__file__)
1246 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1247 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1248 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001249 with self.subTest(module):
1250 fn = os.path.join(stdlib, module)
1251 with open(fn, "r", encoding="utf-8") as fp:
1252 source = fp.read()
1253 mod = ast.parse(source, fn)
1254 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001255
1256
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001257class ConstantTests(unittest.TestCase):
1258 """Tests on the ast.Constant node type."""
1259
1260 def compile_constant(self, value):
1261 tree = ast.parse("x = 123")
1262
1263 node = tree.body[0].value
1264 new_node = ast.Constant(value=value)
1265 ast.copy_location(new_node, node)
1266 tree.body[0].value = new_node
1267
1268 code = compile(tree, "<string>", "exec")
1269
1270 ns = {}
1271 exec(code, ns)
1272 return ns['x']
1273
Victor Stinnerbe59d142016-01-27 00:39:12 +01001274 def test_validation(self):
1275 with self.assertRaises(TypeError) as cm:
1276 self.compile_constant([1, 2, 3])
1277 self.assertEqual(str(cm.exception),
1278 "got an invalid type in Constant: list")
1279
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001280 def test_singletons(self):
1281 for const in (None, False, True, Ellipsis, b'', frozenset()):
1282 with self.subTest(const=const):
1283 value = self.compile_constant(const)
1284 self.assertIs(value, const)
1285
1286 def test_values(self):
1287 nested_tuple = (1,)
1288 nested_frozenset = frozenset({1})
1289 for level in range(3):
1290 nested_tuple = (nested_tuple, 2)
1291 nested_frozenset = frozenset({nested_frozenset, 2})
1292 values = (123, 123.0, 123j,
1293 "unicode", b'bytes',
1294 tuple("tuple"), frozenset("frozenset"),
1295 nested_tuple, nested_frozenset)
1296 for value in values:
1297 with self.subTest(value=value):
1298 result = self.compile_constant(value)
1299 self.assertEqual(result, value)
1300
1301 def test_assign_to_constant(self):
1302 tree = ast.parse("x = 1")
1303
1304 target = tree.body[0].targets[0]
1305 new_target = ast.Constant(value=1)
1306 ast.copy_location(new_target, target)
1307 tree.body[0].targets[0] = new_target
1308
1309 with self.assertRaises(ValueError) as cm:
1310 compile(tree, "string", "exec")
1311 self.assertEqual(str(cm.exception),
1312 "expression which can't be assigned "
1313 "to in Store context")
1314
1315 def test_get_docstring(self):
1316 tree = ast.parse("'docstring'\nx = 1")
1317 self.assertEqual(ast.get_docstring(tree), 'docstring')
1318
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001319 def get_load_const(self, tree):
1320 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1321 # instructions
1322 co = compile(tree, '<string>', 'exec')
1323 consts = []
1324 for instr in dis.get_instructions(co):
1325 if instr.opname == 'LOAD_CONST':
1326 consts.append(instr.argval)
1327 return consts
1328
1329 @support.cpython_only
1330 def test_load_const(self):
1331 consts = [None,
1332 True, False,
1333 124,
1334 2.0,
1335 3j,
1336 "unicode",
1337 b'bytes',
1338 (1, 2, 3)]
1339
Victor Stinnera2724092016-02-08 18:17:58 +01001340 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1341 code += '\nx = ...'
1342 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001343
1344 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001345 self.assertEqual(self.get_load_const(tree),
1346 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001347
1348 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001349 for assign, const in zip(tree.body, consts):
1350 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001351 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001352 ast.copy_location(new_node, assign.value)
1353 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001354
Victor Stinnera2724092016-02-08 18:17:58 +01001355 self.assertEqual(self.get_load_const(tree),
1356 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001357
1358 def test_literal_eval(self):
1359 tree = ast.parse("1 + 2")
1360 binop = tree.body[0].value
1361
1362 new_left = ast.Constant(value=10)
1363 ast.copy_location(new_left, binop.left)
1364 binop.left = new_left
1365
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001366 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001367 ast.copy_location(new_right, binop.right)
1368 binop.right = new_right
1369
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001370 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001371
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001372 def test_string_kind(self):
1373 c = ast.parse('"x"', mode='eval').body
1374 self.assertEqual(c.value, "x")
1375 self.assertEqual(c.kind, None)
1376
1377 c = ast.parse('u"x"', mode='eval').body
1378 self.assertEqual(c.value, "x")
1379 self.assertEqual(c.kind, "u")
1380
1381 c = ast.parse('r"x"', mode='eval').body
1382 self.assertEqual(c.value, "x")
1383 self.assertEqual(c.kind, None)
1384
1385 c = ast.parse('b"x"', mode='eval').body
1386 self.assertEqual(c.value, b"x")
1387 self.assertEqual(c.kind, None)
1388
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001389
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001390class EndPositionTests(unittest.TestCase):
1391 """Tests for end position of AST nodes.
1392
1393 Testing end positions of nodes requires a bit of extra care
1394 because of how LL parsers work.
1395 """
1396 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1397 self.assertEqual(ast_node.end_lineno, end_lineno)
1398 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1399
1400 def _check_content(self, source, ast_node, content):
1401 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1402
1403 def _parse_value(self, s):
1404 # Use duck-typing to support both single expression
1405 # and a right hand side of an assignment statement.
1406 return ast.parse(s).body[0].value
1407
1408 def test_lambda(self):
1409 s = 'lambda x, *y: None'
1410 lam = self._parse_value(s)
1411 self._check_content(s, lam.body, 'None')
1412 self._check_content(s, lam.args.args[0], 'x')
1413 self._check_content(s, lam.args.vararg, 'y')
1414
1415 def test_func_def(self):
1416 s = dedent('''
1417 def func(x: int,
1418 *args: str,
1419 z: float = 0,
1420 **kwargs: Any) -> bool:
1421 return True
1422 ''').strip()
1423 fdef = ast.parse(s).body[0]
1424 self._check_end_pos(fdef, 5, 15)
1425 self._check_content(s, fdef.body[0], 'return True')
1426 self._check_content(s, fdef.args.args[0], 'x: int')
1427 self._check_content(s, fdef.args.args[0].annotation, 'int')
1428 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1429 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1430
1431 def test_call(self):
1432 s = 'func(x, y=2, **kw)'
1433 call = self._parse_value(s)
1434 self._check_content(s, call.func, 'func')
1435 self._check_content(s, call.keywords[0].value, '2')
1436 self._check_content(s, call.keywords[1].value, 'kw')
1437
1438 def test_call_noargs(self):
1439 s = 'x[0]()'
1440 call = self._parse_value(s)
1441 self._check_content(s, call.func, 'x[0]')
1442 self._check_end_pos(call, 1, 6)
1443
1444 def test_class_def(self):
1445 s = dedent('''
1446 class C(A, B):
1447 x: int = 0
1448 ''').strip()
1449 cdef = ast.parse(s).body[0]
1450 self._check_end_pos(cdef, 2, 14)
1451 self._check_content(s, cdef.bases[1], 'B')
1452 self._check_content(s, cdef.body[0], 'x: int = 0')
1453
1454 def test_class_kw(self):
1455 s = 'class S(metaclass=abc.ABCMeta): pass'
1456 cdef = ast.parse(s).body[0]
1457 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1458
1459 def test_multi_line_str(self):
1460 s = dedent('''
1461 x = """Some multi-line text.
1462
1463 It goes on starting from same indent."""
1464 ''').strip()
1465 assign = ast.parse(s).body[0]
1466 self._check_end_pos(assign, 3, 40)
1467 self._check_end_pos(assign.value, 3, 40)
1468
1469 def test_continued_str(self):
1470 s = dedent('''
1471 x = "first part" \\
1472 "second part"
1473 ''').strip()
1474 assign = ast.parse(s).body[0]
1475 self._check_end_pos(assign, 2, 13)
1476 self._check_end_pos(assign.value, 2, 13)
1477
1478 def test_suites(self):
1479 # We intentionally put these into the same string to check
1480 # that empty lines are not part of the suite.
1481 s = dedent('''
1482 while True:
1483 pass
1484
1485 if one():
1486 x = None
1487 elif other():
1488 y = None
1489 else:
1490 z = None
1491
1492 for x, y in stuff:
1493 assert True
1494
1495 try:
1496 raise RuntimeError
1497 except TypeError as e:
1498 pass
1499
1500 pass
1501 ''').strip()
1502 mod = ast.parse(s)
1503 while_loop = mod.body[0]
1504 if_stmt = mod.body[1]
1505 for_loop = mod.body[2]
1506 try_stmt = mod.body[3]
1507 pass_stmt = mod.body[4]
1508
1509 self._check_end_pos(while_loop, 2, 8)
1510 self._check_end_pos(if_stmt, 9, 12)
1511 self._check_end_pos(for_loop, 12, 15)
1512 self._check_end_pos(try_stmt, 17, 8)
1513 self._check_end_pos(pass_stmt, 19, 4)
1514
1515 self._check_content(s, while_loop.test, 'True')
1516 self._check_content(s, if_stmt.body[0], 'x = None')
1517 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1518 self._check_content(s, for_loop.target, 'x, y')
1519 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1520 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1521
1522 def test_fstring(self):
1523 s = 'x = f"abc {x + y} abc"'
1524 fstr = self._parse_value(s)
1525 binop = fstr.values[1].value
1526 self._check_content(s, binop, 'x + y')
1527
1528 def test_fstring_multi_line(self):
1529 s = dedent('''
1530 f"""Some multi-line text.
1531 {
1532 arg_one
1533 +
1534 arg_two
1535 }
1536 It goes on..."""
1537 ''').strip()
1538 fstr = self._parse_value(s)
1539 binop = fstr.values[1].value
1540 self._check_end_pos(binop, 5, 7)
1541 self._check_content(s, binop.left, 'arg_one')
1542 self._check_content(s, binop.right, 'arg_two')
1543
1544 def test_import_from_multi_line(self):
1545 s = dedent('''
1546 from x.y.z import (
1547 a, b, c as c
1548 )
1549 ''').strip()
1550 imp = ast.parse(s).body[0]
1551 self._check_end_pos(imp, 3, 1)
1552
1553 def test_slices(self):
1554 s1 = 'f()[1, 2] [0]'
1555 s2 = 'x[ a.b: c.d]'
1556 sm = dedent('''
1557 x[ a.b: f () ,
1558 g () : c.d
1559 ]
1560 ''').strip()
1561 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1562 self._check_content(s1, i1.value, 'f()[1, 2]')
1563 self._check_content(s1, i1.value.slice.value, '1, 2')
1564 self._check_content(s2, i2.slice.lower, 'a.b')
1565 self._check_content(s2, i2.slice.upper, 'c.d')
1566 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1567 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1568 self._check_end_pos(im, 3, 3)
1569
1570 def test_binop(self):
1571 s = dedent('''
1572 (1 * 2 + (3 ) +
1573 4
1574 )
1575 ''').strip()
1576 binop = self._parse_value(s)
1577 self._check_end_pos(binop, 2, 6)
1578 self._check_content(s, binop.right, '4')
1579 self._check_content(s, binop.left, '1 * 2 + (3 )')
1580 self._check_content(s, binop.left.right, '3')
1581
1582 def test_boolop(self):
1583 s = dedent('''
1584 if (one_condition and
1585 (other_condition or yet_another_one)):
1586 pass
1587 ''').strip()
1588 bop = ast.parse(s).body[0].test
1589 self._check_end_pos(bop, 2, 44)
1590 self._check_content(s, bop.values[1],
1591 'other_condition or yet_another_one')
1592
1593 def test_tuples(self):
1594 s1 = 'x = () ;'
1595 s2 = 'x = 1 , ;'
1596 s3 = 'x = (1 , 2 ) ;'
1597 sm = dedent('''
1598 x = (
1599 a, b,
1600 )
1601 ''').strip()
1602 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1603 self._check_content(s1, t1, '()')
1604 self._check_content(s2, t2, '1 ,')
1605 self._check_content(s3, t3, '(1 , 2 )')
1606 self._check_end_pos(tm, 3, 1)
1607
1608 def test_attribute_spaces(self):
1609 s = 'func(x. y .z)'
1610 call = self._parse_value(s)
1611 self._check_content(s, call, s)
1612 self._check_content(s, call.args[0], 'x. y .z')
1613
1614 def test_displays(self):
1615 s1 = '[{}, {1, }, {1, 2,} ]'
1616 s2 = '{a: b, f (): g () ,}'
1617 c1 = self._parse_value(s1)
1618 c2 = self._parse_value(s2)
1619 self._check_content(s1, c1.elts[0], '{}')
1620 self._check_content(s1, c1.elts[1], '{1, }')
1621 self._check_content(s1, c1.elts[2], '{1, 2,}')
1622 self._check_content(s2, c2.keys[1], 'f ()')
1623 self._check_content(s2, c2.values[1], 'g ()')
1624
1625 def test_comprehensions(self):
1626 s = dedent('''
1627 x = [{x for x, y in stuff
1628 if cond.x} for stuff in things]
1629 ''').strip()
1630 cmp = self._parse_value(s)
1631 self._check_end_pos(cmp, 2, 37)
1632 self._check_content(s, cmp.generators[0].iter, 'things')
1633 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1634 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1635 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1636
1637 def test_yield_await(self):
1638 s = dedent('''
1639 async def f():
1640 yield x
1641 await y
1642 ''').strip()
1643 fdef = ast.parse(s).body[0]
1644 self._check_content(s, fdef.body[0].value, 'yield x')
1645 self._check_content(s, fdef.body[1].value, 'await y')
1646
1647 def test_source_segment_multi(self):
1648 s_orig = dedent('''
1649 x = (
1650 a, b,
1651 ) + ()
1652 ''').strip()
1653 s_tuple = dedent('''
1654 (
1655 a, b,
1656 )
1657 ''').strip()
1658 binop = self._parse_value(s_orig)
1659 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1660
1661 def test_source_segment_padded(self):
1662 s_orig = dedent('''
1663 class C:
1664 def fun(self) -> None:
1665 "ЖЖЖЖЖ"
1666 ''').strip()
1667 s_method = ' def fun(self) -> None:\n' \
1668 ' "ЖЖЖЖЖ"'
1669 cdef = ast.parse(s_orig).body[0]
1670 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1671 s_method)
1672
1673 def test_source_segment_endings(self):
1674 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1675 v, w, x, y, z = ast.parse(s).body
1676 self._check_content(s, v, 'v = 1')
1677 self._check_content(s, w, 'w = 1')
1678 self._check_content(s, x, 'x = 1')
1679 self._check_content(s, y, 'y = 1')
1680 self._check_content(s, z, 'z = 1')
1681
1682 def test_source_segment_tabs(self):
1683 s = dedent('''
1684 class C:
1685 \t\f def fun(self) -> None:
1686 \t\f pass
1687 ''').strip()
1688 s_method = ' \t\f def fun(self) -> None:\n' \
1689 ' \t\f pass'
1690
1691 cdef = ast.parse(s).body[0]
1692 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1693
1694
Miss Islington (bot)522a3942019-08-26 00:43:33 -07001695class NodeVisitorTests(unittest.TestCase):
1696 def test_old_constant_nodes(self):
1697 class Visitor(ast.NodeVisitor):
1698 def visit_Num(self, node):
1699 log.append((node.lineno, 'Num', node.n))
1700 def visit_Str(self, node):
1701 log.append((node.lineno, 'Str', node.s))
1702 def visit_Bytes(self, node):
1703 log.append((node.lineno, 'Bytes', node.s))
1704 def visit_NameConstant(self, node):
1705 log.append((node.lineno, 'NameConstant', node.value))
1706 def visit_Ellipsis(self, node):
1707 log.append((node.lineno, 'Ellipsis', ...))
1708 mod = ast.parse(dedent('''\
1709 i = 42
1710 f = 4.25
1711 c = 4.25j
1712 s = 'string'
1713 b = b'bytes'
1714 t = True
1715 n = None
1716 e = ...
1717 '''))
1718 visitor = Visitor()
1719 log = []
1720 with warnings.catch_warnings(record=True) as wlog:
1721 warnings.filterwarnings('always', '', PendingDeprecationWarning)
1722 visitor.visit(mod)
1723 self.assertEqual(log, [
1724 (1, 'Num', 42),
1725 (2, 'Num', 4.25),
1726 (3, 'Num', 4.25j),
1727 (4, 'Str', 'string'),
1728 (5, 'Bytes', b'bytes'),
1729 (6, 'NameConstant', True),
1730 (7, 'NameConstant', None),
1731 (8, 'Ellipsis', ...),
1732 ])
1733 self.assertEqual([str(w.message) for w in wlog], [
1734 'visit_Num is deprecated; add visit_Constant',
1735 'visit_Num is deprecated; add visit_Constant',
1736 'visit_Num is deprecated; add visit_Constant',
1737 'visit_Str is deprecated; add visit_Constant',
1738 'visit_Bytes is deprecated; add visit_Constant',
1739 'visit_NameConstant is deprecated; add visit_Constant',
1740 'visit_NameConstant is deprecated; add visit_Constant',
1741 'visit_Ellipsis is deprecated; add visit_Constant',
1742 ])
1743
1744
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001745def main():
1746 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001747 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001748 if sys.argv[1:] == ['-g']:
1749 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1750 (eval_tests, "eval")):
1751 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001752 for statement in statements:
1753 tree = ast.parse(statement, "?", kind)
1754 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001755 print("]")
1756 print("main()")
1757 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001758 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001759
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001760#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001761exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001762('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1763('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001764('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1765('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 -07001766('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1767('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 +01001768('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1769('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 -07001770('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 -08001771('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001772('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001773('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001774('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 -08001775('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001776('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001777('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1778('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1779('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 -07001780('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001781('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1782('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1783('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
1784('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1785('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 -07001786('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 -08001787('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1788('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1789('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1790('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1791('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1792('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001793('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001794('Module', [('Pass', (1, 0))], []),
1795('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1796('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1797('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)], []),
1798('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)], []),
1799('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)], []),
1800('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)]))], []),
1801('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)]))], []),
1802('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)]))], []),
1803('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)]))], []),
1804('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 +01001805('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)], []),
1806('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)], []),
1807('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 -07001808('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)]))], []),
1809('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 +01001810('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 -07001811('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)], []),
1812('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)], []),
1813('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 +01001814('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 +00001815('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 -07001816('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1817('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)], []),
1818('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)], []),
1819('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)], []),
1820('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1821('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)], []),
1822('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)], []),
1823('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)], []),
1824('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)], []),
1825('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 +00001826]
1827single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001828('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 +00001829]
1830eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001831('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001832('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1833('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1834('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001835('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001836('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001837('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001838('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1839('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001840('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)])),
1841('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)])),
1842('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)])),
1843('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)])),
1844('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)])),
1845('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)])),
1846('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)])),
1847('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)])),
1848('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)])),
1849('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)])),
1850('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 -07001851('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1852('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001853('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 -07001854('Expression', ('Constant', (1, 0), 10, None)),
1855('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001856('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1857('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 +00001858('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001859('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 -05001860('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001861('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1862('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 -05001863('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001864('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 +00001865]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001866main()