blob: b921f4a5d6826905ab8dfcea0fc214cc39547a66 [file] [log] [blame]
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001import ast
2import dis
Benjamin Peterson832bfe22011-08-09 16:15:04 -05003import os
4import sys
5import unittest
Miss Islington (bot)522a3942019-08-26 00:43:33 -07006import warnings
Benjamin Peterson9ed37432012-07-08 11:13:36 -07007import weakref
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00008from textwrap import dedent
Benjamin Peterson9ed37432012-07-08 11:13:36 -07009
10from test import support
Tim Peters400cbc32006-02-28 18:44:41 +000011
12def to_tuple(t):
Guido van Rossum3172c5d2007-10-16 18:12:55 +000013 if t is None or isinstance(t, (str, int, complex)):
Tim Peters400cbc32006-02-28 18:44:41 +000014 return t
15 elif isinstance(t, list):
16 return [to_tuple(e) for e in t]
17 result = [t.__class__.__name__]
Martin v. Löwis49c5da12006-03-01 22:49:05 +000018 if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
19 result.append((t.lineno, t.col_offset))
Tim Peters400cbc32006-02-28 18:44:41 +000020 if t._fields is None:
21 return tuple(result)
22 for f in t._fields:
23 result.append(to_tuple(getattr(t, f)))
24 return tuple(result)
25
Neal Norwitzee9b10a2008-03-31 05:29:39 +000026
Tim Peters400cbc32006-02-28 18:44:41 +000027# These tests are compiled through "exec"
Ezio Melotti85a86292013-08-17 16:57:41 +030028# There should be at least one test per statement
Tim Peters400cbc32006-02-28 18:44:41 +000029exec_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050030 # None
31 "None",
INADA Naokicb41b272017-02-23 00:31:59 +090032 # Module docstring
33 "'module docstring'",
Tim Peters400cbc32006-02-28 18:44:41 +000034 # FunctionDef
35 "def f(): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090036 # FunctionDef with docstring
37 "def f(): 'function docstring'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050038 # FunctionDef with arg
39 "def f(a): pass",
40 # FunctionDef with arg and default value
41 "def f(a=0): pass",
42 # FunctionDef with varargs
43 "def f(*args): pass",
44 # FunctionDef with kwargs
45 "def f(**kwargs): pass",
INADA Naokicb41b272017-02-23 00:31:59 +090046 # FunctionDef with all kind of args and docstring
47 "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): 'doc for f()'",
Tim Peters400cbc32006-02-28 18:44:41 +000048 # ClassDef
49 "class C:pass",
INADA Naokicb41b272017-02-23 00:31:59 +090050 # ClassDef with docstring
51 "class C: 'docstring for class C'",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -050052 # ClassDef, new style class
53 "class C(object): pass",
Tim Peters400cbc32006-02-28 18:44:41 +000054 # Return
55 "def f():return 1",
56 # Delete
57 "del v",
58 # Assign
59 "v = 1",
Serhiy Storchakab619b092018-11-27 09:40:29 +020060 "a,b = c",
61 "(a,b) = c",
62 "[a,b] = c",
Tim Peters400cbc32006-02-28 18:44:41 +000063 # AugAssign
64 "v += 1",
Tim Peters400cbc32006-02-28 18:44:41 +000065 # For
66 "for v in v:pass",
67 # While
68 "while v:pass",
69 # If
70 "if v:pass",
Miss Islington (bot)3b18b172019-12-13 08:21:54 -080071 # If-Elif
72 "if a:\n pass\nelif b:\n pass",
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -080073 # If-Elif-Else
74 "if a:\n pass\nelif b:\n pass\nelse:\n pass",
Benjamin Petersonaeabd5f2011-05-27 15:02:03 -050075 # With
76 "with x as y: pass",
77 "with x as y, z as q: pass",
Tim Peters400cbc32006-02-28 18:44:41 +000078 # Raise
Collin Winter828f04a2007-08-31 00:04:24 +000079 "raise Exception('string')",
Tim Peters400cbc32006-02-28 18:44:41 +000080 # TryExcept
81 "try:\n pass\nexcept Exception:\n pass",
82 # TryFinally
83 "try:\n pass\nfinally:\n pass",
84 # Assert
85 "assert v",
86 # Import
87 "import sys",
88 # ImportFrom
89 "from sys import v",
Tim Peters400cbc32006-02-28 18:44:41 +000090 # Global
91 "global v",
92 # Expr
93 "1",
94 # Pass,
95 "pass",
96 # Break
Yury Selivanovb3d53132015-09-01 16:10:49 -040097 "for v in v:break",
Tim Peters400cbc32006-02-28 18:44:41 +000098 # Continue
Yury Selivanovb3d53132015-09-01 16:10:49 -040099 "for v in v:continue",
Benjamin Peterson2e4b0e12009-09-11 22:36:20 +0000100 # for statements with naked tuples (see http://bugs.python.org/issue6704)
101 "for a,b in c: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200102 "for (a,b) in c: pass",
103 "for [a,b] in c: pass",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500104 # Multiline generator expression (test for .lineno & .col_offset)
105 """(
106 (
107 Aa
108 ,
109 Bb
110 )
111 for
112 Aa
113 ,
114 Bb in Cc
115 )""",
116 # dictcomp
117 "{a : b for w in x for m in p if g}",
118 # dictcomp with naked tuple
119 "{a : b for v,w in x}",
120 # setcomp
121 "{r for l in x if g}",
122 # setcomp with naked tuple
123 "{r for l,m in x}",
Yury Selivanov75445082015-05-11 22:57:16 -0400124 # AsyncFunctionDef
INADA Naokicb41b272017-02-23 00:31:59 +0900125 "async def f():\n 'async function'\n await something()",
Yury Selivanov75445082015-05-11 22:57:16 -0400126 # AsyncFor
127 "async def f():\n async for e in i: 1\n else: 2",
128 # AsyncWith
129 "async def f():\n async with a as b: 1",
Yury Selivanovb3d53132015-09-01 16:10:49 -0400130 # PEP 448: Additional Unpacking Generalizations
131 "{**{1:2}, 2:3}",
132 "{*{1, 2}, 3}",
Yury Selivanov52c4e7c2016-09-09 10:36:01 -0700133 # Asynchronous comprehensions
134 "async def f():\n [i async for b in c]",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200135 # Decorated FunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700136 "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200137 # Decorated AsyncFunctionDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700138 "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200139 # Decorated ClassDef
Miss Skeleton (bot)ba3a5662019-10-26 07:06:40 -0700140 "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200141 # Decorator with generator argument
142 "@deco(a for a in b)\ndef f(): pass",
Lysandros Nikolaou8b9cebc2020-02-08 01:21:38 +0100143 # Decorator with attribute
144 "@a.b.c\ndef f(): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000145 # Simple assignment expression
146 "(a := 1)",
Pablo Galindo2f58a842019-05-31 14:09:49 +0100147 # Positional-only arguments
148 "def f(a, /,): pass",
149 "def f(a, /, c, d, e): pass",
150 "def f(a, /, c, *, d, e): pass",
151 "def f(a, /, c, *, d, e, **kwargs): pass",
152 # Positional-only arguments with defaults
153 "def f(a=1, /,): pass",
154 "def f(a=1, /, b=2, c=4): pass",
155 "def f(a=1, /, b=2, *, c=4): pass",
156 "def f(a=1, /, b=2, *, c): pass",
157 "def f(a=1, /, b=2, *, c=4, **kwargs): pass",
158 "def f(a=1, /, b=2, *, c, **kwargs): pass",
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000159
Tim Peters400cbc32006-02-28 18:44:41 +0000160]
161
162# These are compiled through "single"
163# because of overlap with "eval", it just tests what
164# can't be tested with "eval"
165single_tests = [
166 "1+2"
167]
168
169# These are compiled through "eval"
170# It should test all expressions
171eval_tests = [
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500172 # None
173 "None",
Tim Peters400cbc32006-02-28 18:44:41 +0000174 # BoolOp
175 "a and b",
176 # BinOp
177 "a + b",
178 # UnaryOp
179 "not v",
180 # Lambda
181 "lambda:None",
182 # Dict
183 "{ 1:2 }",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500184 # Empty dict
185 "{}",
186 # Set
187 "{None,}",
188 # Multiline dict (test for .lineno & .col_offset)
189 """{
190 1
191 :
192 2
193 }""",
Tim Peters400cbc32006-02-28 18:44:41 +0000194 # ListComp
195 "[a for b in c if d]",
196 # GeneratorExp
197 "(a for b in c if d)",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200198 # Comprehensions with multiple for targets
199 "[(a,b) for a,b in c]",
200 "[(a,b) for (a,b) in c]",
201 "[(a,b) for [a,b] in c]",
202 "{(a,b) for a,b in c}",
203 "{(a,b) for (a,b) in c}",
204 "{(a,b) for [a,b] in c}",
205 "((a,b) for a,b in c)",
206 "((a,b) for (a,b) in c)",
207 "((a,b) for [a,b] in c)",
Tim Peters400cbc32006-02-28 18:44:41 +0000208 # Yield - yield expressions can't work outside a function
209 #
210 # Compare
211 "1 < 2 < 3",
212 # Call
213 "f(1,2,c=3,*d,**e)",
Pablo Galindob1f20442019-12-18 01:41:58 +0000214 # Call with multi-character starred
215 "f(*[0, 1])",
Serhiy Storchakab619b092018-11-27 09:40:29 +0200216 # Call with a generator argument
217 "f(a for a in b)",
Tim Peters400cbc32006-02-28 18:44:41 +0000218 # Num
Guido van Rossume2a383d2007-01-15 16:59:06 +0000219 "10",
Tim Peters400cbc32006-02-28 18:44:41 +0000220 # Str
221 "'string'",
222 # Attribute
223 "a.b",
224 # Subscript
225 "a[b:c]",
226 # Name
227 "v",
228 # List
229 "[1,2,3]",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500230 # Empty list
231 "[]",
Tim Peters400cbc32006-02-28 18:44:41 +0000232 # Tuple
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000233 "1,2,3",
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500234 # Tuple
235 "(1,2,3)",
236 # Empty tuple
237 "()",
Martin v. Löwis49c5da12006-03-01 22:49:05 +0000238 # Combination
239 "a.b.c.d(a.b[1:2])",
240
Tim Peters400cbc32006-02-28 18:44:41 +0000241]
242
243# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
244# excepthandler, arguments, keywords, alias
245
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000246class AST_Tests(unittest.TestCase):
Tim Peters400cbc32006-02-28 18:44:41 +0000247
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500248 def _assertTrueorder(self, ast_node, parent_pos):
Georg Brandl0c77a822008-06-10 16:37:50 +0000249 if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000250 return
Georg Brandl0c77a822008-06-10 16:37:50 +0000251 if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000252 node_pos = (ast_node.lineno, ast_node.col_offset)
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200253 self.assertGreaterEqual(node_pos, parent_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000254 parent_pos = (ast_node.lineno, ast_node.col_offset)
255 for name in ast_node._fields:
256 value = getattr(ast_node, name)
257 if isinstance(value, list):
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200258 first_pos = parent_pos
259 if value and name == 'decorator_list':
260 first_pos = (value[0].lineno, value[0].col_offset)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000261 for child in value:
Serhiy Storchaka95b6acf2018-10-30 13:16:02 +0200262 self._assertTrueorder(child, first_pos)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000263 elif value is not None:
Benjamin Peterson7a66fc22015-02-02 10:51:20 -0500264 self._assertTrueorder(value, parent_pos)
Tim Peters5ddfe412006-03-01 23:02:57 +0000265
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500266 def test_AST_objects(self):
267 x = ast.AST()
268 self.assertEqual(x._fields, ())
Benjamin Peterson7e0dbfb2012-03-12 09:46:44 -0700269 x.foobar = 42
270 self.assertEqual(x.foobar, 42)
271 self.assertEqual(x.__dict__["foobar"], 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500272
273 with self.assertRaises(AttributeError):
274 x.vararg
275
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500276 with self.assertRaises(TypeError):
277 # "_ast.AST constructor takes 0 positional arguments"
278 ast.AST(2)
279
Benjamin Peterson9ed37432012-07-08 11:13:36 -0700280 def test_AST_garbage_collection(self):
281 class X:
282 pass
283 a = ast.AST()
284 a.x = X()
285 a.x.a = a
286 ref = weakref.ref(a.x)
287 del a
288 support.gc_collect()
289 self.assertIsNone(ref())
290
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000291 def test_snippets(self):
292 for input, output, kind in ((exec_tests, exec_results, "exec"),
293 (single_tests, single_results, "single"),
294 (eval_tests, eval_results, "eval")):
295 for i, o in zip(input, output):
Yury Selivanovb3d53132015-09-01 16:10:49 -0400296 with self.subTest(action="parsing", input=i):
297 ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
298 self.assertEqual(to_tuple(ast_tree), o)
299 self._assertTrueorder(ast_tree, (0, 0))
Victor Stinner15a30952016-02-08 22:45:06 +0100300 with self.subTest(action="compiling", input=i, kind=kind):
301 compile(ast_tree, "?", kind)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000302
Pablo Galindo0c9258a2019-03-18 13:51:53 +0000303 def test_ast_validation(self):
304 # compile() is the only function that calls PyAST_Validate
305 snippets_to_validate = exec_tests + single_tests + eval_tests
306 for snippet in snippets_to_validate:
307 tree = ast.parse(snippet)
308 compile(tree, '<string>', 'exec')
309
Benjamin Peterson78565b22009-06-28 19:19:51 +0000310 def test_slice(self):
311 slc = ast.parse("x[::]").body[0].value.slice
312 self.assertIsNone(slc.upper)
313 self.assertIsNone(slc.lower)
314 self.assertIsNone(slc.step)
315
316 def test_from_import(self):
317 im = ast.parse("from . import y").body[0]
318 self.assertIsNone(im.module)
319
Benjamin Petersona4e4e352012-03-22 08:19:04 -0400320 def test_non_interned_future_from_ast(self):
321 mod = ast.parse("from __future__ import division")
322 self.assertIsInstance(mod.body[0], ast.ImportFrom)
323 mod.body[0].module = " __future__ ".strip()
324 compile(mod, "<test>", "exec")
325
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000326 def test_base_classes(self):
327 self.assertTrue(issubclass(ast.For, ast.stmt))
328 self.assertTrue(issubclass(ast.Name, ast.expr))
329 self.assertTrue(issubclass(ast.stmt, ast.AST))
330 self.assertTrue(issubclass(ast.expr, ast.AST))
331 self.assertTrue(issubclass(ast.comprehension, ast.AST))
332 self.assertTrue(issubclass(ast.Gt, ast.AST))
333
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500334 def test_field_attr_existence(self):
335 for name, item in ast.__dict__.items():
336 if isinstance(item, type) and name != 'AST' and name[0].isupper():
337 x = item()
338 if isinstance(x, ast.AST):
339 self.assertEqual(type(x._fields), tuple)
340
341 def test_arguments(self):
342 x = ast.arguments()
Miss Islington (bot)cf9a63c2019-07-14 16:49:52 -0700343 self.assertEqual(x._fields, ('posonlyargs', 'args', 'vararg', 'kwonlyargs',
344 'kw_defaults', 'kwarg', 'defaults'))
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500345
346 with self.assertRaises(AttributeError):
347 x.vararg
348
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100349 x = ast.arguments(*range(1, 8))
350 self.assertEqual(x.vararg, 3)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500351
352 def test_field_attr_writable(self):
353 x = ast.Num()
354 # We can assign to _fields
355 x._fields = 666
356 self.assertEqual(x._fields, 666)
357
358 def test_classattrs(self):
359 x = ast.Num()
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700360 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300361
362 with self.assertRaises(AttributeError):
363 x.value
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500364
365 with self.assertRaises(AttributeError):
366 x.n
367
368 x = ast.Num(42)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300369 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500370 self.assertEqual(x.n, 42)
371
372 with self.assertRaises(AttributeError):
373 x.lineno
374
375 with self.assertRaises(AttributeError):
376 x.foobar
377
378 x = ast.Num(lineno=2)
379 self.assertEqual(x.lineno, 2)
380
381 x = ast.Num(42, lineno=0)
382 self.assertEqual(x.lineno, 0)
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700383 self.assertEqual(x._fields, ('value', 'kind'))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300384 self.assertEqual(x.value, 42)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500385 self.assertEqual(x.n, 42)
386
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700387 self.assertRaises(TypeError, ast.Num, 1, None, 2)
388 self.assertRaises(TypeError, ast.Num, 1, None, 2, lineno=0)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500389
Miss Islington (bot)907ee1f2020-05-24 14:31:47 -0700390 # Arbitrary keyword arguments are supported
391 self.assertEqual(ast.Constant(1, foo='bar').foo, 'bar')
392 self.assertEqual(ast.Num(1, foo='bar').foo, 'bar')
393
394 with self.assertRaisesRegex(TypeError, "Num got multiple values for argument 'n'"):
395 ast.Num(1, n=2)
396 with self.assertRaisesRegex(TypeError, "Constant got multiple values for argument 'value'"):
397 ast.Constant(1, value=2)
398
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300399 self.assertEqual(ast.Num(42).n, 42)
400 self.assertEqual(ast.Num(4.25).n, 4.25)
401 self.assertEqual(ast.Num(4.25j).n, 4.25j)
402 self.assertEqual(ast.Str('42').s, '42')
403 self.assertEqual(ast.Bytes(b'42').s, b'42')
404 self.assertIs(ast.NameConstant(True).value, True)
405 self.assertIs(ast.NameConstant(False).value, False)
406 self.assertIs(ast.NameConstant(None).value, None)
407
408 self.assertEqual(ast.Constant(42).value, 42)
409 self.assertEqual(ast.Constant(4.25).value, 4.25)
410 self.assertEqual(ast.Constant(4.25j).value, 4.25j)
411 self.assertEqual(ast.Constant('42').value, '42')
412 self.assertEqual(ast.Constant(b'42').value, b'42')
413 self.assertIs(ast.Constant(True).value, True)
414 self.assertIs(ast.Constant(False).value, False)
415 self.assertIs(ast.Constant(None).value, None)
416 self.assertIs(ast.Constant(...).value, ...)
417
418 def test_realtype(self):
419 self.assertEqual(type(ast.Num(42)), ast.Constant)
420 self.assertEqual(type(ast.Num(4.25)), ast.Constant)
421 self.assertEqual(type(ast.Num(4.25j)), ast.Constant)
422 self.assertEqual(type(ast.Str('42')), ast.Constant)
423 self.assertEqual(type(ast.Bytes(b'42')), ast.Constant)
424 self.assertEqual(type(ast.NameConstant(True)), ast.Constant)
425 self.assertEqual(type(ast.NameConstant(False)), ast.Constant)
426 self.assertEqual(type(ast.NameConstant(None)), ast.Constant)
427 self.assertEqual(type(ast.Ellipsis()), ast.Constant)
428
429 def test_isinstance(self):
430 self.assertTrue(isinstance(ast.Num(42), ast.Num))
431 self.assertTrue(isinstance(ast.Num(4.2), ast.Num))
432 self.assertTrue(isinstance(ast.Num(4.2j), ast.Num))
433 self.assertTrue(isinstance(ast.Str('42'), ast.Str))
434 self.assertTrue(isinstance(ast.Bytes(b'42'), ast.Bytes))
435 self.assertTrue(isinstance(ast.NameConstant(True), ast.NameConstant))
436 self.assertTrue(isinstance(ast.NameConstant(False), ast.NameConstant))
437 self.assertTrue(isinstance(ast.NameConstant(None), ast.NameConstant))
438 self.assertTrue(isinstance(ast.Ellipsis(), ast.Ellipsis))
439
440 self.assertTrue(isinstance(ast.Constant(42), ast.Num))
441 self.assertTrue(isinstance(ast.Constant(4.2), ast.Num))
442 self.assertTrue(isinstance(ast.Constant(4.2j), ast.Num))
443 self.assertTrue(isinstance(ast.Constant('42'), ast.Str))
444 self.assertTrue(isinstance(ast.Constant(b'42'), ast.Bytes))
445 self.assertTrue(isinstance(ast.Constant(True), ast.NameConstant))
446 self.assertTrue(isinstance(ast.Constant(False), ast.NameConstant))
447 self.assertTrue(isinstance(ast.Constant(None), ast.NameConstant))
448 self.assertTrue(isinstance(ast.Constant(...), ast.Ellipsis))
449
450 self.assertFalse(isinstance(ast.Str('42'), ast.Num))
451 self.assertFalse(isinstance(ast.Num(42), ast.Str))
452 self.assertFalse(isinstance(ast.Str('42'), ast.Bytes))
453 self.assertFalse(isinstance(ast.Num(42), ast.NameConstant))
454 self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800455 self.assertFalse(isinstance(ast.NameConstant(True), ast.Num))
456 self.assertFalse(isinstance(ast.NameConstant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300457
458 self.assertFalse(isinstance(ast.Constant('42'), ast.Num))
459 self.assertFalse(isinstance(ast.Constant(42), ast.Str))
460 self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes))
461 self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant))
462 self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis))
Anthony Sottile74176222019-01-18 11:30:28 -0800463 self.assertFalse(isinstance(ast.Constant(True), ast.Num))
464 self.assertFalse(isinstance(ast.Constant(False), ast.Num))
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300465
466 self.assertFalse(isinstance(ast.Constant(), ast.Num))
467 self.assertFalse(isinstance(ast.Constant(), ast.Str))
468 self.assertFalse(isinstance(ast.Constant(), ast.Bytes))
469 self.assertFalse(isinstance(ast.Constant(), ast.NameConstant))
470 self.assertFalse(isinstance(ast.Constant(), ast.Ellipsis))
471
Serhiy Storchaka6015cc52018-10-28 13:43:03 +0200472 class S(str): pass
473 self.assertTrue(isinstance(ast.Constant(S('42')), ast.Str))
474 self.assertFalse(isinstance(ast.Constant(S('42')), ast.Num))
475
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300476 def test_subclasses(self):
477 class N(ast.Num):
478 def __init__(self, *args, **kwargs):
479 super().__init__(*args, **kwargs)
480 self.z = 'spam'
481 class N2(ast.Num):
482 pass
483
484 n = N(42)
485 self.assertEqual(n.n, 42)
486 self.assertEqual(n.z, 'spam')
487 self.assertEqual(type(n), N)
488 self.assertTrue(isinstance(n, N))
489 self.assertTrue(isinstance(n, ast.Num))
490 self.assertFalse(isinstance(n, N2))
491 self.assertFalse(isinstance(ast.Num(42), N))
492 n = N(n=42)
493 self.assertEqual(n.n, 42)
494 self.assertEqual(type(n), N)
495
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500496 def test_module(self):
497 body = [ast.Num(42)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800498 x = ast.Module(body, [])
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500499 self.assertEqual(x.body, body)
500
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000501 def test_nodeclasses(self):
Florent Xicluna992d9e02011-11-11 19:35:42 +0100502 # Zero arguments constructor explicitly allowed
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500503 x = ast.BinOp()
504 self.assertEqual(x._fields, ('left', 'op', 'right'))
505
506 # Random attribute allowed too
507 x.foobarbaz = 5
508 self.assertEqual(x.foobarbaz, 5)
509
510 n1 = ast.Num(1)
511 n3 = ast.Num(3)
512 addop = ast.Add()
513 x = ast.BinOp(n1, addop, n3)
514 self.assertEqual(x.left, n1)
515 self.assertEqual(x.op, addop)
516 self.assertEqual(x.right, n3)
Benjamin Peterson68b543a2011-06-27 17:51:18 -0500517
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500518 x = ast.BinOp(1, 2, 3)
519 self.assertEqual(x.left, 1)
520 self.assertEqual(x.op, 2)
521 self.assertEqual(x.right, 3)
522
Georg Brandl0c77a822008-06-10 16:37:50 +0000523 x = ast.BinOp(1, 2, 3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000524 self.assertEqual(x.left, 1)
525 self.assertEqual(x.op, 2)
526 self.assertEqual(x.right, 3)
527 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000528
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500529 # node raises exception when given too many arguments
530 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500531 # node raises exception when given too many arguments
532 self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000533
534 # can set attributes through kwargs too
Georg Brandl0c77a822008-06-10 16:37:50 +0000535 x = ast.BinOp(left=1, op=2, right=3, lineno=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000536 self.assertEqual(x.left, 1)
537 self.assertEqual(x.op, 2)
538 self.assertEqual(x.right, 3)
539 self.assertEqual(x.lineno, 0)
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000540
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500541 # Random kwargs also allowed
542 x = ast.BinOp(1, 2, 3, foobarbaz=42)
543 self.assertEqual(x.foobarbaz, 42)
544
545 def test_no_fields(self):
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000546 # this used to fail because Sub._fields was None
Georg Brandl0c77a822008-06-10 16:37:50 +0000547 x = ast.Sub()
Benjamin Peterson6ccfe852011-06-27 17:46:06 -0500548 self.assertEqual(x._fields, ())
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000549
550 def test_pickling(self):
551 import pickle
552 mods = [pickle]
553 try:
554 import cPickle
555 mods.append(cPickle)
556 except ImportError:
557 pass
558 protocols = [0, 1, 2]
559 for mod in mods:
560 for protocol in protocols:
561 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
562 ast2 = mod.loads(mod.dumps(ast, protocol))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000563 self.assertEqual(to_tuple(ast2), to_tuple(ast))
Neal Norwitzee9b10a2008-03-31 05:29:39 +0000564
Benjamin Peterson5b066812010-11-20 01:38:49 +0000565 def test_invalid_sum(self):
566 pos = dict(lineno=2, col_offset=3)
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800567 m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], [])
Benjamin Peterson5b066812010-11-20 01:38:49 +0000568 with self.assertRaises(TypeError) as cm:
569 compile(m, "<test>", "exec")
570 self.assertIn("but got <_ast.expr", str(cm.exception))
571
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500572 def test_invalid_identitifer(self):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800573 m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], [])
Benjamin Peterson2193d2b2011-07-22 10:50:23 -0500574 ast.fix_missing_locations(m)
575 with self.assertRaises(TypeError) as cm:
576 compile(m, "<test>", "exec")
577 self.assertIn("identifier must be of type str", str(cm.exception))
578
Mark Dickinsonded35ae2012-11-25 14:36:26 +0000579 def test_empty_yield_from(self):
580 # Issue 16546: yield from value is not optional.
581 empty_yield_from = ast.parse("def f():\n yield from g()")
582 empty_yield_from.body[0].body[0].value.value = None
583 with self.assertRaises(ValueError) as cm:
584 compile(empty_yield_from, "<test>", "exec")
585 self.assertIn("field value is required", str(cm.exception))
586
Oren Milman7dc46d82017-09-30 20:16:24 +0300587 @support.cpython_only
588 def test_issue31592(self):
589 # There shouldn't be an assertion failure in case of a bad
590 # unicodedata.normalize().
591 import unicodedata
592 def bad_normalize(*args):
593 return None
594 with support.swap_attr(unicodedata, 'normalize', bad_normalize):
595 self.assertRaises(TypeError, ast.parse, '\u03D5')
596
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700597 def test_issue18374_binop_col_offset(self):
598 tree = ast.parse('4+5+6+7')
599 parent_binop = tree.body[0].value
600 child_binop = parent_binop.left
601 grandchild_binop = child_binop.left
602 self.assertEqual(parent_binop.col_offset, 0)
603 self.assertEqual(parent_binop.end_col_offset, 7)
604 self.assertEqual(child_binop.col_offset, 0)
605 self.assertEqual(child_binop.end_col_offset, 5)
606 self.assertEqual(grandchild_binop.col_offset, 0)
607 self.assertEqual(grandchild_binop.end_col_offset, 3)
608
609 tree = ast.parse('4+5-\\\n 6-7')
610 parent_binop = tree.body[0].value
611 child_binop = parent_binop.left
612 grandchild_binop = child_binop.left
613 self.assertEqual(parent_binop.col_offset, 0)
614 self.assertEqual(parent_binop.lineno, 1)
615 self.assertEqual(parent_binop.end_col_offset, 4)
616 self.assertEqual(parent_binop.end_lineno, 2)
617
618 self.assertEqual(child_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700619 self.assertEqual(child_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700620 self.assertEqual(child_binop.end_col_offset, 2)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700621 self.assertEqual(child_binop.end_lineno, 2)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700622
623 self.assertEqual(grandchild_binop.col_offset, 0)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700624 self.assertEqual(grandchild_binop.lineno, 1)
Miss Islington (bot)c7be35c2019-07-08 14:41:34 -0700625 self.assertEqual(grandchild_binop.end_col_offset, 3)
Miss Islington (bot)68bd9c52019-07-09 06:28:57 -0700626 self.assertEqual(grandchild_binop.end_lineno, 1)
Georg Brandl0c77a822008-06-10 16:37:50 +0000627
Lysandros Nikolaou8b9cebc2020-02-08 01:21:38 +0100628 def test_issue39579_dotted_name_end_col_offset(self):
629 tree = ast.parse('@a.b.c\ndef f(): pass')
630 attr_b = tree.body[0].decorator_list[0].value
631 self.assertEqual(attr_b.end_col_offset, 4)
632
Shantanuf7ed4d42020-06-06 03:08:48 -0700633 def test_issue40614_feature_version(self):
634 ast.parse('f"{x=}"', feature_version=(3, 8))
635 with self.assertRaises(SyntaxError):
636 ast.parse('f"{x=}"', feature_version=(3, 7))
637
Miss Islington (bot)83a9ba42020-06-06 10:04:47 -0700638 def test_constant_as_name(self):
639 for constant in "True", "False", "None":
640 expr = ast.Expression(ast.Name(constant, ast.Load()))
641 ast.fix_missing_locations(expr)
642 with self.assertRaisesRegex(ValueError, f"Name node can't be used with '{constant}' constant"):
643 compile(expr, "<test>", "eval")
644
Shantanuf7ed4d42020-06-06 03:08:48 -0700645
Georg Brandl0c77a822008-06-10 16:37:50 +0000646class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700647 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000648
649 def test_parse(self):
650 a = ast.parse('foo(1 + 1)')
651 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
652 self.assertEqual(ast.dump(a), ast.dump(b))
653
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400654 def test_parse_in_error(self):
655 try:
656 1/0
657 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400658 with self.assertRaises(SyntaxError) as e:
659 ast.literal_eval(r"'\U'")
660 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400661
Georg Brandl0c77a822008-06-10 16:37:50 +0000662 def test_dump(self):
663 node = ast.parse('spam(eggs, "and cheese")')
664 self.assertEqual(ast.dump(node),
665 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700666 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800667 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000668 )
669 self.assertEqual(ast.dump(node, annotate_fields=False),
670 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700671 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000672 )
673 self.assertEqual(ast.dump(node, include_attributes=True),
674 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000675 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
676 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700677 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000678 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
679 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800680 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000681 )
682
Serhiy Storchaka097eae52019-08-29 10:50:28 +0300683 def test_dump_incomplete(self):
684 node = ast.Raise(lineno=3, col_offset=4)
685 self.assertEqual(ast.dump(node),
686 "Raise()"
687 )
688 self.assertEqual(ast.dump(node, include_attributes=True),
689 "Raise(lineno=3, col_offset=4)"
690 )
691 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
692 self.assertEqual(ast.dump(node),
693 "Raise(exc=Name(id='e', ctx=Load()))"
694 )
695 self.assertEqual(ast.dump(node, annotate_fields=False),
696 "Raise(Name('e', Load()))"
697 )
698 self.assertEqual(ast.dump(node, include_attributes=True),
699 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
700 )
701 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
702 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
703 )
704 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
705 self.assertEqual(ast.dump(node),
706 "Raise(cause=Name(id='e', ctx=Load()))"
707 )
708 self.assertEqual(ast.dump(node, annotate_fields=False),
709 "Raise(cause=Name('e', Load()))"
710 )
711
Georg Brandl0c77a822008-06-10 16:37:50 +0000712 def test_copy_location(self):
713 src = ast.parse('1 + 1', mode='eval')
714 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
715 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700716 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000717 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
718 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
719 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000720 )
721
722 def test_fix_missing_locations(self):
723 src = ast.parse('write("spam")')
724 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400725 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000726 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000727 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000728 self.assertEqual(ast.dump(src, include_attributes=True),
729 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000730 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700731 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000732 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
733 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
734 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
735 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
736 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
737 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800738 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
739 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000740 )
741
742 def test_increment_lineno(self):
743 src = ast.parse('1 + 1', mode='eval')
744 self.assertEqual(ast.increment_lineno(src, n=3), src)
745 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700746 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
747 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000748 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
749 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000750 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000751 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000752 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000753 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
754 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700755 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
756 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000757 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
758 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000759 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000760
761 def test_iter_fields(self):
762 node = ast.parse('foo()', mode='eval')
763 d = dict(ast.iter_fields(node.body))
764 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400765 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000766
767 def test_iter_child_nodes(self):
768 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
769 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
770 iterator = ast.iter_child_nodes(node.body)
771 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300772 self.assertEqual(next(iterator).value, 23)
773 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000774 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700775 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000776 )
777
778 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300779 node = ast.parse('"""line one\n line two"""')
780 self.assertEqual(ast.get_docstring(node),
781 'line one\nline two')
782
783 node = ast.parse('class foo:\n """line one\n line two"""')
784 self.assertEqual(ast.get_docstring(node.body[0]),
785 'line one\nline two')
786
Georg Brandl0c77a822008-06-10 16:37:50 +0000787 node = ast.parse('def foo():\n """line one\n line two"""')
788 self.assertEqual(ast.get_docstring(node.body[0]),
789 'line one\nline two')
790
Yury Selivanov2f07a662015-07-23 08:54:35 +0300791 node = ast.parse('async def foo():\n """spam\n ham"""')
792 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300793
794 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800795 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300796 node = ast.parse('x = "not docstring"')
797 self.assertIsNone(ast.get_docstring(node))
798 node = ast.parse('def foo():\n pass')
799 self.assertIsNone(ast.get_docstring(node))
800
801 node = ast.parse('class foo:\n pass')
802 self.assertIsNone(ast.get_docstring(node.body[0]))
803 node = ast.parse('class foo:\n x = "not docstring"')
804 self.assertIsNone(ast.get_docstring(node.body[0]))
805 node = ast.parse('class foo:\n def bar(self): pass')
806 self.assertIsNone(ast.get_docstring(node.body[0]))
807
808 node = ast.parse('def foo():\n pass')
809 self.assertIsNone(ast.get_docstring(node.body[0]))
810 node = ast.parse('def foo():\n x = "not docstring"')
811 self.assertIsNone(ast.get_docstring(node.body[0]))
812
813 node = ast.parse('async def foo():\n pass')
814 self.assertIsNone(ast.get_docstring(node.body[0]))
815 node = ast.parse('async def foo():\n x = "not docstring"')
816 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300817
Anthony Sottile995d9b92019-01-12 20:05:13 -0800818 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
819 node = ast.parse(
820 '"""line one\nline two"""\n\n'
821 'def foo():\n """line one\n line two"""\n\n'
822 ' def bar():\n """line one\n line two"""\n'
823 ' """line one\n line two"""\n'
824 '"""line one\nline two"""\n\n'
825 )
826 self.assertEqual(node.body[0].col_offset, 0)
827 self.assertEqual(node.body[0].lineno, 1)
828 self.assertEqual(node.body[1].body[0].col_offset, 2)
829 self.assertEqual(node.body[1].body[0].lineno, 5)
830 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
831 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
832 self.assertEqual(node.body[1].body[2].col_offset, 2)
833 self.assertEqual(node.body[1].body[2].lineno, 11)
834 self.assertEqual(node.body[2].col_offset, 0)
835 self.assertEqual(node.body[2].lineno, 13)
836
Miss Islington (bot)3b18b172019-12-13 08:21:54 -0800837 def test_elif_stmt_start_position(self):
838 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
839 elif_stmt = node.body[0].orelse[0]
840 self.assertEqual(elif_stmt.lineno, 3)
841 self.assertEqual(elif_stmt.col_offset, 0)
842
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -0800843 def test_elif_stmt_start_position_with_else(self):
844 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
845 elif_stmt = node.body[0].orelse[0]
846 self.assertEqual(elif_stmt.lineno, 3)
847 self.assertEqual(elif_stmt.col_offset, 0)
848
Pablo Galindob1f20442019-12-18 01:41:58 +0000849 def test_starred_expr_end_position_within_call(self):
850 node = ast.parse('f(*[0, 1])')
851 starred_expr = node.body[0].value.args[0]
852 self.assertEqual(starred_expr.end_lineno, 1)
853 self.assertEqual(starred_expr.end_col_offset, 9)
854
Georg Brandl0c77a822008-06-10 16:37:50 +0000855 def test_literal_eval(self):
856 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
857 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
858 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000859 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000860 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000861 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200862 self.assertEqual(ast.literal_eval('6'), 6)
863 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000864 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000865 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200866 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
867 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
868 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
869 self.assertRaises(ValueError, ast.literal_eval, '++6')
870 self.assertRaises(ValueError, ast.literal_eval, '+True')
871 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000872
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200873 def test_literal_eval_complex(self):
874 # Issue #4907
875 self.assertEqual(ast.literal_eval('6j'), 6j)
876 self.assertEqual(ast.literal_eval('-6j'), -6j)
877 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
878 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
879 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
880 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
881 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
882 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
883 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
884 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
885 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
886 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
887 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
888 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
889 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
890 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
891 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
892 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000893
Miss Islington (bot)2a3b8762020-05-05 13:00:57 -0700894 def test_literal_eval_malformed_dict_nodes(self):
895 malformed = ast.Dict(keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)])
896 self.assertRaises(ValueError, ast.literal_eval, malformed)
897 malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)])
898 self.assertRaises(ValueError, ast.literal_eval, malformed)
899
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100900 def test_bad_integer(self):
901 # issue13436: Bad error message with invalid numeric values
902 body = [ast.ImportFrom(module='time',
903 names=[ast.alias(name='sleep')],
904 level=None,
905 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800906 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100907 with self.assertRaises(ValueError) as cm:
908 compile(mod, 'test', 'exec')
909 self.assertIn("invalid integer value: None", str(cm.exception))
910
Berker Peksag0a5bd512016-04-29 19:50:02 +0300911 def test_level_as_none(self):
912 body = [ast.ImportFrom(module='time',
913 names=[ast.alias(name='sleep')],
914 level=None,
915 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800916 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300917 code = compile(mod, 'test', 'exec')
918 ns = {}
919 exec(code, ns)
920 self.assertIn('sleep', ns)
921
Georg Brandl0c77a822008-06-10 16:37:50 +0000922
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500923class ASTValidatorTests(unittest.TestCase):
924
925 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
926 mod.lineno = mod.col_offset = 0
927 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300928 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500929 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300930 else:
931 with self.assertRaises(exc) as cm:
932 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500933 self.assertIn(msg, str(cm.exception))
934
935 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800936 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500937 self.mod(mod, msg, exc=exc)
938
939 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800940 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500941 self.mod(mod, msg)
942
943 def test_module(self):
944 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
945 self.mod(m, "must have Load context", "single")
946 m = ast.Expression(ast.Name("x", ast.Store()))
947 self.mod(m, "must have Load context", "eval")
948
949 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100950 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700951 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500952 defaults=None, kw_defaults=None):
953 if args is None:
954 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100955 if posonlyargs is None:
956 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500957 if kwonlyargs is None:
958 kwonlyargs = []
959 if defaults is None:
960 defaults = []
961 if kw_defaults is None:
962 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100963 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
964 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500965 return fac(args)
966 args = [ast.arg("x", ast.Name("x", ast.Store()))]
967 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100968 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500969 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500970 check(arguments(defaults=[ast.Num(3)]),
971 "more positional defaults than args")
972 check(arguments(kw_defaults=[ast.Num(4)]),
973 "length of kwonlyargs is not the same as kw_defaults")
974 args = [ast.arg("x", ast.Name("x", ast.Load()))]
975 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
976 "must have Load context")
977 args = [ast.arg("a", ast.Name("x", ast.Load())),
978 ast.arg("b", ast.Name("y", ast.Load()))]
979 check(arguments(kwonlyargs=args,
980 kw_defaults=[None, ast.Name("x", ast.Store())]),
981 "must have Load context")
982
983 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100984 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300985 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500986 self.stmt(f, "empty body on FunctionDef")
987 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300988 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500989 self.stmt(f, "must have Load context")
990 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300991 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500992 self.stmt(f, "must have Load context")
993 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300994 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500995 self._check_arguments(fac, self.stmt)
996
997 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400998 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500999 if bases is None:
1000 bases = []
1001 if keywords is None:
1002 keywords = []
1003 if body is None:
1004 body = [ast.Pass()]
1005 if decorator_list is None:
1006 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001007 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001008 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001009 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1010 "must have Load context")
1011 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1012 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001013 self.stmt(cls(body=[]), "empty body on ClassDef")
1014 self.stmt(cls(body=[None]), "None disallowed")
1015 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1016 "must have Load context")
1017
1018 def test_delete(self):
1019 self.stmt(ast.Delete([]), "empty targets on Delete")
1020 self.stmt(ast.Delete([None]), "None disallowed")
1021 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1022 "must have Del context")
1023
1024 def test_assign(self):
1025 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1026 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1027 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1028 "must have Store context")
1029 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1030 ast.Name("y", ast.Store())),
1031 "must have Load context")
1032
1033 def test_augassign(self):
1034 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1035 ast.Name("y", ast.Load()))
1036 self.stmt(aug, "must have Store context")
1037 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1038 ast.Name("y", ast.Store()))
1039 self.stmt(aug, "must have Load context")
1040
1041 def test_for(self):
1042 x = ast.Name("x", ast.Store())
1043 y = ast.Name("y", ast.Load())
1044 p = ast.Pass()
1045 self.stmt(ast.For(x, y, [], []), "empty body on For")
1046 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1047 "must have Store context")
1048 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1049 "must have Load context")
1050 e = ast.Expr(ast.Name("x", ast.Store()))
1051 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1052 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1053
1054 def test_while(self):
1055 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1056 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1057 "must have Load context")
1058 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1059 [ast.Expr(ast.Name("x", ast.Store()))]),
1060 "must have Load context")
1061
1062 def test_if(self):
1063 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1064 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1065 self.stmt(i, "must have Load context")
1066 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1067 self.stmt(i, "must have Load context")
1068 i = ast.If(ast.Num(3), [ast.Pass()],
1069 [ast.Expr(ast.Name("x", ast.Store()))])
1070 self.stmt(i, "must have Load context")
1071
1072 def test_with(self):
1073 p = ast.Pass()
1074 self.stmt(ast.With([], [p]), "empty items on With")
1075 i = ast.withitem(ast.Num(3), None)
1076 self.stmt(ast.With([i], []), "empty body on With")
1077 i = ast.withitem(ast.Name("x", ast.Store()), None)
1078 self.stmt(ast.With([i], [p]), "must have Load context")
1079 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1080 self.stmt(ast.With([i], [p]), "must have Store context")
1081
1082 def test_raise(self):
1083 r = ast.Raise(None, ast.Num(3))
1084 self.stmt(r, "Raise with cause but no exception")
1085 r = ast.Raise(ast.Name("x", ast.Store()), None)
1086 self.stmt(r, "must have Load context")
1087 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1088 self.stmt(r, "must have Load context")
1089
1090 def test_try(self):
1091 p = ast.Pass()
1092 t = ast.Try([], [], [], [p])
1093 self.stmt(t, "empty body on Try")
1094 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1095 self.stmt(t, "must have Load context")
1096 t = ast.Try([p], [], [], [])
1097 self.stmt(t, "Try has neither except handlers nor finalbody")
1098 t = ast.Try([p], [], [p], [p])
1099 self.stmt(t, "Try has orelse but no except handlers")
1100 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1101 self.stmt(t, "empty body on ExceptHandler")
1102 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1103 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1104 e = [ast.ExceptHandler(None, "x", [p])]
1105 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1106 self.stmt(t, "must have Load context")
1107 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1108 self.stmt(t, "must have Load context")
1109
1110 def test_assert(self):
1111 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1112 "must have Load context")
1113 assrt = ast.Assert(ast.Name("x", ast.Load()),
1114 ast.Name("y", ast.Store()))
1115 self.stmt(assrt, "must have Load context")
1116
1117 def test_import(self):
1118 self.stmt(ast.Import([]), "empty names on Import")
1119
1120 def test_importfrom(self):
1121 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001122 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001123 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1124
1125 def test_global(self):
1126 self.stmt(ast.Global([]), "empty names on Global")
1127
1128 def test_nonlocal(self):
1129 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1130
1131 def test_expr(self):
1132 e = ast.Expr(ast.Name("x", ast.Store()))
1133 self.stmt(e, "must have Load context")
1134
1135 def test_boolop(self):
1136 b = ast.BoolOp(ast.And(), [])
1137 self.expr(b, "less than 2 values")
1138 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1139 self.expr(b, "less than 2 values")
1140 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1141 self.expr(b, "None disallowed")
1142 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1143 self.expr(b, "must have Load context")
1144
1145 def test_unaryop(self):
1146 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1147 self.expr(u, "must have Load context")
1148
1149 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001150 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001151 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1152 "must have Load context")
1153 def fac(args):
1154 return ast.Lambda(args, ast.Name("x", ast.Load()))
1155 self._check_arguments(fac, self.expr)
1156
1157 def test_ifexp(self):
1158 l = ast.Name("x", ast.Load())
1159 s = ast.Name("y", ast.Store())
1160 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001161 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001162
1163 def test_dict(self):
1164 d = ast.Dict([], [ast.Name("x", ast.Load())])
1165 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001166 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1167 self.expr(d, "None disallowed")
1168
1169 def test_set(self):
1170 self.expr(ast.Set([None]), "None disallowed")
1171 s = ast.Set([ast.Name("x", ast.Store())])
1172 self.expr(s, "must have Load context")
1173
1174 def _check_comprehension(self, fac):
1175 self.expr(fac([]), "comprehension with no generators")
1176 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001177 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001178 self.expr(fac([g]), "must have Store context")
1179 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001180 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001181 self.expr(fac([g]), "must have Load context")
1182 x = ast.Name("x", ast.Store())
1183 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001184 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001185 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001186 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001187 self.expr(fac([g]), "must have Load context")
1188
1189 def _simple_comp(self, fac):
1190 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001191 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001192 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1193 "must have Load context")
1194 def wrap(gens):
1195 return fac(ast.Name("x", ast.Store()), gens)
1196 self._check_comprehension(wrap)
1197
1198 def test_listcomp(self):
1199 self._simple_comp(ast.ListComp)
1200
1201 def test_setcomp(self):
1202 self._simple_comp(ast.SetComp)
1203
1204 def test_generatorexp(self):
1205 self._simple_comp(ast.GeneratorExp)
1206
1207 def test_dictcomp(self):
1208 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001209 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001210 c = ast.DictComp(ast.Name("x", ast.Store()),
1211 ast.Name("y", ast.Load()), [g])
1212 self.expr(c, "must have Load context")
1213 c = ast.DictComp(ast.Name("x", ast.Load()),
1214 ast.Name("y", ast.Store()), [g])
1215 self.expr(c, "must have Load context")
1216 def factory(comps):
1217 k = ast.Name("x", ast.Load())
1218 v = ast.Name("y", ast.Load())
1219 return ast.DictComp(k, v, comps)
1220 self._check_comprehension(factory)
1221
1222 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001223 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1224 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001225
1226 def test_compare(self):
1227 left = ast.Name("x", ast.Load())
1228 comp = ast.Compare(left, [ast.In()], [])
1229 self.expr(comp, "no comparators")
1230 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1231 self.expr(comp, "different number of comparators and operands")
1232 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001233 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001234 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001235 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001236
1237 def test_call(self):
1238 func = ast.Name("x", ast.Load())
1239 args = [ast.Name("y", ast.Load())]
1240 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001241 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001242 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001243 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001244 self.expr(call, "None disallowed")
1245 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001246 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001247 self.expr(call, "must have Load context")
1248
1249 def test_num(self):
1250 class subint(int):
1251 pass
1252 class subfloat(float):
1253 pass
1254 class subcomplex(complex):
1255 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001256 for obj in "0", "hello":
1257 self.expr(ast.Num(obj))
1258 for obj in subint(), subfloat(), subcomplex():
1259 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001260
1261 def test_attribute(self):
1262 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1263 self.expr(attr, "must have Load context")
1264
1265 def test_subscript(self):
1266 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1267 ast.Load())
1268 self.expr(sub, "must have Load context")
1269 x = ast.Name("x", ast.Load())
1270 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1271 ast.Load())
1272 self.expr(sub, "must have Load context")
1273 s = ast.Name("x", ast.Store())
1274 for args in (s, None, None), (None, s, None), (None, None, s):
1275 sl = ast.Slice(*args)
1276 self.expr(ast.Subscript(x, sl, ast.Load()),
1277 "must have Load context")
1278 sl = ast.ExtSlice([])
1279 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1280 sl = ast.ExtSlice([ast.Index(s)])
1281 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1282
1283 def test_starred(self):
1284 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1285 ast.Store())
1286 assign = ast.Assign([left], ast.Num(4))
1287 self.stmt(assign, "must have Store context")
1288
1289 def _sequence(self, fac):
1290 self.expr(fac([None], ast.Load()), "None disallowed")
1291 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1292 "must have Load context")
1293
1294 def test_list(self):
1295 self._sequence(ast.List)
1296
1297 def test_tuple(self):
1298 self._sequence(ast.Tuple)
1299
Benjamin Peterson442f2092012-12-06 17:41:04 -05001300 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001301 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001302
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001303 def test_stdlib_validates(self):
1304 stdlib = os.path.dirname(ast.__file__)
1305 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1306 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1307 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001308 with self.subTest(module):
1309 fn = os.path.join(stdlib, module)
1310 with open(fn, "r", encoding="utf-8") as fp:
1311 source = fp.read()
1312 mod = ast.parse(source, fn)
1313 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001314
1315
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001316class ConstantTests(unittest.TestCase):
1317 """Tests on the ast.Constant node type."""
1318
1319 def compile_constant(self, value):
1320 tree = ast.parse("x = 123")
1321
1322 node = tree.body[0].value
1323 new_node = ast.Constant(value=value)
1324 ast.copy_location(new_node, node)
1325 tree.body[0].value = new_node
1326
1327 code = compile(tree, "<string>", "exec")
1328
1329 ns = {}
1330 exec(code, ns)
1331 return ns['x']
1332
Victor Stinnerbe59d142016-01-27 00:39:12 +01001333 def test_validation(self):
1334 with self.assertRaises(TypeError) as cm:
1335 self.compile_constant([1, 2, 3])
1336 self.assertEqual(str(cm.exception),
1337 "got an invalid type in Constant: list")
1338
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001339 def test_singletons(self):
1340 for const in (None, False, True, Ellipsis, b'', frozenset()):
1341 with self.subTest(const=const):
1342 value = self.compile_constant(const)
1343 self.assertIs(value, const)
1344
1345 def test_values(self):
1346 nested_tuple = (1,)
1347 nested_frozenset = frozenset({1})
1348 for level in range(3):
1349 nested_tuple = (nested_tuple, 2)
1350 nested_frozenset = frozenset({nested_frozenset, 2})
1351 values = (123, 123.0, 123j,
1352 "unicode", b'bytes',
1353 tuple("tuple"), frozenset("frozenset"),
1354 nested_tuple, nested_frozenset)
1355 for value in values:
1356 with self.subTest(value=value):
1357 result = self.compile_constant(value)
1358 self.assertEqual(result, value)
1359
1360 def test_assign_to_constant(self):
1361 tree = ast.parse("x = 1")
1362
1363 target = tree.body[0].targets[0]
1364 new_target = ast.Constant(value=1)
1365 ast.copy_location(new_target, target)
1366 tree.body[0].targets[0] = new_target
1367
1368 with self.assertRaises(ValueError) as cm:
1369 compile(tree, "string", "exec")
1370 self.assertEqual(str(cm.exception),
1371 "expression which can't be assigned "
1372 "to in Store context")
1373
1374 def test_get_docstring(self):
1375 tree = ast.parse("'docstring'\nx = 1")
1376 self.assertEqual(ast.get_docstring(tree), 'docstring')
1377
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001378 def get_load_const(self, tree):
1379 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1380 # instructions
1381 co = compile(tree, '<string>', 'exec')
1382 consts = []
1383 for instr in dis.get_instructions(co):
1384 if instr.opname == 'LOAD_CONST':
1385 consts.append(instr.argval)
1386 return consts
1387
1388 @support.cpython_only
1389 def test_load_const(self):
1390 consts = [None,
1391 True, False,
1392 124,
1393 2.0,
1394 3j,
1395 "unicode",
1396 b'bytes',
1397 (1, 2, 3)]
1398
Victor Stinnera2724092016-02-08 18:17:58 +01001399 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1400 code += '\nx = ...'
1401 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001402
1403 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001404 self.assertEqual(self.get_load_const(tree),
1405 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001406
1407 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001408 for assign, const in zip(tree.body, consts):
1409 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001410 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001411 ast.copy_location(new_node, assign.value)
1412 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001413
Victor Stinnera2724092016-02-08 18:17:58 +01001414 self.assertEqual(self.get_load_const(tree),
1415 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001416
1417 def test_literal_eval(self):
1418 tree = ast.parse("1 + 2")
1419 binop = tree.body[0].value
1420
1421 new_left = ast.Constant(value=10)
1422 ast.copy_location(new_left, binop.left)
1423 binop.left = new_left
1424
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001425 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001426 ast.copy_location(new_right, binop.right)
1427 binop.right = new_right
1428
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001429 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001430
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001431 def test_string_kind(self):
1432 c = ast.parse('"x"', mode='eval').body
1433 self.assertEqual(c.value, "x")
1434 self.assertEqual(c.kind, None)
1435
1436 c = ast.parse('u"x"', mode='eval').body
1437 self.assertEqual(c.value, "x")
1438 self.assertEqual(c.kind, "u")
1439
1440 c = ast.parse('r"x"', mode='eval').body
1441 self.assertEqual(c.value, "x")
1442 self.assertEqual(c.kind, None)
1443
1444 c = ast.parse('b"x"', mode='eval').body
1445 self.assertEqual(c.value, b"x")
1446 self.assertEqual(c.kind, None)
1447
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001448
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001449class EndPositionTests(unittest.TestCase):
1450 """Tests for end position of AST nodes.
1451
1452 Testing end positions of nodes requires a bit of extra care
1453 because of how LL parsers work.
1454 """
1455 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1456 self.assertEqual(ast_node.end_lineno, end_lineno)
1457 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1458
1459 def _check_content(self, source, ast_node, content):
1460 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1461
1462 def _parse_value(self, s):
1463 # Use duck-typing to support both single expression
1464 # and a right hand side of an assignment statement.
1465 return ast.parse(s).body[0].value
1466
1467 def test_lambda(self):
1468 s = 'lambda x, *y: None'
1469 lam = self._parse_value(s)
1470 self._check_content(s, lam.body, 'None')
1471 self._check_content(s, lam.args.args[0], 'x')
1472 self._check_content(s, lam.args.vararg, 'y')
1473
1474 def test_func_def(self):
1475 s = dedent('''
1476 def func(x: int,
1477 *args: str,
1478 z: float = 0,
1479 **kwargs: Any) -> bool:
1480 return True
1481 ''').strip()
1482 fdef = ast.parse(s).body[0]
1483 self._check_end_pos(fdef, 5, 15)
1484 self._check_content(s, fdef.body[0], 'return True')
1485 self._check_content(s, fdef.args.args[0], 'x: int')
1486 self._check_content(s, fdef.args.args[0].annotation, 'int')
1487 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1488 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1489
1490 def test_call(self):
1491 s = 'func(x, y=2, **kw)'
1492 call = self._parse_value(s)
1493 self._check_content(s, call.func, 'func')
1494 self._check_content(s, call.keywords[0].value, '2')
1495 self._check_content(s, call.keywords[1].value, 'kw')
1496
1497 def test_call_noargs(self):
1498 s = 'x[0]()'
1499 call = self._parse_value(s)
1500 self._check_content(s, call.func, 'x[0]')
1501 self._check_end_pos(call, 1, 6)
1502
1503 def test_class_def(self):
1504 s = dedent('''
1505 class C(A, B):
1506 x: int = 0
1507 ''').strip()
1508 cdef = ast.parse(s).body[0]
1509 self._check_end_pos(cdef, 2, 14)
1510 self._check_content(s, cdef.bases[1], 'B')
1511 self._check_content(s, cdef.body[0], 'x: int = 0')
1512
1513 def test_class_kw(self):
1514 s = 'class S(metaclass=abc.ABCMeta): pass'
1515 cdef = ast.parse(s).body[0]
1516 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1517
1518 def test_multi_line_str(self):
1519 s = dedent('''
1520 x = """Some multi-line text.
1521
1522 It goes on starting from same indent."""
1523 ''').strip()
1524 assign = ast.parse(s).body[0]
1525 self._check_end_pos(assign, 3, 40)
1526 self._check_end_pos(assign.value, 3, 40)
1527
1528 def test_continued_str(self):
1529 s = dedent('''
1530 x = "first part" \\
1531 "second part"
1532 ''').strip()
1533 assign = ast.parse(s).body[0]
1534 self._check_end_pos(assign, 2, 13)
1535 self._check_end_pos(assign.value, 2, 13)
1536
1537 def test_suites(self):
1538 # We intentionally put these into the same string to check
1539 # that empty lines are not part of the suite.
1540 s = dedent('''
1541 while True:
1542 pass
1543
1544 if one():
1545 x = None
1546 elif other():
1547 y = None
1548 else:
1549 z = None
1550
1551 for x, y in stuff:
1552 assert True
1553
1554 try:
1555 raise RuntimeError
1556 except TypeError as e:
1557 pass
1558
1559 pass
1560 ''').strip()
1561 mod = ast.parse(s)
1562 while_loop = mod.body[0]
1563 if_stmt = mod.body[1]
1564 for_loop = mod.body[2]
1565 try_stmt = mod.body[3]
1566 pass_stmt = mod.body[4]
1567
1568 self._check_end_pos(while_loop, 2, 8)
1569 self._check_end_pos(if_stmt, 9, 12)
1570 self._check_end_pos(for_loop, 12, 15)
1571 self._check_end_pos(try_stmt, 17, 8)
1572 self._check_end_pos(pass_stmt, 19, 4)
1573
1574 self._check_content(s, while_loop.test, 'True')
1575 self._check_content(s, if_stmt.body[0], 'x = None')
1576 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1577 self._check_content(s, for_loop.target, 'x, y')
1578 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1579 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1580
1581 def test_fstring(self):
1582 s = 'x = f"abc {x + y} abc"'
1583 fstr = self._parse_value(s)
1584 binop = fstr.values[1].value
1585 self._check_content(s, binop, 'x + y')
1586
1587 def test_fstring_multi_line(self):
1588 s = dedent('''
1589 f"""Some multi-line text.
1590 {
1591 arg_one
1592 +
1593 arg_two
1594 }
1595 It goes on..."""
1596 ''').strip()
1597 fstr = self._parse_value(s)
1598 binop = fstr.values[1].value
1599 self._check_end_pos(binop, 5, 7)
1600 self._check_content(s, binop.left, 'arg_one')
1601 self._check_content(s, binop.right, 'arg_two')
1602
1603 def test_import_from_multi_line(self):
1604 s = dedent('''
1605 from x.y.z import (
1606 a, b, c as c
1607 )
1608 ''').strip()
1609 imp = ast.parse(s).body[0]
1610 self._check_end_pos(imp, 3, 1)
1611
1612 def test_slices(self):
1613 s1 = 'f()[1, 2] [0]'
1614 s2 = 'x[ a.b: c.d]'
1615 sm = dedent('''
1616 x[ a.b: f () ,
1617 g () : c.d
1618 ]
1619 ''').strip()
1620 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1621 self._check_content(s1, i1.value, 'f()[1, 2]')
1622 self._check_content(s1, i1.value.slice.value, '1, 2')
1623 self._check_content(s2, i2.slice.lower, 'a.b')
1624 self._check_content(s2, i2.slice.upper, 'c.d')
1625 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1626 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1627 self._check_end_pos(im, 3, 3)
1628
1629 def test_binop(self):
1630 s = dedent('''
1631 (1 * 2 + (3 ) +
1632 4
1633 )
1634 ''').strip()
1635 binop = self._parse_value(s)
1636 self._check_end_pos(binop, 2, 6)
1637 self._check_content(s, binop.right, '4')
1638 self._check_content(s, binop.left, '1 * 2 + (3 )')
1639 self._check_content(s, binop.left.right, '3')
1640
1641 def test_boolop(self):
1642 s = dedent('''
1643 if (one_condition and
1644 (other_condition or yet_another_one)):
1645 pass
1646 ''').strip()
1647 bop = ast.parse(s).body[0].test
1648 self._check_end_pos(bop, 2, 44)
1649 self._check_content(s, bop.values[1],
1650 'other_condition or yet_another_one')
1651
1652 def test_tuples(self):
1653 s1 = 'x = () ;'
1654 s2 = 'x = 1 , ;'
1655 s3 = 'x = (1 , 2 ) ;'
1656 sm = dedent('''
1657 x = (
1658 a, b,
1659 )
1660 ''').strip()
1661 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1662 self._check_content(s1, t1, '()')
1663 self._check_content(s2, t2, '1 ,')
1664 self._check_content(s3, t3, '(1 , 2 )')
1665 self._check_end_pos(tm, 3, 1)
1666
1667 def test_attribute_spaces(self):
1668 s = 'func(x. y .z)'
1669 call = self._parse_value(s)
1670 self._check_content(s, call, s)
1671 self._check_content(s, call.args[0], 'x. y .z')
1672
Miss Islington (bot)2076d4f2020-02-12 12:56:44 -08001673 def test_redundant_parenthesis(self):
1674 s = '( ( ( a + b ) ) )'
1675 v = ast.parse(s).body[0].value
1676 self.assertEqual(type(v).__name__, 'BinOp')
1677 self._check_content(s, v, 'a + b')
1678 s2 = 'await ' + s
1679 v = ast.parse(s2).body[0].value.value
1680 self.assertEqual(type(v).__name__, 'BinOp')
1681 self._check_content(s2, v, 'a + b')
1682
1683 def test_trailers_with_redundant_parenthesis(self):
1684 tests = (
1685 ('( ( ( a ) ) ) ( )', 'Call'),
1686 ('( ( ( a ) ) ) ( b )', 'Call'),
1687 ('( ( ( a ) ) ) [ b ]', 'Subscript'),
1688 ('( ( ( a ) ) ) . b', 'Attribute'),
1689 )
1690 for s, t in tests:
1691 with self.subTest(s):
1692 v = ast.parse(s).body[0].value
1693 self.assertEqual(type(v).__name__, t)
1694 self._check_content(s, v, s)
1695 s2 = 'await ' + s
1696 v = ast.parse(s2).body[0].value.value
1697 self.assertEqual(type(v).__name__, t)
1698 self._check_content(s2, v, s)
1699
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001700 def test_displays(self):
1701 s1 = '[{}, {1, }, {1, 2,} ]'
1702 s2 = '{a: b, f (): g () ,}'
1703 c1 = self._parse_value(s1)
1704 c2 = self._parse_value(s2)
1705 self._check_content(s1, c1.elts[0], '{}')
1706 self._check_content(s1, c1.elts[1], '{1, }')
1707 self._check_content(s1, c1.elts[2], '{1, 2,}')
1708 self._check_content(s2, c2.keys[1], 'f ()')
1709 self._check_content(s2, c2.values[1], 'g ()')
1710
1711 def test_comprehensions(self):
1712 s = dedent('''
1713 x = [{x for x, y in stuff
1714 if cond.x} for stuff in things]
1715 ''').strip()
1716 cmp = self._parse_value(s)
1717 self._check_end_pos(cmp, 2, 37)
1718 self._check_content(s, cmp.generators[0].iter, 'things')
1719 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1720 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1721 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1722
1723 def test_yield_await(self):
1724 s = dedent('''
1725 async def f():
1726 yield x
1727 await y
1728 ''').strip()
1729 fdef = ast.parse(s).body[0]
1730 self._check_content(s, fdef.body[0].value, 'yield x')
1731 self._check_content(s, fdef.body[1].value, 'await y')
1732
1733 def test_source_segment_multi(self):
1734 s_orig = dedent('''
1735 x = (
1736 a, b,
1737 ) + ()
1738 ''').strip()
1739 s_tuple = dedent('''
1740 (
1741 a, b,
1742 )
1743 ''').strip()
1744 binop = self._parse_value(s_orig)
1745 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1746
1747 def test_source_segment_padded(self):
1748 s_orig = dedent('''
1749 class C:
1750 def fun(self) -> None:
1751 "ЖЖЖЖЖ"
1752 ''').strip()
1753 s_method = ' def fun(self) -> None:\n' \
1754 ' "ЖЖЖЖЖ"'
1755 cdef = ast.parse(s_orig).body[0]
1756 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1757 s_method)
1758
1759 def test_source_segment_endings(self):
1760 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1761 v, w, x, y, z = ast.parse(s).body
1762 self._check_content(s, v, 'v = 1')
1763 self._check_content(s, w, 'w = 1')
1764 self._check_content(s, x, 'x = 1')
1765 self._check_content(s, y, 'y = 1')
1766 self._check_content(s, z, 'z = 1')
1767
1768 def test_source_segment_tabs(self):
1769 s = dedent('''
1770 class C:
1771 \t\f def fun(self) -> None:
1772 \t\f pass
1773 ''').strip()
1774 s_method = ' \t\f def fun(self) -> None:\n' \
1775 ' \t\f pass'
1776
1777 cdef = ast.parse(s).body[0]
1778 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1779
1780
Miss Islington (bot)522a3942019-08-26 00:43:33 -07001781class NodeVisitorTests(unittest.TestCase):
1782 def test_old_constant_nodes(self):
1783 class Visitor(ast.NodeVisitor):
1784 def visit_Num(self, node):
1785 log.append((node.lineno, 'Num', node.n))
1786 def visit_Str(self, node):
1787 log.append((node.lineno, 'Str', node.s))
1788 def visit_Bytes(self, node):
1789 log.append((node.lineno, 'Bytes', node.s))
1790 def visit_NameConstant(self, node):
1791 log.append((node.lineno, 'NameConstant', node.value))
1792 def visit_Ellipsis(self, node):
1793 log.append((node.lineno, 'Ellipsis', ...))
1794 mod = ast.parse(dedent('''\
1795 i = 42
1796 f = 4.25
1797 c = 4.25j
1798 s = 'string'
1799 b = b'bytes'
1800 t = True
1801 n = None
1802 e = ...
1803 '''))
1804 visitor = Visitor()
1805 log = []
1806 with warnings.catch_warnings(record=True) as wlog:
1807 warnings.filterwarnings('always', '', PendingDeprecationWarning)
1808 visitor.visit(mod)
1809 self.assertEqual(log, [
1810 (1, 'Num', 42),
1811 (2, 'Num', 4.25),
1812 (3, 'Num', 4.25j),
1813 (4, 'Str', 'string'),
1814 (5, 'Bytes', b'bytes'),
1815 (6, 'NameConstant', True),
1816 (7, 'NameConstant', None),
1817 (8, 'Ellipsis', ...),
1818 ])
1819 self.assertEqual([str(w.message) for w in wlog], [
1820 'visit_Num is deprecated; add visit_Constant',
1821 'visit_Num is deprecated; add visit_Constant',
1822 'visit_Num is deprecated; add visit_Constant',
1823 'visit_Str is deprecated; add visit_Constant',
1824 'visit_Bytes is deprecated; add visit_Constant',
1825 'visit_NameConstant is deprecated; add visit_Constant',
1826 'visit_NameConstant is deprecated; add visit_Constant',
1827 'visit_Ellipsis is deprecated; add visit_Constant',
1828 ])
1829
1830
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001831def main():
1832 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001833 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001834 if sys.argv[1:] == ['-g']:
1835 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1836 (eval_tests, "eval")):
1837 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001838 for statement in statements:
1839 tree = ast.parse(statement, "?", kind)
1840 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001841 print("]")
1842 print("main()")
1843 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001844 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001845
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001846#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001847exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001848('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1849('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001850('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1851('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 -07001852('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1853('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 +01001854('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1855('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 -07001856('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 -08001857('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001858('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001859('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001860('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 -08001861('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001862('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001863('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1864('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1865('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 -07001866('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001867('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1868('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1869('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
Miss Islington (bot)3b18b172019-12-13 08:21:54 -08001870('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [])])], []),
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -08001871('Module', [('If', (1, 0), ('Name', (1, 3), 'a', ('Load',)), [('Pass', (2, 2))], [('If', (3, 0), ('Name', (3, 5), 'b', ('Load',)), [('Pass', (4, 2))], [('Pass', (6, 2))])])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001872('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1873('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 -07001874('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 -08001875('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1876('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1877('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1878('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1879('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1880('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001881('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001882('Module', [('Pass', (1, 0))], []),
1883('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1884('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1885('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)], []),
1886('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)], []),
1887('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)], []),
1888('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)]))], []),
1889('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)]))], []),
1890('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)]))], []),
1891('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)]))], []),
1892('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 +01001893('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)], []),
1894('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)], []),
1895('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 -07001896('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)]))], []),
1897('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 +01001898('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 -07001899('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)], []),
1900('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)], []),
1901('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 +01001902('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)], []),
Lysandros Nikolaou8b9cebc2020-02-08 01:21:38 +01001903('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Attribute', (1, 1), ('Attribute', (1, 1), ('Name', (1, 1), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',))], None, None)], []),
Pablo Galindo0c9258a2019-03-18 13:51:53 +00001904('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 -07001905('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1906('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)], []),
1907('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)], []),
1908('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)], []),
1909('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1910('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)], []),
1911('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)], []),
1912('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)], []),
1913('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)], []),
1914('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 +00001915]
1916single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001917('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 +00001918]
1919eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001920('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001921('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1922('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1923('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001924('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001925('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001926('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001927('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1928('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001929('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)])),
1930('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)])),
1931('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)])),
1932('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)])),
1933('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)])),
1934('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)])),
1935('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)])),
1936('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)])),
1937('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)])),
1938('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)])),
1939('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 -07001940('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1941('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Constant', (1, 2), 1, None), ('Constant', (1, 4), 2, None), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Constant', (1, 8), 3, None)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
Pablo Galindob1f20442019-12-18 01:41:58 +00001942('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Starred', (1, 2), ('List', (1, 3), [('Constant', (1, 4), 0, None), ('Constant', (1, 7), 1, None)], ('Load',)), ('Load',))], [])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001943('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 -07001944('Expression', ('Constant', (1, 0), 10, None)),
1945('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001946('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1947('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 +00001948('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001949('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 -05001950('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001951('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1952('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 -05001953('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001954('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 +00001955]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001956main()