blob: 869346664499c11288057f45814892ed8912a576 [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
638
Georg Brandl0c77a822008-06-10 16:37:50 +0000639class ASTHelpers_Test(unittest.TestCase):
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700640 maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000641
642 def test_parse(self):
643 a = ast.parse('foo(1 + 1)')
644 b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
645 self.assertEqual(ast.dump(a), ast.dump(b))
646
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400647 def test_parse_in_error(self):
648 try:
649 1/0
650 except Exception:
Benjamin Petersonbd0df502012-09-02 15:04:51 -0400651 with self.assertRaises(SyntaxError) as e:
652 ast.literal_eval(r"'\U'")
653 self.assertIsNotNone(e.exception.__context__)
Benjamin Peterson2e2c9032012-09-02 14:23:15 -0400654
Georg Brandl0c77a822008-06-10 16:37:50 +0000655 def test_dump(self):
656 node = ast.parse('spam(eggs, "and cheese")')
657 self.assertEqual(ast.dump(node),
658 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700659 "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese', kind=None)], "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800660 "keywords=[]))], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000661 )
662 self.assertEqual(ast.dump(node, annotate_fields=False),
663 "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700664 "Constant('and cheese', None)], []))], [])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000665 )
666 self.assertEqual(ast.dump(node, include_attributes=True),
667 "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000668 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=4), "
669 "args=[Name(id='eggs', ctx=Load(), lineno=1, col_offset=5, "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700670 "end_lineno=1, end_col_offset=9), Constant(value='and cheese', kind=None, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000671 "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], "
672 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800673 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000674 )
675
Serhiy Storchaka097eae52019-08-29 10:50:28 +0300676 def test_dump_incomplete(self):
677 node = ast.Raise(lineno=3, col_offset=4)
678 self.assertEqual(ast.dump(node),
679 "Raise()"
680 )
681 self.assertEqual(ast.dump(node, include_attributes=True),
682 "Raise(lineno=3, col_offset=4)"
683 )
684 node = ast.Raise(exc=ast.Name(id='e', ctx=ast.Load()), lineno=3, col_offset=4)
685 self.assertEqual(ast.dump(node),
686 "Raise(exc=Name(id='e', ctx=Load()))"
687 )
688 self.assertEqual(ast.dump(node, annotate_fields=False),
689 "Raise(Name('e', Load()))"
690 )
691 self.assertEqual(ast.dump(node, include_attributes=True),
692 "Raise(exc=Name(id='e', ctx=Load()), lineno=3, col_offset=4)"
693 )
694 self.assertEqual(ast.dump(node, annotate_fields=False, include_attributes=True),
695 "Raise(Name('e', Load()), lineno=3, col_offset=4)"
696 )
697 node = ast.Raise(cause=ast.Name(id='e', ctx=ast.Load()))
698 self.assertEqual(ast.dump(node),
699 "Raise(cause=Name(id='e', ctx=Load()))"
700 )
701 self.assertEqual(ast.dump(node, annotate_fields=False),
702 "Raise(cause=Name('e', Load()))"
703 )
704
Georg Brandl0c77a822008-06-10 16:37:50 +0000705 def test_copy_location(self):
706 src = ast.parse('1 + 1', mode='eval')
707 src.body.right = ast.copy_location(ast.Num(2), src.body.right)
708 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700709 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=1, col_offset=0, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000710 'end_lineno=1, end_col_offset=1), op=Add(), right=Constant(value=2, '
711 'lineno=1, col_offset=4, end_lineno=1, end_col_offset=5), lineno=1, '
712 'col_offset=0, end_lineno=1, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000713 )
714
715 def test_fix_missing_locations(self):
716 src = ast.parse('write("spam")')
717 src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400718 [ast.Str('eggs')], [])))
Georg Brandl0c77a822008-06-10 16:37:50 +0000719 self.assertEqual(src, ast.fix_missing_locations(src))
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000720 self.maxDiff = None
Georg Brandl0c77a822008-06-10 16:37:50 +0000721 self.assertEqual(ast.dump(src, include_attributes=True),
722 "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000723 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=5), "
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700724 "args=[Constant(value='spam', kind=None, lineno=1, col_offset=6, end_lineno=1, "
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000725 "end_col_offset=12)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
726 "end_col_offset=13), lineno=1, col_offset=0, end_lineno=1, "
727 "end_col_offset=13), Expr(value=Call(func=Name(id='spam', ctx=Load(), "
728 "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), "
729 "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, "
730 "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, "
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800731 "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], "
732 "type_ignores=[])"
Georg Brandl0c77a822008-06-10 16:37:50 +0000733 )
734
735 def test_increment_lineno(self):
736 src = ast.parse('1 + 1', mode='eval')
737 self.assertEqual(ast.increment_lineno(src, n=3), src)
738 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700739 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
740 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000741 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
742 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl0c77a822008-06-10 16:37:50 +0000743 )
Georg Brandl619e7ba2011-01-09 07:38:51 +0000744 # issue10869: do not increment lineno of root twice
Georg Brandlefb69022011-01-09 07:50:48 +0000745 src = ast.parse('1 + 1', mode='eval')
Georg Brandl619e7ba2011-01-09 07:38:51 +0000746 self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
747 self.assertEqual(ast.dump(src, include_attributes=True),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700748 'Expression(body=BinOp(left=Constant(value=1, kind=None, lineno=4, col_offset=0, '
749 'end_lineno=4, end_col_offset=1), op=Add(), right=Constant(value=1, kind=None, '
Ivan Levkivskyi9932a222019-01-22 11:18:22 +0000750 'lineno=4, col_offset=4, end_lineno=4, end_col_offset=5), lineno=4, '
751 'col_offset=0, end_lineno=4, end_col_offset=5))'
Georg Brandl619e7ba2011-01-09 07:38:51 +0000752 )
Georg Brandl0c77a822008-06-10 16:37:50 +0000753
754 def test_iter_fields(self):
755 node = ast.parse('foo()', mode='eval')
756 d = dict(ast.iter_fields(node.body))
757 self.assertEqual(d.pop('func').id, 'foo')
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400758 self.assertEqual(d, {'keywords': [], 'args': []})
Georg Brandl0c77a822008-06-10 16:37:50 +0000759
760 def test_iter_child_nodes(self):
761 node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
762 self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
763 iterator = ast.iter_child_nodes(node.body)
764 self.assertEqual(next(iterator).id, 'spam')
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300765 self.assertEqual(next(iterator).value, 23)
766 self.assertEqual(next(iterator).value, 42)
Georg Brandl0c77a822008-06-10 16:37:50 +0000767 self.assertEqual(ast.dump(next(iterator)),
Guido van Rossum10f8ce62019-03-13 13:00:46 -0700768 "keyword(arg='eggs', value=Constant(value='leek', kind=None))"
Georg Brandl0c77a822008-06-10 16:37:50 +0000769 )
770
771 def test_get_docstring(self):
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300772 node = ast.parse('"""line one\n line two"""')
773 self.assertEqual(ast.get_docstring(node),
774 'line one\nline two')
775
776 node = ast.parse('class foo:\n """line one\n line two"""')
777 self.assertEqual(ast.get_docstring(node.body[0]),
778 'line one\nline two')
779
Georg Brandl0c77a822008-06-10 16:37:50 +0000780 node = ast.parse('def foo():\n """line one\n line two"""')
781 self.assertEqual(ast.get_docstring(node.body[0]),
782 'line one\nline two')
783
Yury Selivanov2f07a662015-07-23 08:54:35 +0300784 node = ast.parse('async def foo():\n """spam\n ham"""')
785 self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300786
787 def test_get_docstring_none(self):
Matthias Bussonnier41cea702017-02-23 22:44:19 -0800788 self.assertIsNone(ast.get_docstring(ast.parse('')))
Serhiy Storchaka08f127a2018-06-15 11:05:15 +0300789 node = ast.parse('x = "not docstring"')
790 self.assertIsNone(ast.get_docstring(node))
791 node = ast.parse('def foo():\n pass')
792 self.assertIsNone(ast.get_docstring(node))
793
794 node = ast.parse('class foo:\n pass')
795 self.assertIsNone(ast.get_docstring(node.body[0]))
796 node = ast.parse('class foo:\n x = "not docstring"')
797 self.assertIsNone(ast.get_docstring(node.body[0]))
798 node = ast.parse('class foo:\n def bar(self): pass')
799 self.assertIsNone(ast.get_docstring(node.body[0]))
800
801 node = ast.parse('def foo():\n pass')
802 self.assertIsNone(ast.get_docstring(node.body[0]))
803 node = ast.parse('def foo():\n x = "not docstring"')
804 self.assertIsNone(ast.get_docstring(node.body[0]))
805
806 node = ast.parse('async def foo():\n pass')
807 self.assertIsNone(ast.get_docstring(node.body[0]))
808 node = ast.parse('async def foo():\n x = "not docstring"')
809 self.assertIsNone(ast.get_docstring(node.body[0]))
Yury Selivanov2f07a662015-07-23 08:54:35 +0300810
Anthony Sottile995d9b92019-01-12 20:05:13 -0800811 def test_multi_line_docstring_col_offset_and_lineno_issue16806(self):
812 node = ast.parse(
813 '"""line one\nline two"""\n\n'
814 'def foo():\n """line one\n line two"""\n\n'
815 ' def bar():\n """line one\n line two"""\n'
816 ' """line one\n line two"""\n'
817 '"""line one\nline two"""\n\n'
818 )
819 self.assertEqual(node.body[0].col_offset, 0)
820 self.assertEqual(node.body[0].lineno, 1)
821 self.assertEqual(node.body[1].body[0].col_offset, 2)
822 self.assertEqual(node.body[1].body[0].lineno, 5)
823 self.assertEqual(node.body[1].body[1].body[0].col_offset, 4)
824 self.assertEqual(node.body[1].body[1].body[0].lineno, 9)
825 self.assertEqual(node.body[1].body[2].col_offset, 2)
826 self.assertEqual(node.body[1].body[2].lineno, 11)
827 self.assertEqual(node.body[2].col_offset, 0)
828 self.assertEqual(node.body[2].lineno, 13)
829
Miss Islington (bot)3b18b172019-12-13 08:21:54 -0800830 def test_elif_stmt_start_position(self):
831 node = ast.parse('if a:\n pass\nelif b:\n pass\n')
832 elif_stmt = node.body[0].orelse[0]
833 self.assertEqual(elif_stmt.lineno, 3)
834 self.assertEqual(elif_stmt.col_offset, 0)
835
Miss Islington (bot)ce333cd2019-12-14 02:43:42 -0800836 def test_elif_stmt_start_position_with_else(self):
837 node = ast.parse('if a:\n pass\nelif b:\n pass\nelse:\n pass\n')
838 elif_stmt = node.body[0].orelse[0]
839 self.assertEqual(elif_stmt.lineno, 3)
840 self.assertEqual(elif_stmt.col_offset, 0)
841
Pablo Galindob1f20442019-12-18 01:41:58 +0000842 def test_starred_expr_end_position_within_call(self):
843 node = ast.parse('f(*[0, 1])')
844 starred_expr = node.body[0].value.args[0]
845 self.assertEqual(starred_expr.end_lineno, 1)
846 self.assertEqual(starred_expr.end_col_offset, 9)
847
Georg Brandl0c77a822008-06-10 16:37:50 +0000848 def test_literal_eval(self):
849 self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
850 self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
851 self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
Benjamin Peterson3e742892010-07-11 12:59:24 +0000852 self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
Benjamin Peterson5ef96e52010-07-11 23:06:06 +0000853 self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
Georg Brandl0c77a822008-06-10 16:37:50 +0000854 self.assertRaises(ValueError, ast.literal_eval, 'foo()')
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200855 self.assertEqual(ast.literal_eval('6'), 6)
856 self.assertEqual(ast.literal_eval('+6'), 6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000857 self.assertEqual(ast.literal_eval('-6'), -6)
Raymond Hettingerbc959732010-10-08 00:47:45 +0000858 self.assertEqual(ast.literal_eval('3.25'), 3.25)
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200859 self.assertEqual(ast.literal_eval('+3.25'), 3.25)
860 self.assertEqual(ast.literal_eval('-3.25'), -3.25)
861 self.assertEqual(repr(ast.literal_eval('-0.0')), '-0.0')
862 self.assertRaises(ValueError, ast.literal_eval, '++6')
863 self.assertRaises(ValueError, ast.literal_eval, '+True')
864 self.assertRaises(ValueError, ast.literal_eval, '2+3')
Georg Brandl0c77a822008-06-10 16:37:50 +0000865
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +0200866 def test_literal_eval_complex(self):
867 # Issue #4907
868 self.assertEqual(ast.literal_eval('6j'), 6j)
869 self.assertEqual(ast.literal_eval('-6j'), -6j)
870 self.assertEqual(ast.literal_eval('6.75j'), 6.75j)
871 self.assertEqual(ast.literal_eval('-6.75j'), -6.75j)
872 self.assertEqual(ast.literal_eval('3+6j'), 3+6j)
873 self.assertEqual(ast.literal_eval('-3+6j'), -3+6j)
874 self.assertEqual(ast.literal_eval('3-6j'), 3-6j)
875 self.assertEqual(ast.literal_eval('-3-6j'), -3-6j)
876 self.assertEqual(ast.literal_eval('3.25+6.75j'), 3.25+6.75j)
877 self.assertEqual(ast.literal_eval('-3.25+6.75j'), -3.25+6.75j)
878 self.assertEqual(ast.literal_eval('3.25-6.75j'), 3.25-6.75j)
879 self.assertEqual(ast.literal_eval('-3.25-6.75j'), -3.25-6.75j)
880 self.assertEqual(ast.literal_eval('(3+6j)'), 3+6j)
881 self.assertRaises(ValueError, ast.literal_eval, '-6j+3')
882 self.assertRaises(ValueError, ast.literal_eval, '-6j+3j')
883 self.assertRaises(ValueError, ast.literal_eval, '3+-6j')
884 self.assertRaises(ValueError, ast.literal_eval, '3+(0+6j)')
885 self.assertRaises(ValueError, ast.literal_eval, '-(3+6j)')
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000886
Miss Islington (bot)2a3b8762020-05-05 13:00:57 -0700887 def test_literal_eval_malformed_dict_nodes(self):
888 malformed = ast.Dict(keys=[ast.Constant(1), ast.Constant(2)], values=[ast.Constant(3)])
889 self.assertRaises(ValueError, ast.literal_eval, malformed)
890 malformed = ast.Dict(keys=[ast.Constant(1)], values=[ast.Constant(2), ast.Constant(3)])
891 self.assertRaises(ValueError, ast.literal_eval, malformed)
892
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100893 def test_bad_integer(self):
894 # issue13436: Bad error message with invalid numeric values
895 body = [ast.ImportFrom(module='time',
896 names=[ast.alias(name='sleep')],
897 level=None,
898 lineno=None, col_offset=None)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800899 mod = ast.Module(body, [])
Amaury Forgeot d'Arc58e87612011-11-22 21:51:55 +0100900 with self.assertRaises(ValueError) as cm:
901 compile(mod, 'test', 'exec')
902 self.assertIn("invalid integer value: None", str(cm.exception))
903
Berker Peksag0a5bd512016-04-29 19:50:02 +0300904 def test_level_as_none(self):
905 body = [ast.ImportFrom(module='time',
906 names=[ast.alias(name='sleep')],
907 level=None,
908 lineno=0, col_offset=0)]
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800909 mod = ast.Module(body, [])
Berker Peksag0a5bd512016-04-29 19:50:02 +0300910 code = compile(mod, 'test', 'exec')
911 ns = {}
912 exec(code, ns)
913 self.assertIn('sleep', ns)
914
Georg Brandl0c77a822008-06-10 16:37:50 +0000915
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500916class ASTValidatorTests(unittest.TestCase):
917
918 def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
919 mod.lineno = mod.col_offset = 0
920 ast.fix_missing_locations(mod)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300921 if msg is None:
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500922 compile(mod, "<test>", mode)
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300923 else:
924 with self.assertRaises(exc) as cm:
925 compile(mod, "<test>", mode)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500926 self.assertIn(msg, str(cm.exception))
927
928 def expr(self, node, msg=None, *, exc=ValueError):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800929 mod = ast.Module([ast.Expr(node)], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500930 self.mod(mod, msg, exc=exc)
931
932 def stmt(self, stmt, msg=None):
Guido van Rossumdcfcd142019-01-31 03:40:27 -0800933 mod = ast.Module([stmt], [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500934 self.mod(mod, msg)
935
936 def test_module(self):
937 m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
938 self.mod(m, "must have Load context", "single")
939 m = ast.Expression(ast.Name("x", ast.Store()))
940 self.mod(m, "must have Load context", "eval")
941
942 def _check_arguments(self, fac, check):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100943 def arguments(args=None, posonlyargs=None, vararg=None,
Benjamin Petersoncda75be2013-03-18 10:48:58 -0700944 kwonlyargs=None, kwarg=None,
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500945 defaults=None, kw_defaults=None):
946 if args is None:
947 args = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100948 if posonlyargs is None:
949 posonlyargs = []
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500950 if kwonlyargs is None:
951 kwonlyargs = []
952 if defaults is None:
953 defaults = []
954 if kw_defaults is None:
955 kw_defaults = []
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100956 args = ast.arguments(args, posonlyargs, vararg, kwonlyargs,
957 kw_defaults, kwarg, defaults)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500958 return fac(args)
959 args = [ast.arg("x", ast.Name("x", ast.Store()))]
960 check(arguments(args=args), "must have Load context")
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100961 check(arguments(posonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500962 check(arguments(kwonlyargs=args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500963 check(arguments(defaults=[ast.Num(3)]),
964 "more positional defaults than args")
965 check(arguments(kw_defaults=[ast.Num(4)]),
966 "length of kwonlyargs is not the same as kw_defaults")
967 args = [ast.arg("x", ast.Name("x", ast.Load()))]
968 check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
969 "must have Load context")
970 args = [ast.arg("a", ast.Name("x", ast.Load())),
971 ast.arg("b", ast.Name("y", ast.Load()))]
972 check(arguments(kwonlyargs=args,
973 kw_defaults=[None, ast.Name("x", ast.Store())]),
974 "must have Load context")
975
976 def test_funcdef(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +0100977 a = ast.arguments([], [], None, [], [], None, [])
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300978 f = ast.FunctionDef("x", a, [], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500979 self.stmt(f, "empty body on FunctionDef")
980 f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300981 None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500982 self.stmt(f, "must have Load context")
983 f = ast.FunctionDef("x", a, [ast.Pass()], [],
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300984 ast.Name("x", ast.Store()))
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500985 self.stmt(f, "must have Load context")
986 def fac(args):
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +0300987 return ast.FunctionDef("x", args, [ast.Pass()], [], None)
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500988 self._check_arguments(fac, self.stmt)
989
990 def test_classdef(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400991 def cls(bases=None, keywords=None, body=None, decorator_list=None):
Benjamin Peterson832bfe22011-08-09 16:15:04 -0500992 if bases is None:
993 bases = []
994 if keywords is None:
995 keywords = []
996 if body is None:
997 body = [ast.Pass()]
998 if decorator_list is None:
999 decorator_list = []
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001000 return ast.ClassDef("myclass", bases, keywords,
Serhiy Storchaka73cbe7a2018-05-29 12:04:55 +03001001 body, decorator_list)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001002 self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
1003 "must have Load context")
1004 self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
1005 "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001006 self.stmt(cls(body=[]), "empty body on ClassDef")
1007 self.stmt(cls(body=[None]), "None disallowed")
1008 self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
1009 "must have Load context")
1010
1011 def test_delete(self):
1012 self.stmt(ast.Delete([]), "empty targets on Delete")
1013 self.stmt(ast.Delete([None]), "None disallowed")
1014 self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
1015 "must have Del context")
1016
1017 def test_assign(self):
1018 self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
1019 self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
1020 self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
1021 "must have Store context")
1022 self.stmt(ast.Assign([ast.Name("x", ast.Store())],
1023 ast.Name("y", ast.Store())),
1024 "must have Load context")
1025
1026 def test_augassign(self):
1027 aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
1028 ast.Name("y", ast.Load()))
1029 self.stmt(aug, "must have Store context")
1030 aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
1031 ast.Name("y", ast.Store()))
1032 self.stmt(aug, "must have Load context")
1033
1034 def test_for(self):
1035 x = ast.Name("x", ast.Store())
1036 y = ast.Name("y", ast.Load())
1037 p = ast.Pass()
1038 self.stmt(ast.For(x, y, [], []), "empty body on For")
1039 self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
1040 "must have Store context")
1041 self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
1042 "must have Load context")
1043 e = ast.Expr(ast.Name("x", ast.Store()))
1044 self.stmt(ast.For(x, y, [e], []), "must have Load context")
1045 self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
1046
1047 def test_while(self):
1048 self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
1049 self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
1050 "must have Load context")
1051 self.stmt(ast.While(ast.Num(3), [ast.Pass()],
1052 [ast.Expr(ast.Name("x", ast.Store()))]),
1053 "must have Load context")
1054
1055 def test_if(self):
1056 self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
1057 i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
1058 self.stmt(i, "must have Load context")
1059 i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
1060 self.stmt(i, "must have Load context")
1061 i = ast.If(ast.Num(3), [ast.Pass()],
1062 [ast.Expr(ast.Name("x", ast.Store()))])
1063 self.stmt(i, "must have Load context")
1064
1065 def test_with(self):
1066 p = ast.Pass()
1067 self.stmt(ast.With([], [p]), "empty items on With")
1068 i = ast.withitem(ast.Num(3), None)
1069 self.stmt(ast.With([i], []), "empty body on With")
1070 i = ast.withitem(ast.Name("x", ast.Store()), None)
1071 self.stmt(ast.With([i], [p]), "must have Load context")
1072 i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
1073 self.stmt(ast.With([i], [p]), "must have Store context")
1074
1075 def test_raise(self):
1076 r = ast.Raise(None, ast.Num(3))
1077 self.stmt(r, "Raise with cause but no exception")
1078 r = ast.Raise(ast.Name("x", ast.Store()), None)
1079 self.stmt(r, "must have Load context")
1080 r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
1081 self.stmt(r, "must have Load context")
1082
1083 def test_try(self):
1084 p = ast.Pass()
1085 t = ast.Try([], [], [], [p])
1086 self.stmt(t, "empty body on Try")
1087 t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
1088 self.stmt(t, "must have Load context")
1089 t = ast.Try([p], [], [], [])
1090 self.stmt(t, "Try has neither except handlers nor finalbody")
1091 t = ast.Try([p], [], [p], [p])
1092 self.stmt(t, "Try has orelse but no except handlers")
1093 t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
1094 self.stmt(t, "empty body on ExceptHandler")
1095 e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
1096 self.stmt(ast.Try([p], e, [], []), "must have Load context")
1097 e = [ast.ExceptHandler(None, "x", [p])]
1098 t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
1099 self.stmt(t, "must have Load context")
1100 t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
1101 self.stmt(t, "must have Load context")
1102
1103 def test_assert(self):
1104 self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
1105 "must have Load context")
1106 assrt = ast.Assert(ast.Name("x", ast.Load()),
1107 ast.Name("y", ast.Store()))
1108 self.stmt(assrt, "must have Load context")
1109
1110 def test_import(self):
1111 self.stmt(ast.Import([]), "empty names on Import")
1112
1113 def test_importfrom(self):
1114 imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
Serhiy Storchaka7de28402016-06-27 23:40:43 +03001115 self.stmt(imp, "Negative ImportFrom level")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001116 self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
1117
1118 def test_global(self):
1119 self.stmt(ast.Global([]), "empty names on Global")
1120
1121 def test_nonlocal(self):
1122 self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
1123
1124 def test_expr(self):
1125 e = ast.Expr(ast.Name("x", ast.Store()))
1126 self.stmt(e, "must have Load context")
1127
1128 def test_boolop(self):
1129 b = ast.BoolOp(ast.And(), [])
1130 self.expr(b, "less than 2 values")
1131 b = ast.BoolOp(ast.And(), [ast.Num(3)])
1132 self.expr(b, "less than 2 values")
1133 b = ast.BoolOp(ast.And(), [ast.Num(4), None])
1134 self.expr(b, "None disallowed")
1135 b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
1136 self.expr(b, "must have Load context")
1137
1138 def test_unaryop(self):
1139 u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
1140 self.expr(u, "must have Load context")
1141
1142 def test_lambda(self):
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001143 a = ast.arguments([], [], None, [], [], None, [])
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001144 self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
1145 "must have Load context")
1146 def fac(args):
1147 return ast.Lambda(args, ast.Name("x", ast.Load()))
1148 self._check_arguments(fac, self.expr)
1149
1150 def test_ifexp(self):
1151 l = ast.Name("x", ast.Load())
1152 s = ast.Name("y", ast.Store())
1153 for args in (s, l, l), (l, s, l), (l, l, s):
Benjamin Peterson71ce8972011-08-09 16:17:12 -05001154 self.expr(ast.IfExp(*args), "must have Load context")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001155
1156 def test_dict(self):
1157 d = ast.Dict([], [ast.Name("x", ast.Load())])
1158 self.expr(d, "same number of keys as values")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001159 d = ast.Dict([ast.Name("x", ast.Load())], [None])
1160 self.expr(d, "None disallowed")
1161
1162 def test_set(self):
1163 self.expr(ast.Set([None]), "None disallowed")
1164 s = ast.Set([ast.Name("x", ast.Store())])
1165 self.expr(s, "must have Load context")
1166
1167 def _check_comprehension(self, fac):
1168 self.expr(fac([]), "comprehension with no generators")
1169 g = ast.comprehension(ast.Name("x", ast.Load()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001170 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001171 self.expr(fac([g]), "must have Store context")
1172 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001173 ast.Name("x", ast.Store()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001174 self.expr(fac([g]), "must have Load context")
1175 x = ast.Name("x", ast.Store())
1176 y = ast.Name("y", ast.Load())
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001177 g = ast.comprehension(x, y, [None], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001178 self.expr(fac([g]), "None disallowed")
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001179 g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001180 self.expr(fac([g]), "must have Load context")
1181
1182 def _simple_comp(self, fac):
1183 g = ast.comprehension(ast.Name("x", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001184 ast.Name("x", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001185 self.expr(fac(ast.Name("x", ast.Store()), [g]),
1186 "must have Load context")
1187 def wrap(gens):
1188 return fac(ast.Name("x", ast.Store()), gens)
1189 self._check_comprehension(wrap)
1190
1191 def test_listcomp(self):
1192 self._simple_comp(ast.ListComp)
1193
1194 def test_setcomp(self):
1195 self._simple_comp(ast.SetComp)
1196
1197 def test_generatorexp(self):
1198 self._simple_comp(ast.GeneratorExp)
1199
1200 def test_dictcomp(self):
1201 g = ast.comprehension(ast.Name("y", ast.Store()),
Yury Selivanov52c4e7c2016-09-09 10:36:01 -07001202 ast.Name("p", ast.Load()), [], 0)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001203 c = ast.DictComp(ast.Name("x", ast.Store()),
1204 ast.Name("y", ast.Load()), [g])
1205 self.expr(c, "must have Load context")
1206 c = ast.DictComp(ast.Name("x", ast.Load()),
1207 ast.Name("y", ast.Store()), [g])
1208 self.expr(c, "must have Load context")
1209 def factory(comps):
1210 k = ast.Name("x", ast.Load())
1211 v = ast.Name("y", ast.Load())
1212 return ast.DictComp(k, v, comps)
1213 self._check_comprehension(factory)
1214
1215 def test_yield(self):
Benjamin Peterson527c6222012-01-14 08:58:23 -05001216 self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
1217 self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001218
1219 def test_compare(self):
1220 left = ast.Name("x", ast.Load())
1221 comp = ast.Compare(left, [ast.In()], [])
1222 self.expr(comp, "no comparators")
1223 comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
1224 self.expr(comp, "different number of comparators and operands")
1225 comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001226 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001227 comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001228 self.expr(comp)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001229
1230 def test_call(self):
1231 func = ast.Name("x", ast.Load())
1232 args = [ast.Name("y", ast.Load())]
1233 keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001234 call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001235 self.expr(call, "must have Load context")
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001236 call = ast.Call(func, [None], keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001237 self.expr(call, "None disallowed")
1238 bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
Benjamin Peterson025e9eb2015-05-05 20:16:41 -04001239 call = ast.Call(func, args, bad_keywords)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001240 self.expr(call, "must have Load context")
1241
1242 def test_num(self):
1243 class subint(int):
1244 pass
1245 class subfloat(float):
1246 pass
1247 class subcomplex(complex):
1248 pass
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001249 for obj in "0", "hello":
1250 self.expr(ast.Num(obj))
1251 for obj in subint(), subfloat(), subcomplex():
1252 self.expr(ast.Num(obj), "invalid type", exc=TypeError)
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001253
1254 def test_attribute(self):
1255 attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
1256 self.expr(attr, "must have Load context")
1257
1258 def test_subscript(self):
1259 sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
1260 ast.Load())
1261 self.expr(sub, "must have Load context")
1262 x = ast.Name("x", ast.Load())
1263 sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
1264 ast.Load())
1265 self.expr(sub, "must have Load context")
1266 s = ast.Name("x", ast.Store())
1267 for args in (s, None, None), (None, s, None), (None, None, s):
1268 sl = ast.Slice(*args)
1269 self.expr(ast.Subscript(x, sl, ast.Load()),
1270 "must have Load context")
1271 sl = ast.ExtSlice([])
1272 self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
1273 sl = ast.ExtSlice([ast.Index(s)])
1274 self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
1275
1276 def test_starred(self):
1277 left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
1278 ast.Store())
1279 assign = ast.Assign([left], ast.Num(4))
1280 self.stmt(assign, "must have Store context")
1281
1282 def _sequence(self, fac):
1283 self.expr(fac([None], ast.Load()), "None disallowed")
1284 self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
1285 "must have Load context")
1286
1287 def test_list(self):
1288 self._sequence(ast.List)
1289
1290 def test_tuple(self):
1291 self._sequence(ast.Tuple)
1292
Benjamin Peterson442f2092012-12-06 17:41:04 -05001293 def test_nameconstant(self):
Serhiy Storchaka3f228112018-09-27 17:42:37 +03001294 self.expr(ast.NameConstant(4))
Benjamin Peterson442f2092012-12-06 17:41:04 -05001295
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001296 def test_stdlib_validates(self):
1297 stdlib = os.path.dirname(ast.__file__)
1298 tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
1299 tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
1300 for module in tests:
Serhiy Storchaka3bcbedc2019-01-18 07:47:48 +02001301 with self.subTest(module):
1302 fn = os.path.join(stdlib, module)
1303 with open(fn, "r", encoding="utf-8") as fp:
1304 source = fp.read()
1305 mod = ast.parse(source, fn)
1306 compile(mod, fn, "exec")
Benjamin Peterson832bfe22011-08-09 16:15:04 -05001307
1308
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001309class ConstantTests(unittest.TestCase):
1310 """Tests on the ast.Constant node type."""
1311
1312 def compile_constant(self, value):
1313 tree = ast.parse("x = 123")
1314
1315 node = tree.body[0].value
1316 new_node = ast.Constant(value=value)
1317 ast.copy_location(new_node, node)
1318 tree.body[0].value = new_node
1319
1320 code = compile(tree, "<string>", "exec")
1321
1322 ns = {}
1323 exec(code, ns)
1324 return ns['x']
1325
Victor Stinnerbe59d142016-01-27 00:39:12 +01001326 def test_validation(self):
1327 with self.assertRaises(TypeError) as cm:
1328 self.compile_constant([1, 2, 3])
1329 self.assertEqual(str(cm.exception),
1330 "got an invalid type in Constant: list")
1331
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001332 def test_singletons(self):
1333 for const in (None, False, True, Ellipsis, b'', frozenset()):
1334 with self.subTest(const=const):
1335 value = self.compile_constant(const)
1336 self.assertIs(value, const)
1337
1338 def test_values(self):
1339 nested_tuple = (1,)
1340 nested_frozenset = frozenset({1})
1341 for level in range(3):
1342 nested_tuple = (nested_tuple, 2)
1343 nested_frozenset = frozenset({nested_frozenset, 2})
1344 values = (123, 123.0, 123j,
1345 "unicode", b'bytes',
1346 tuple("tuple"), frozenset("frozenset"),
1347 nested_tuple, nested_frozenset)
1348 for value in values:
1349 with self.subTest(value=value):
1350 result = self.compile_constant(value)
1351 self.assertEqual(result, value)
1352
1353 def test_assign_to_constant(self):
1354 tree = ast.parse("x = 1")
1355
1356 target = tree.body[0].targets[0]
1357 new_target = ast.Constant(value=1)
1358 ast.copy_location(new_target, target)
1359 tree.body[0].targets[0] = new_target
1360
1361 with self.assertRaises(ValueError) as cm:
1362 compile(tree, "string", "exec")
1363 self.assertEqual(str(cm.exception),
1364 "expression which can't be assigned "
1365 "to in Store context")
1366
1367 def test_get_docstring(self):
1368 tree = ast.parse("'docstring'\nx = 1")
1369 self.assertEqual(ast.get_docstring(tree), 'docstring')
1370
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001371 def get_load_const(self, tree):
1372 # Compile to bytecode, disassemble and get parameter of LOAD_CONST
1373 # instructions
1374 co = compile(tree, '<string>', 'exec')
1375 consts = []
1376 for instr in dis.get_instructions(co):
1377 if instr.opname == 'LOAD_CONST':
1378 consts.append(instr.argval)
1379 return consts
1380
1381 @support.cpython_only
1382 def test_load_const(self):
1383 consts = [None,
1384 True, False,
1385 124,
1386 2.0,
1387 3j,
1388 "unicode",
1389 b'bytes',
1390 (1, 2, 3)]
1391
Victor Stinnera2724092016-02-08 18:17:58 +01001392 code = '\n'.join(['x={!r}'.format(const) for const in consts])
1393 code += '\nx = ...'
1394 consts.extend((Ellipsis, None))
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001395
1396 tree = ast.parse(code)
Victor Stinnera2724092016-02-08 18:17:58 +01001397 self.assertEqual(self.get_load_const(tree),
1398 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001399
1400 # Replace expression nodes with constants
Victor Stinnera2724092016-02-08 18:17:58 +01001401 for assign, const in zip(tree.body, consts):
1402 assert isinstance(assign, ast.Assign), ast.dump(assign)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001403 new_node = ast.Constant(value=const)
Victor Stinnera2724092016-02-08 18:17:58 +01001404 ast.copy_location(new_node, assign.value)
1405 assign.value = new_node
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001406
Victor Stinnera2724092016-02-08 18:17:58 +01001407 self.assertEqual(self.get_load_const(tree),
1408 consts)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001409
1410 def test_literal_eval(self):
1411 tree = ast.parse("1 + 2")
1412 binop = tree.body[0].value
1413
1414 new_left = ast.Constant(value=10)
1415 ast.copy_location(new_left, binop.left)
1416 binop.left = new_left
1417
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001418 new_right = ast.Constant(value=20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001419 ast.copy_location(new_right, binop.right)
1420 binop.right = new_right
1421
Serhiy Storchakad8ac4d12018-01-04 11:15:39 +02001422 self.assertEqual(ast.literal_eval(binop), 10+20j)
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001423
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001424 def test_string_kind(self):
1425 c = ast.parse('"x"', mode='eval').body
1426 self.assertEqual(c.value, "x")
1427 self.assertEqual(c.kind, None)
1428
1429 c = ast.parse('u"x"', mode='eval').body
1430 self.assertEqual(c.value, "x")
1431 self.assertEqual(c.kind, "u")
1432
1433 c = ast.parse('r"x"', mode='eval').body
1434 self.assertEqual(c.value, "x")
1435 self.assertEqual(c.kind, None)
1436
1437 c = ast.parse('b"x"', mode='eval').body
1438 self.assertEqual(c.value, b"x")
1439 self.assertEqual(c.kind, None)
1440
Victor Stinnerf2c1aa12016-01-26 00:40:57 +01001441
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001442class EndPositionTests(unittest.TestCase):
1443 """Tests for end position of AST nodes.
1444
1445 Testing end positions of nodes requires a bit of extra care
1446 because of how LL parsers work.
1447 """
1448 def _check_end_pos(self, ast_node, end_lineno, end_col_offset):
1449 self.assertEqual(ast_node.end_lineno, end_lineno)
1450 self.assertEqual(ast_node.end_col_offset, end_col_offset)
1451
1452 def _check_content(self, source, ast_node, content):
1453 self.assertEqual(ast.get_source_segment(source, ast_node), content)
1454
1455 def _parse_value(self, s):
1456 # Use duck-typing to support both single expression
1457 # and a right hand side of an assignment statement.
1458 return ast.parse(s).body[0].value
1459
1460 def test_lambda(self):
1461 s = 'lambda x, *y: None'
1462 lam = self._parse_value(s)
1463 self._check_content(s, lam.body, 'None')
1464 self._check_content(s, lam.args.args[0], 'x')
1465 self._check_content(s, lam.args.vararg, 'y')
1466
1467 def test_func_def(self):
1468 s = dedent('''
1469 def func(x: int,
1470 *args: str,
1471 z: float = 0,
1472 **kwargs: Any) -> bool:
1473 return True
1474 ''').strip()
1475 fdef = ast.parse(s).body[0]
1476 self._check_end_pos(fdef, 5, 15)
1477 self._check_content(s, fdef.body[0], 'return True')
1478 self._check_content(s, fdef.args.args[0], 'x: int')
1479 self._check_content(s, fdef.args.args[0].annotation, 'int')
1480 self._check_content(s, fdef.args.kwarg, 'kwargs: Any')
1481 self._check_content(s, fdef.args.kwarg.annotation, 'Any')
1482
1483 def test_call(self):
1484 s = 'func(x, y=2, **kw)'
1485 call = self._parse_value(s)
1486 self._check_content(s, call.func, 'func')
1487 self._check_content(s, call.keywords[0].value, '2')
1488 self._check_content(s, call.keywords[1].value, 'kw')
1489
1490 def test_call_noargs(self):
1491 s = 'x[0]()'
1492 call = self._parse_value(s)
1493 self._check_content(s, call.func, 'x[0]')
1494 self._check_end_pos(call, 1, 6)
1495
1496 def test_class_def(self):
1497 s = dedent('''
1498 class C(A, B):
1499 x: int = 0
1500 ''').strip()
1501 cdef = ast.parse(s).body[0]
1502 self._check_end_pos(cdef, 2, 14)
1503 self._check_content(s, cdef.bases[1], 'B')
1504 self._check_content(s, cdef.body[0], 'x: int = 0')
1505
1506 def test_class_kw(self):
1507 s = 'class S(metaclass=abc.ABCMeta): pass'
1508 cdef = ast.parse(s).body[0]
1509 self._check_content(s, cdef.keywords[0].value, 'abc.ABCMeta')
1510
1511 def test_multi_line_str(self):
1512 s = dedent('''
1513 x = """Some multi-line text.
1514
1515 It goes on starting from same indent."""
1516 ''').strip()
1517 assign = ast.parse(s).body[0]
1518 self._check_end_pos(assign, 3, 40)
1519 self._check_end_pos(assign.value, 3, 40)
1520
1521 def test_continued_str(self):
1522 s = dedent('''
1523 x = "first part" \\
1524 "second part"
1525 ''').strip()
1526 assign = ast.parse(s).body[0]
1527 self._check_end_pos(assign, 2, 13)
1528 self._check_end_pos(assign.value, 2, 13)
1529
1530 def test_suites(self):
1531 # We intentionally put these into the same string to check
1532 # that empty lines are not part of the suite.
1533 s = dedent('''
1534 while True:
1535 pass
1536
1537 if one():
1538 x = None
1539 elif other():
1540 y = None
1541 else:
1542 z = None
1543
1544 for x, y in stuff:
1545 assert True
1546
1547 try:
1548 raise RuntimeError
1549 except TypeError as e:
1550 pass
1551
1552 pass
1553 ''').strip()
1554 mod = ast.parse(s)
1555 while_loop = mod.body[0]
1556 if_stmt = mod.body[1]
1557 for_loop = mod.body[2]
1558 try_stmt = mod.body[3]
1559 pass_stmt = mod.body[4]
1560
1561 self._check_end_pos(while_loop, 2, 8)
1562 self._check_end_pos(if_stmt, 9, 12)
1563 self._check_end_pos(for_loop, 12, 15)
1564 self._check_end_pos(try_stmt, 17, 8)
1565 self._check_end_pos(pass_stmt, 19, 4)
1566
1567 self._check_content(s, while_loop.test, 'True')
1568 self._check_content(s, if_stmt.body[0], 'x = None')
1569 self._check_content(s, if_stmt.orelse[0].test, 'other()')
1570 self._check_content(s, for_loop.target, 'x, y')
1571 self._check_content(s, try_stmt.body[0], 'raise RuntimeError')
1572 self._check_content(s, try_stmt.handlers[0].type, 'TypeError')
1573
1574 def test_fstring(self):
1575 s = 'x = f"abc {x + y} abc"'
1576 fstr = self._parse_value(s)
1577 binop = fstr.values[1].value
1578 self._check_content(s, binop, 'x + y')
1579
1580 def test_fstring_multi_line(self):
1581 s = dedent('''
1582 f"""Some multi-line text.
1583 {
1584 arg_one
1585 +
1586 arg_two
1587 }
1588 It goes on..."""
1589 ''').strip()
1590 fstr = self._parse_value(s)
1591 binop = fstr.values[1].value
1592 self._check_end_pos(binop, 5, 7)
1593 self._check_content(s, binop.left, 'arg_one')
1594 self._check_content(s, binop.right, 'arg_two')
1595
1596 def test_import_from_multi_line(self):
1597 s = dedent('''
1598 from x.y.z import (
1599 a, b, c as c
1600 )
1601 ''').strip()
1602 imp = ast.parse(s).body[0]
1603 self._check_end_pos(imp, 3, 1)
1604
1605 def test_slices(self):
1606 s1 = 'f()[1, 2] [0]'
1607 s2 = 'x[ a.b: c.d]'
1608 sm = dedent('''
1609 x[ a.b: f () ,
1610 g () : c.d
1611 ]
1612 ''').strip()
1613 i1, i2, im = map(self._parse_value, (s1, s2, sm))
1614 self._check_content(s1, i1.value, 'f()[1, 2]')
1615 self._check_content(s1, i1.value.slice.value, '1, 2')
1616 self._check_content(s2, i2.slice.lower, 'a.b')
1617 self._check_content(s2, i2.slice.upper, 'c.d')
1618 self._check_content(sm, im.slice.dims[0].upper, 'f ()')
1619 self._check_content(sm, im.slice.dims[1].lower, 'g ()')
1620 self._check_end_pos(im, 3, 3)
1621
1622 def test_binop(self):
1623 s = dedent('''
1624 (1 * 2 + (3 ) +
1625 4
1626 )
1627 ''').strip()
1628 binop = self._parse_value(s)
1629 self._check_end_pos(binop, 2, 6)
1630 self._check_content(s, binop.right, '4')
1631 self._check_content(s, binop.left, '1 * 2 + (3 )')
1632 self._check_content(s, binop.left.right, '3')
1633
1634 def test_boolop(self):
1635 s = dedent('''
1636 if (one_condition and
1637 (other_condition or yet_another_one)):
1638 pass
1639 ''').strip()
1640 bop = ast.parse(s).body[0].test
1641 self._check_end_pos(bop, 2, 44)
1642 self._check_content(s, bop.values[1],
1643 'other_condition or yet_another_one')
1644
1645 def test_tuples(self):
1646 s1 = 'x = () ;'
1647 s2 = 'x = 1 , ;'
1648 s3 = 'x = (1 , 2 ) ;'
1649 sm = dedent('''
1650 x = (
1651 a, b,
1652 )
1653 ''').strip()
1654 t1, t2, t3, tm = map(self._parse_value, (s1, s2, s3, sm))
1655 self._check_content(s1, t1, '()')
1656 self._check_content(s2, t2, '1 ,')
1657 self._check_content(s3, t3, '(1 , 2 )')
1658 self._check_end_pos(tm, 3, 1)
1659
1660 def test_attribute_spaces(self):
1661 s = 'func(x. y .z)'
1662 call = self._parse_value(s)
1663 self._check_content(s, call, s)
1664 self._check_content(s, call.args[0], 'x. y .z')
1665
Miss Islington (bot)2076d4f2020-02-12 12:56:44 -08001666 def test_redundant_parenthesis(self):
1667 s = '( ( ( a + b ) ) )'
1668 v = ast.parse(s).body[0].value
1669 self.assertEqual(type(v).__name__, 'BinOp')
1670 self._check_content(s, v, 'a + b')
1671 s2 = 'await ' + s
1672 v = ast.parse(s2).body[0].value.value
1673 self.assertEqual(type(v).__name__, 'BinOp')
1674 self._check_content(s2, v, 'a + b')
1675
1676 def test_trailers_with_redundant_parenthesis(self):
1677 tests = (
1678 ('( ( ( a ) ) ) ( )', 'Call'),
1679 ('( ( ( a ) ) ) ( b )', 'Call'),
1680 ('( ( ( a ) ) ) [ b ]', 'Subscript'),
1681 ('( ( ( a ) ) ) . b', 'Attribute'),
1682 )
1683 for s, t in tests:
1684 with self.subTest(s):
1685 v = ast.parse(s).body[0].value
1686 self.assertEqual(type(v).__name__, t)
1687 self._check_content(s, v, s)
1688 s2 = 'await ' + s
1689 v = ast.parse(s2).body[0].value.value
1690 self.assertEqual(type(v).__name__, t)
1691 self._check_content(s2, v, s)
1692
Ivan Levkivskyi9932a222019-01-22 11:18:22 +00001693 def test_displays(self):
1694 s1 = '[{}, {1, }, {1, 2,} ]'
1695 s2 = '{a: b, f (): g () ,}'
1696 c1 = self._parse_value(s1)
1697 c2 = self._parse_value(s2)
1698 self._check_content(s1, c1.elts[0], '{}')
1699 self._check_content(s1, c1.elts[1], '{1, }')
1700 self._check_content(s1, c1.elts[2], '{1, 2,}')
1701 self._check_content(s2, c2.keys[1], 'f ()')
1702 self._check_content(s2, c2.values[1], 'g ()')
1703
1704 def test_comprehensions(self):
1705 s = dedent('''
1706 x = [{x for x, y in stuff
1707 if cond.x} for stuff in things]
1708 ''').strip()
1709 cmp = self._parse_value(s)
1710 self._check_end_pos(cmp, 2, 37)
1711 self._check_content(s, cmp.generators[0].iter, 'things')
1712 self._check_content(s, cmp.elt.generators[0].iter, 'stuff')
1713 self._check_content(s, cmp.elt.generators[0].ifs[0], 'cond.x')
1714 self._check_content(s, cmp.elt.generators[0].target, 'x, y')
1715
1716 def test_yield_await(self):
1717 s = dedent('''
1718 async def f():
1719 yield x
1720 await y
1721 ''').strip()
1722 fdef = ast.parse(s).body[0]
1723 self._check_content(s, fdef.body[0].value, 'yield x')
1724 self._check_content(s, fdef.body[1].value, 'await y')
1725
1726 def test_source_segment_multi(self):
1727 s_orig = dedent('''
1728 x = (
1729 a, b,
1730 ) + ()
1731 ''').strip()
1732 s_tuple = dedent('''
1733 (
1734 a, b,
1735 )
1736 ''').strip()
1737 binop = self._parse_value(s_orig)
1738 self.assertEqual(ast.get_source_segment(s_orig, binop.left), s_tuple)
1739
1740 def test_source_segment_padded(self):
1741 s_orig = dedent('''
1742 class C:
1743 def fun(self) -> None:
1744 "ЖЖЖЖЖ"
1745 ''').strip()
1746 s_method = ' def fun(self) -> None:\n' \
1747 ' "ЖЖЖЖЖ"'
1748 cdef = ast.parse(s_orig).body[0]
1749 self.assertEqual(ast.get_source_segment(s_orig, cdef.body[0], padded=True),
1750 s_method)
1751
1752 def test_source_segment_endings(self):
1753 s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\rz = 1\r\n'
1754 v, w, x, y, z = ast.parse(s).body
1755 self._check_content(s, v, 'v = 1')
1756 self._check_content(s, w, 'w = 1')
1757 self._check_content(s, x, 'x = 1')
1758 self._check_content(s, y, 'y = 1')
1759 self._check_content(s, z, 'z = 1')
1760
1761 def test_source_segment_tabs(self):
1762 s = dedent('''
1763 class C:
1764 \t\f def fun(self) -> None:
1765 \t\f pass
1766 ''').strip()
1767 s_method = ' \t\f def fun(self) -> None:\n' \
1768 ' \t\f pass'
1769
1770 cdef = ast.parse(s).body[0]
1771 self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
1772
1773
Miss Islington (bot)522a3942019-08-26 00:43:33 -07001774class NodeVisitorTests(unittest.TestCase):
1775 def test_old_constant_nodes(self):
1776 class Visitor(ast.NodeVisitor):
1777 def visit_Num(self, node):
1778 log.append((node.lineno, 'Num', node.n))
1779 def visit_Str(self, node):
1780 log.append((node.lineno, 'Str', node.s))
1781 def visit_Bytes(self, node):
1782 log.append((node.lineno, 'Bytes', node.s))
1783 def visit_NameConstant(self, node):
1784 log.append((node.lineno, 'NameConstant', node.value))
1785 def visit_Ellipsis(self, node):
1786 log.append((node.lineno, 'Ellipsis', ...))
1787 mod = ast.parse(dedent('''\
1788 i = 42
1789 f = 4.25
1790 c = 4.25j
1791 s = 'string'
1792 b = b'bytes'
1793 t = True
1794 n = None
1795 e = ...
1796 '''))
1797 visitor = Visitor()
1798 log = []
1799 with warnings.catch_warnings(record=True) as wlog:
1800 warnings.filterwarnings('always', '', PendingDeprecationWarning)
1801 visitor.visit(mod)
1802 self.assertEqual(log, [
1803 (1, 'Num', 42),
1804 (2, 'Num', 4.25),
1805 (3, 'Num', 4.25j),
1806 (4, 'Str', 'string'),
1807 (5, 'Bytes', b'bytes'),
1808 (6, 'NameConstant', True),
1809 (7, 'NameConstant', None),
1810 (8, 'Ellipsis', ...),
1811 ])
1812 self.assertEqual([str(w.message) for w in wlog], [
1813 'visit_Num is deprecated; add visit_Constant',
1814 'visit_Num is deprecated; add visit_Constant',
1815 'visit_Num is deprecated; add visit_Constant',
1816 'visit_Str is deprecated; add visit_Constant',
1817 'visit_Bytes is deprecated; add visit_Constant',
1818 'visit_NameConstant is deprecated; add visit_Constant',
1819 'visit_NameConstant is deprecated; add visit_Constant',
1820 'visit_Ellipsis is deprecated; add visit_Constant',
1821 ])
1822
1823
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001824def main():
1825 if __name__ != '__main__':
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001826 return
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001827 if sys.argv[1:] == ['-g']:
1828 for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
1829 (eval_tests, "eval")):
1830 print(kind+"_results = [")
Victor Stinnerf0891962016-02-08 17:15:21 +01001831 for statement in statements:
1832 tree = ast.parse(statement, "?", kind)
1833 print("%r," % (to_tuple(tree),))
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001834 print("]")
1835 print("main()")
1836 raise SystemExit
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001837 unittest.main()
Tim Peters400cbc32006-02-28 18:44:41 +00001838
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001839#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g #####
Tim Peters400cbc32006-02-28 18:44:41 +00001840exec_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001841('Module', [('Expr', (1, 0), ('Constant', (1, 0), None, None))], []),
1842('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring', None))], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001843('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []),
1844('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 -07001845('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []),
1846('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 +01001847('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1848('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 -07001849('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 -08001850('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001851('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C', None))], [])], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001852('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001853('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 -08001854('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001855('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1, None), None)], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001856('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []),
1857('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []),
1858('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 -07001859('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001860('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []),
1861('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []),
1862('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []),
Miss Islington (bot)3b18b172019-12-13 08:21:54 -08001863('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 -08001864('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 -08001865('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []),
1866('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 -07001867('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 -08001868('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []),
1869('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []),
1870('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []),
1871('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []),
1872('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []),
1873('Module', [('Global', (1, 0), ['v'])], []),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001874('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1, None))], []),
Guido van Rossumdcfcd142019-01-31 03:40:27 -08001875('Module', [('Pass', (1, 0))], []),
1876('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []),
1877('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []),
1878('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)], []),
1879('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)], []),
1880('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)], []),
1881('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)]))], []),
1882('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)]))], []),
1883('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)]))], []),
1884('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)]))], []),
1885('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 +01001886('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)], []),
1887('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)], []),
1888('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 -07001889('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)]))], []),
1890('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 +01001891('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 -07001892('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)], []),
1893('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)], []),
1894('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 +01001895('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 +01001896('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 +00001897('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 -07001898('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
1899('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)], []),
1900('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)], []),
1901('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)], []),
1902('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, [('Constant', (1, 8), 1, None)]), [('Pass', (1, 16))], [], None, None)], []),
1903('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)], []),
1904('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)], []),
1905('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)], []),
1906('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)], []),
1907('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 +00001908]
1909single_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001910('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 +00001911]
1912eval_results = [
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001913('Expression', ('Constant', (1, 0), None, None)),
Martin v. Löwis49c5da12006-03-01 22:49:05 +00001914('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
1915('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
1916('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
Pablo Galindo8c77b8c2019-04-29 13:36:57 +01001917('Expression', ('Lambda', (1, 0), ('arguments', [], [], None, [], [], None, []), ('Constant', (1, 7), None, None))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001918('Expression', ('Dict', (1, 0), [('Constant', (1, 2), 1, None)], [('Constant', (1, 4), 2, None)])),
Benjamin Peterson6ccfe852011-06-27 17:46:06 -05001919('Expression', ('Dict', (1, 0), [], [])),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001920('Expression', ('Set', (1, 0), [('Constant', (1, 1), None, None)])),
1921('Expression', ('Dict', (1, 0), [('Constant', (2, 6), 1, None)], [('Constant', (4, 10), 2, None)])),
Serhiy Storchakab619b092018-11-27 09:40:29 +02001922('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)])),
1923('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)])),
1924('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)])),
1925('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)])),
1926('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)])),
1927('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)])),
1928('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)])),
1929('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)])),
1930('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)])),
1931('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)])),
1932('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 -07001933('Expression', ('Compare', (1, 0), ('Constant', (1, 0), 1, None), [('Lt',), ('Lt',)], [('Constant', (1, 4), 2, None), ('Constant', (1, 8), 3, None)])),
1934('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 +00001935('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 +02001936('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 -07001937('Expression', ('Constant', (1, 0), 10, None)),
1938('Expression', ('Constant', (1, 0), 'string', None)),
Benjamin Peterson7a66fc22015-02-02 10:51:20 -05001939('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
1940('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 +00001941('Expression', ('Name', (1, 0), 'v', ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001942('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 -05001943('Expression', ('List', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001944('Expression', ('Tuple', (1, 0), [('Constant', (1, 0), 1, None), ('Constant', (1, 2), 2, None), ('Constant', (1, 4), 3, None)], ('Load',))),
1945('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 -05001946('Expression', ('Tuple', (1, 0), [], ('Load',))),
Guido van Rossum10f8ce62019-03-13 13:00:46 -07001947('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 +00001948]
Neal Norwitzee9b10a2008-03-31 05:29:39 +00001949main()