Home | History | Annotate | Download | only in test
      1 import ast
      2 import dis
      3 import os
      4 import sys
      5 import unittest
      6 import weakref
      7 
      8 from test import support
      9 
     10 def to_tuple(t):
     11     if t is None or isinstance(t, (str, int, complex)):
     12         return t
     13     elif isinstance(t, list):
     14         return [to_tuple(e) for e in t]
     15     result = [t.__class__.__name__]
     16     if hasattr(t, 'lineno') and hasattr(t, 'col_offset'):
     17         result.append((t.lineno, t.col_offset))
     18     if t._fields is None:
     19         return tuple(result)
     20     for f in t._fields:
     21         result.append(to_tuple(getattr(t, f)))
     22     return tuple(result)
     23 
     24 
     25 # These tests are compiled through "exec"
     26 # There should be at least one test per statement
     27 exec_tests = [
     28     # None
     29     "None",
     30     # FunctionDef
     31     "def f(): pass",
     32     # FunctionDef with arg
     33     "def f(a): pass",
     34     # FunctionDef with arg and default value
     35     "def f(a=0): pass",
     36     # FunctionDef with varargs
     37     "def f(*args): pass",
     38     # FunctionDef with kwargs
     39     "def f(**kwargs): pass",
     40     # FunctionDef with all kind of args
     41     "def f(a, b=1, c=None, d=[], e={}, *args, f=42, **kwargs): pass",
     42     # ClassDef
     43     "class C:pass",
     44     # ClassDef, new style class
     45     "class C(object): pass",
     46     # Return
     47     "def f():return 1",
     48     # Delete
     49     "del v",
     50     # Assign
     51     "v = 1",
     52     # AugAssign
     53     "v += 1",
     54     # For
     55     "for v in v:pass",
     56     # While
     57     "while v:pass",
     58     # If
     59     "if v:pass",
     60     # With
     61     "with x as y: pass",
     62     "with x as y, z as q: pass",
     63     # Raise
     64     "raise Exception('string')",
     65     # TryExcept
     66     "try:\n  pass\nexcept Exception:\n  pass",
     67     # TryFinally
     68     "try:\n  pass\nfinally:\n  pass",
     69     # Assert
     70     "assert v",
     71     # Import
     72     "import sys",
     73     # ImportFrom
     74     "from sys import v",
     75     # Global
     76     "global v",
     77     # Expr
     78     "1",
     79     # Pass,
     80     "pass",
     81     # Break
     82     "for v in v:break",
     83     # Continue
     84     "for v in v:continue",
     85     # for statements with naked tuples (see http://bugs.python.org/issue6704)
     86     "for a,b in c: pass",
     87     "[(a,b) for a,b in c]",
     88     "((a,b) for a,b in c)",
     89     "((a,b) for (a,b) in c)",
     90     # Multiline generator expression (test for .lineno & .col_offset)
     91     """(
     92     (
     93     Aa
     94     ,
     95        Bb
     96     )
     97     for
     98     Aa
     99     ,
    100     Bb in Cc
    101     )""",
    102     # dictcomp
    103     "{a : b for w in x for m in p if g}",
    104     # dictcomp with naked tuple
    105     "{a : b for v,w in x}",
    106     # setcomp
    107     "{r for l in x if g}",
    108     # setcomp with naked tuple
    109     "{r for l,m in x}",
    110     # AsyncFunctionDef
    111     "async def f():\n await something()",
    112     # AsyncFor
    113     "async def f():\n async for e in i: 1\n else: 2",
    114     # AsyncWith
    115     "async def f():\n async with a as b: 1",
    116     # PEP 448: Additional Unpacking Generalizations
    117     "{**{1:2}, 2:3}",
    118     "{*{1, 2}, 3}",
    119     # Asynchronous comprehensions
    120     "async def f():\n [i async for b in c]",
    121 ]
    122 
    123 # These are compiled through "single"
    124 # because of overlap with "eval", it just tests what
    125 # can't be tested with "eval"
    126 single_tests = [
    127     "1+2"
    128 ]
    129 
    130 # These are compiled through "eval"
    131 # It should test all expressions
    132 eval_tests = [
    133   # None
    134   "None",
    135   # BoolOp
    136   "a and b",
    137   # BinOp
    138   "a + b",
    139   # UnaryOp
    140   "not v",
    141   # Lambda
    142   "lambda:None",
    143   # Dict
    144   "{ 1:2 }",
    145   # Empty dict
    146   "{}",
    147   # Set
    148   "{None,}",
    149   # Multiline dict (test for .lineno & .col_offset)
    150   """{
    151       1
    152         :
    153           2
    154      }""",
    155   # ListComp
    156   "[a for b in c if d]",
    157   # GeneratorExp
    158   "(a for b in c if d)",
    159   # Yield - yield expressions can't work outside a function
    160   #
    161   # Compare
    162   "1 < 2 < 3",
    163   # Call
    164   "f(1,2,c=3,*d,**e)",
    165   # Num
    166   "10",
    167   # Str
    168   "'string'",
    169   # Attribute
    170   "a.b",
    171   # Subscript
    172   "a[b:c]",
    173   # Name
    174   "v",
    175   # List
    176   "[1,2,3]",
    177   # Empty list
    178   "[]",
    179   # Tuple
    180   "1,2,3",
    181   # Tuple
    182   "(1,2,3)",
    183   # Empty tuple
    184   "()",
    185   # Combination
    186   "a.b.c.d(a.b[1:2])",
    187 
    188 ]
    189 
    190 # TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
    191 # excepthandler, arguments, keywords, alias
    192 
    193 class AST_Tests(unittest.TestCase):
    194 
    195     def _assertTrueorder(self, ast_node, parent_pos):
    196         if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
    197             return
    198         if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
    199             node_pos = (ast_node.lineno, ast_node.col_offset)
    200             self.assertTrue(node_pos >= parent_pos)
    201             parent_pos = (ast_node.lineno, ast_node.col_offset)
    202         for name in ast_node._fields:
    203             value = getattr(ast_node, name)
    204             if isinstance(value, list):
    205                 for child in value:
    206                     self._assertTrueorder(child, parent_pos)
    207             elif value is not None:
    208                 self._assertTrueorder(value, parent_pos)
    209 
    210     def test_AST_objects(self):
    211         x = ast.AST()
    212         self.assertEqual(x._fields, ())
    213         x.foobar = 42
    214         self.assertEqual(x.foobar, 42)
    215         self.assertEqual(x.__dict__["foobar"], 42)
    216 
    217         with self.assertRaises(AttributeError):
    218             x.vararg
    219 
    220         with self.assertRaises(TypeError):
    221             # "_ast.AST constructor takes 0 positional arguments"
    222             ast.AST(2)
    223 
    224     def test_AST_garbage_collection(self):
    225         class X:
    226             pass
    227         a = ast.AST()
    228         a.x = X()
    229         a.x.a = a
    230         ref = weakref.ref(a.x)
    231         del a
    232         support.gc_collect()
    233         self.assertIsNone(ref())
    234 
    235     def test_snippets(self):
    236         for input, output, kind in ((exec_tests, exec_results, "exec"),
    237                                     (single_tests, single_results, "single"),
    238                                     (eval_tests, eval_results, "eval")):
    239             for i, o in zip(input, output):
    240                 with self.subTest(action="parsing", input=i):
    241                     ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
    242                     self.assertEqual(to_tuple(ast_tree), o)
    243                     self._assertTrueorder(ast_tree, (0, 0))
    244                 with self.subTest(action="compiling", input=i, kind=kind):
    245                     compile(ast_tree, "?", kind)
    246 
    247     def test_slice(self):
    248         slc = ast.parse("x[::]").body[0].value.slice
    249         self.assertIsNone(slc.upper)
    250         self.assertIsNone(slc.lower)
    251         self.assertIsNone(slc.step)
    252 
    253     def test_from_import(self):
    254         im = ast.parse("from . import y").body[0]
    255         self.assertIsNone(im.module)
    256 
    257     def test_non_interned_future_from_ast(self):
    258         mod = ast.parse("from __future__ import division")
    259         self.assertIsInstance(mod.body[0], ast.ImportFrom)
    260         mod.body[0].module = " __future__ ".strip()
    261         compile(mod, "<test>", "exec")
    262 
    263     def test_base_classes(self):
    264         self.assertTrue(issubclass(ast.For, ast.stmt))
    265         self.assertTrue(issubclass(ast.Name, ast.expr))
    266         self.assertTrue(issubclass(ast.stmt, ast.AST))
    267         self.assertTrue(issubclass(ast.expr, ast.AST))
    268         self.assertTrue(issubclass(ast.comprehension, ast.AST))
    269         self.assertTrue(issubclass(ast.Gt, ast.AST))
    270 
    271     def test_field_attr_existence(self):
    272         for name, item in ast.__dict__.items():
    273             if isinstance(item, type) and name != 'AST' and name[0].isupper():
    274                 x = item()
    275                 if isinstance(x, ast.AST):
    276                     self.assertEqual(type(x._fields), tuple)
    277 
    278     def test_arguments(self):
    279         x = ast.arguments()
    280         self.assertEqual(x._fields, ('args', 'vararg', 'kwonlyargs',
    281                                       'kw_defaults', 'kwarg', 'defaults'))
    282 
    283         with self.assertRaises(AttributeError):
    284             x.vararg
    285 
    286         x = ast.arguments(*range(1, 7))
    287         self.assertEqual(x.vararg, 2)
    288 
    289     def test_field_attr_writable(self):
    290         x = ast.Num()
    291         # We can assign to _fields
    292         x._fields = 666
    293         self.assertEqual(x._fields, 666)
    294 
    295     def test_classattrs(self):
    296         x = ast.Num()
    297         self.assertEqual(x._fields, ('n',))
    298 
    299         with self.assertRaises(AttributeError):
    300             x.n
    301 
    302         x = ast.Num(42)
    303         self.assertEqual(x.n, 42)
    304 
    305         with self.assertRaises(AttributeError):
    306             x.lineno
    307 
    308         with self.assertRaises(AttributeError):
    309             x.foobar
    310 
    311         x = ast.Num(lineno=2)
    312         self.assertEqual(x.lineno, 2)
    313 
    314         x = ast.Num(42, lineno=0)
    315         self.assertEqual(x.lineno, 0)
    316         self.assertEqual(x._fields, ('n',))
    317         self.assertEqual(x.n, 42)
    318 
    319         self.assertRaises(TypeError, ast.Num, 1, 2)
    320         self.assertRaises(TypeError, ast.Num, 1, 2, lineno=0)
    321 
    322     def test_module(self):
    323         body = [ast.Num(42)]
    324         x = ast.Module(body)
    325         self.assertEqual(x.body, body)
    326 
    327     def test_nodeclasses(self):
    328         # Zero arguments constructor explicitly allowed
    329         x = ast.BinOp()
    330         self.assertEqual(x._fields, ('left', 'op', 'right'))
    331 
    332         # Random attribute allowed too
    333         x.foobarbaz = 5
    334         self.assertEqual(x.foobarbaz, 5)
    335 
    336         n1 = ast.Num(1)
    337         n3 = ast.Num(3)
    338         addop = ast.Add()
    339         x = ast.BinOp(n1, addop, n3)
    340         self.assertEqual(x.left, n1)
    341         self.assertEqual(x.op, addop)
    342         self.assertEqual(x.right, n3)
    343 
    344         x = ast.BinOp(1, 2, 3)
    345         self.assertEqual(x.left, 1)
    346         self.assertEqual(x.op, 2)
    347         self.assertEqual(x.right, 3)
    348 
    349         x = ast.BinOp(1, 2, 3, lineno=0)
    350         self.assertEqual(x.left, 1)
    351         self.assertEqual(x.op, 2)
    352         self.assertEqual(x.right, 3)
    353         self.assertEqual(x.lineno, 0)
    354 
    355         # node raises exception when not given enough arguments
    356         self.assertRaises(TypeError, ast.BinOp, 1, 2)
    357         # node raises exception when given too many arguments
    358         self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4)
    359         # node raises exception when not given enough arguments
    360         self.assertRaises(TypeError, ast.BinOp, 1, 2, lineno=0)
    361         # node raises exception when given too many arguments
    362         self.assertRaises(TypeError, ast.BinOp, 1, 2, 3, 4, lineno=0)
    363 
    364         # can set attributes through kwargs too
    365         x = ast.BinOp(left=1, op=2, right=3, lineno=0)
    366         self.assertEqual(x.left, 1)
    367         self.assertEqual(x.op, 2)
    368         self.assertEqual(x.right, 3)
    369         self.assertEqual(x.lineno, 0)
    370 
    371         # Random kwargs also allowed
    372         x = ast.BinOp(1, 2, 3, foobarbaz=42)
    373         self.assertEqual(x.foobarbaz, 42)
    374 
    375     def test_no_fields(self):
    376         # this used to fail because Sub._fields was None
    377         x = ast.Sub()
    378         self.assertEqual(x._fields, ())
    379 
    380     def test_pickling(self):
    381         import pickle
    382         mods = [pickle]
    383         try:
    384             import cPickle
    385             mods.append(cPickle)
    386         except ImportError:
    387             pass
    388         protocols = [0, 1, 2]
    389         for mod in mods:
    390             for protocol in protocols:
    391                 for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
    392                     ast2 = mod.loads(mod.dumps(ast, protocol))
    393                     self.assertEqual(to_tuple(ast2), to_tuple(ast))
    394 
    395     def test_invalid_sum(self):
    396         pos = dict(lineno=2, col_offset=3)
    397         m = ast.Module([ast.Expr(ast.expr(**pos), **pos)])
    398         with self.assertRaises(TypeError) as cm:
    399             compile(m, "<test>", "exec")
    400         self.assertIn("but got <_ast.expr", str(cm.exception))
    401 
    402     def test_invalid_identitifer(self):
    403         m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))])
    404         ast.fix_missing_locations(m)
    405         with self.assertRaises(TypeError) as cm:
    406             compile(m, "<test>", "exec")
    407         self.assertIn("identifier must be of type str", str(cm.exception))
    408 
    409     def test_invalid_string(self):
    410         m = ast.Module([ast.Expr(ast.Str(42))])
    411         ast.fix_missing_locations(m)
    412         with self.assertRaises(TypeError) as cm:
    413             compile(m, "<test>", "exec")
    414         self.assertIn("string must be of type str", str(cm.exception))
    415 
    416     def test_empty_yield_from(self):
    417         # Issue 16546: yield from value is not optional.
    418         empty_yield_from = ast.parse("def f():\n yield from g()")
    419         empty_yield_from.body[0].body[0].value.value = None
    420         with self.assertRaises(ValueError) as cm:
    421             compile(empty_yield_from, "<test>", "exec")
    422         self.assertIn("field value is required", str(cm.exception))
    423 
    424 
    425 class ASTHelpers_Test(unittest.TestCase):
    426 
    427     def test_parse(self):
    428         a = ast.parse('foo(1 + 1)')
    429         b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
    430         self.assertEqual(ast.dump(a), ast.dump(b))
    431 
    432     def test_parse_in_error(self):
    433         try:
    434             1/0
    435         except Exception:
    436             with self.assertRaises(SyntaxError) as e:
    437                 ast.literal_eval(r"'\U'")
    438             self.assertIsNotNone(e.exception.__context__)
    439 
    440     def test_dump(self):
    441         node = ast.parse('spam(eggs, "and cheese")')
    442         self.assertEqual(ast.dump(node),
    443             "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
    444             "args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], "
    445             "keywords=[]))])"
    446         )
    447         self.assertEqual(ast.dump(node, annotate_fields=False),
    448             "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
    449             "Str('and cheese')], []))])"
    450         )
    451         self.assertEqual(ast.dump(node, include_attributes=True),
    452             "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
    453             "lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
    454             "lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
    455             "col_offset=11)], keywords=[], "
    456             "lineno=1, col_offset=0), lineno=1, col_offset=0)])"
    457         )
    458 
    459     def test_copy_location(self):
    460         src = ast.parse('1 + 1', mode='eval')
    461         src.body.right = ast.copy_location(ast.Num(2), src.body.right)
    462         self.assertEqual(ast.dump(src, include_attributes=True),
    463             'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), '
    464             'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, '
    465             'col_offset=0))'
    466         )
    467 
    468     def test_fix_missing_locations(self):
    469         src = ast.parse('write("spam")')
    470         src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
    471                                           [ast.Str('eggs')], [])))
    472         self.assertEqual(src, ast.fix_missing_locations(src))
    473         self.assertEqual(ast.dump(src, include_attributes=True),
    474             "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
    475             "lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
    476             "col_offset=6)], keywords=[], "
    477             "lineno=1, col_offset=0), lineno=1, col_offset=0), "
    478             "Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
    479             "col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
    480             "keywords=[], lineno=1, "
    481             "col_offset=0), lineno=1, col_offset=0)])"
    482         )
    483 
    484     def test_increment_lineno(self):
    485         src = ast.parse('1 + 1', mode='eval')
    486         self.assertEqual(ast.increment_lineno(src, n=3), src)
    487         self.assertEqual(ast.dump(src, include_attributes=True),
    488             'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
    489             'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
    490             'col_offset=0))'
    491         )
    492         # issue10869: do not increment lineno of root twice
    493         src = ast.parse('1 + 1', mode='eval')
    494         self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
    495         self.assertEqual(ast.dump(src, include_attributes=True),
    496             'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
    497             'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
    498             'col_offset=0))'
    499         )
    500 
    501     def test_iter_fields(self):
    502         node = ast.parse('foo()', mode='eval')
    503         d = dict(ast.iter_fields(node.body))
    504         self.assertEqual(d.pop('func').id, 'foo')
    505         self.assertEqual(d, {'keywords': [], 'args': []})
    506 
    507     def test_iter_child_nodes(self):
    508         node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
    509         self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
    510         iterator = ast.iter_child_nodes(node.body)
    511         self.assertEqual(next(iterator).id, 'spam')
    512         self.assertEqual(next(iterator).n, 23)
    513         self.assertEqual(next(iterator).n, 42)
    514         self.assertEqual(ast.dump(next(iterator)),
    515             "keyword(arg='eggs', value=Str(s='leek'))"
    516         )
    517 
    518     def test_get_docstring(self):
    519         node = ast.parse('def foo():\n  """line one\n  line two"""')
    520         self.assertEqual(ast.get_docstring(node.body[0]),
    521                          'line one\nline two')
    522 
    523         node = ast.parse('async def foo():\n  """spam\n  ham"""')
    524         self.assertEqual(ast.get_docstring(node.body[0]), 'spam\nham')
    525 
    526     def test_literal_eval(self):
    527         self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
    528         self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
    529         self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
    530         self.assertEqual(ast.literal_eval('{1, 2, 3}'), {1, 2, 3})
    531         self.assertEqual(ast.literal_eval('b"hi"'), b"hi")
    532         self.assertRaises(ValueError, ast.literal_eval, 'foo()')
    533         self.assertEqual(ast.literal_eval('-6'), -6)
    534         self.assertEqual(ast.literal_eval('-6j+3'), 3-6j)
    535         self.assertEqual(ast.literal_eval('3.25'), 3.25)
    536 
    537     def test_literal_eval_issue4907(self):
    538         self.assertEqual(ast.literal_eval('2j'), 2j)
    539         self.assertEqual(ast.literal_eval('10 + 2j'), 10 + 2j)
    540         self.assertEqual(ast.literal_eval('1.5 - 2j'), 1.5 - 2j)
    541 
    542     def test_bad_integer(self):
    543         # issue13436: Bad error message with invalid numeric values
    544         body = [ast.ImportFrom(module='time',
    545                                names=[ast.alias(name='sleep')],
    546                                level=None,
    547                                lineno=None, col_offset=None)]
    548         mod = ast.Module(body)
    549         with self.assertRaises(ValueError) as cm:
    550             compile(mod, 'test', 'exec')
    551         self.assertIn("invalid integer value: None", str(cm.exception))
    552 
    553     def test_level_as_none(self):
    554         body = [ast.ImportFrom(module='time',
    555                                names=[ast.alias(name='sleep')],
    556                                level=None,
    557                                lineno=0, col_offset=0)]
    558         mod = ast.Module(body)
    559         code = compile(mod, 'test', 'exec')
    560         ns = {}
    561         exec(code, ns)
    562         self.assertIn('sleep', ns)
    563 
    564 
    565 class ASTValidatorTests(unittest.TestCase):
    566 
    567     def mod(self, mod, msg=None, mode="exec", *, exc=ValueError):
    568         mod.lineno = mod.col_offset = 0
    569         ast.fix_missing_locations(mod)
    570         with self.assertRaises(exc) as cm:
    571             compile(mod, "<test>", mode)
    572         if msg is not None:
    573             self.assertIn(msg, str(cm.exception))
    574 
    575     def expr(self, node, msg=None, *, exc=ValueError):
    576         mod = ast.Module([ast.Expr(node)])
    577         self.mod(mod, msg, exc=exc)
    578 
    579     def stmt(self, stmt, msg=None):
    580         mod = ast.Module([stmt])
    581         self.mod(mod, msg)
    582 
    583     def test_module(self):
    584         m = ast.Interactive([ast.Expr(ast.Name("x", ast.Store()))])
    585         self.mod(m, "must have Load context", "single")
    586         m = ast.Expression(ast.Name("x", ast.Store()))
    587         self.mod(m, "must have Load context", "eval")
    588 
    589     def _check_arguments(self, fac, check):
    590         def arguments(args=None, vararg=None,
    591                       kwonlyargs=None, kwarg=None,
    592                       defaults=None, kw_defaults=None):
    593             if args is None:
    594                 args = []
    595             if kwonlyargs is None:
    596                 kwonlyargs = []
    597             if defaults is None:
    598                 defaults = []
    599             if kw_defaults is None:
    600                 kw_defaults = []
    601             args = ast.arguments(args, vararg, kwonlyargs, kw_defaults,
    602                                  kwarg, defaults)
    603             return fac(args)
    604         args = [ast.arg("x", ast.Name("x", ast.Store()))]
    605         check(arguments(args=args), "must have Load context")
    606         check(arguments(kwonlyargs=args), "must have Load context")
    607         check(arguments(defaults=[ast.Num(3)]),
    608                        "more positional defaults than args")
    609         check(arguments(kw_defaults=[ast.Num(4)]),
    610                        "length of kwonlyargs is not the same as kw_defaults")
    611         args = [ast.arg("x", ast.Name("x", ast.Load()))]
    612         check(arguments(args=args, defaults=[ast.Name("x", ast.Store())]),
    613                        "must have Load context")
    614         args = [ast.arg("a", ast.Name("x", ast.Load())),
    615                 ast.arg("b", ast.Name("y", ast.Load()))]
    616         check(arguments(kwonlyargs=args,
    617                           kw_defaults=[None, ast.Name("x", ast.Store())]),
    618                           "must have Load context")
    619 
    620     def test_funcdef(self):
    621         a = ast.arguments([], None, [], [], None, [])
    622         f = ast.FunctionDef("x", a, [], [], None)
    623         self.stmt(f, "empty body on FunctionDef")
    624         f = ast.FunctionDef("x", a, [ast.Pass()], [ast.Name("x", ast.Store())],
    625                             None)
    626         self.stmt(f, "must have Load context")
    627         f = ast.FunctionDef("x", a, [ast.Pass()], [],
    628                             ast.Name("x", ast.Store()))
    629         self.stmt(f, "must have Load context")
    630         def fac(args):
    631             return ast.FunctionDef("x", args, [ast.Pass()], [], None)
    632         self._check_arguments(fac, self.stmt)
    633 
    634     def test_classdef(self):
    635         def cls(bases=None, keywords=None, body=None, decorator_list=None):
    636             if bases is None:
    637                 bases = []
    638             if keywords is None:
    639                 keywords = []
    640             if body is None:
    641                 body = [ast.Pass()]
    642             if decorator_list is None:
    643                 decorator_list = []
    644             return ast.ClassDef("myclass", bases, keywords,
    645                                 body, decorator_list)
    646         self.stmt(cls(bases=[ast.Name("x", ast.Store())]),
    647                   "must have Load context")
    648         self.stmt(cls(keywords=[ast.keyword("x", ast.Name("x", ast.Store()))]),
    649                   "must have Load context")
    650         self.stmt(cls(body=[]), "empty body on ClassDef")
    651         self.stmt(cls(body=[None]), "None disallowed")
    652         self.stmt(cls(decorator_list=[ast.Name("x", ast.Store())]),
    653                   "must have Load context")
    654 
    655     def test_delete(self):
    656         self.stmt(ast.Delete([]), "empty targets on Delete")
    657         self.stmt(ast.Delete([None]), "None disallowed")
    658         self.stmt(ast.Delete([ast.Name("x", ast.Load())]),
    659                   "must have Del context")
    660 
    661     def test_assign(self):
    662         self.stmt(ast.Assign([], ast.Num(3)), "empty targets on Assign")
    663         self.stmt(ast.Assign([None], ast.Num(3)), "None disallowed")
    664         self.stmt(ast.Assign([ast.Name("x", ast.Load())], ast.Num(3)),
    665                   "must have Store context")
    666         self.stmt(ast.Assign([ast.Name("x", ast.Store())],
    667                                 ast.Name("y", ast.Store())),
    668                   "must have Load context")
    669 
    670     def test_augassign(self):
    671         aug = ast.AugAssign(ast.Name("x", ast.Load()), ast.Add(),
    672                             ast.Name("y", ast.Load()))
    673         self.stmt(aug, "must have Store context")
    674         aug = ast.AugAssign(ast.Name("x", ast.Store()), ast.Add(),
    675                             ast.Name("y", ast.Store()))
    676         self.stmt(aug, "must have Load context")
    677 
    678     def test_for(self):
    679         x = ast.Name("x", ast.Store())
    680         y = ast.Name("y", ast.Load())
    681         p = ast.Pass()
    682         self.stmt(ast.For(x, y, [], []), "empty body on For")
    683         self.stmt(ast.For(ast.Name("x", ast.Load()), y, [p], []),
    684                   "must have Store context")
    685         self.stmt(ast.For(x, ast.Name("y", ast.Store()), [p], []),
    686                   "must have Load context")
    687         e = ast.Expr(ast.Name("x", ast.Store()))
    688         self.stmt(ast.For(x, y, [e], []), "must have Load context")
    689         self.stmt(ast.For(x, y, [p], [e]), "must have Load context")
    690 
    691     def test_while(self):
    692         self.stmt(ast.While(ast.Num(3), [], []), "empty body on While")
    693         self.stmt(ast.While(ast.Name("x", ast.Store()), [ast.Pass()], []),
    694                   "must have Load context")
    695         self.stmt(ast.While(ast.Num(3), [ast.Pass()],
    696                              [ast.Expr(ast.Name("x", ast.Store()))]),
    697                              "must have Load context")
    698 
    699     def test_if(self):
    700         self.stmt(ast.If(ast.Num(3), [], []), "empty body on If")
    701         i = ast.If(ast.Name("x", ast.Store()), [ast.Pass()], [])
    702         self.stmt(i, "must have Load context")
    703         i = ast.If(ast.Num(3), [ast.Expr(ast.Name("x", ast.Store()))], [])
    704         self.stmt(i, "must have Load context")
    705         i = ast.If(ast.Num(3), [ast.Pass()],
    706                    [ast.Expr(ast.Name("x", ast.Store()))])
    707         self.stmt(i, "must have Load context")
    708 
    709     def test_with(self):
    710         p = ast.Pass()
    711         self.stmt(ast.With([], [p]), "empty items on With")
    712         i = ast.withitem(ast.Num(3), None)
    713         self.stmt(ast.With([i], []), "empty body on With")
    714         i = ast.withitem(ast.Name("x", ast.Store()), None)
    715         self.stmt(ast.With([i], [p]), "must have Load context")
    716         i = ast.withitem(ast.Num(3), ast.Name("x", ast.Load()))
    717         self.stmt(ast.With([i], [p]), "must have Store context")
    718 
    719     def test_raise(self):
    720         r = ast.Raise(None, ast.Num(3))
    721         self.stmt(r, "Raise with cause but no exception")
    722         r = ast.Raise(ast.Name("x", ast.Store()), None)
    723         self.stmt(r, "must have Load context")
    724         r = ast.Raise(ast.Num(4), ast.Name("x", ast.Store()))
    725         self.stmt(r, "must have Load context")
    726 
    727     def test_try(self):
    728         p = ast.Pass()
    729         t = ast.Try([], [], [], [p])
    730         self.stmt(t, "empty body on Try")
    731         t = ast.Try([ast.Expr(ast.Name("x", ast.Store()))], [], [], [p])
    732         self.stmt(t, "must have Load context")
    733         t = ast.Try([p], [], [], [])
    734         self.stmt(t, "Try has neither except handlers nor finalbody")
    735         t = ast.Try([p], [], [p], [p])
    736         self.stmt(t, "Try has orelse but no except handlers")
    737         t = ast.Try([p], [ast.ExceptHandler(None, "x", [])], [], [])
    738         self.stmt(t, "empty body on ExceptHandler")
    739         e = [ast.ExceptHandler(ast.Name("x", ast.Store()), "y", [p])]
    740         self.stmt(ast.Try([p], e, [], []), "must have Load context")
    741         e = [ast.ExceptHandler(None, "x", [p])]
    742         t = ast.Try([p], e, [ast.Expr(ast.Name("x", ast.Store()))], [p])
    743         self.stmt(t, "must have Load context")
    744         t = ast.Try([p], e, [p], [ast.Expr(ast.Name("x", ast.Store()))])
    745         self.stmt(t, "must have Load context")
    746 
    747     def test_assert(self):
    748         self.stmt(ast.Assert(ast.Name("x", ast.Store()), None),
    749                   "must have Load context")
    750         assrt = ast.Assert(ast.Name("x", ast.Load()),
    751                            ast.Name("y", ast.Store()))
    752         self.stmt(assrt, "must have Load context")
    753 
    754     def test_import(self):
    755         self.stmt(ast.Import([]), "empty names on Import")
    756 
    757     def test_importfrom(self):
    758         imp = ast.ImportFrom(None, [ast.alias("x", None)], -42)
    759         self.stmt(imp, "Negative ImportFrom level")
    760         self.stmt(ast.ImportFrom(None, [], 0), "empty names on ImportFrom")
    761 
    762     def test_global(self):
    763         self.stmt(ast.Global([]), "empty names on Global")
    764 
    765     def test_nonlocal(self):
    766         self.stmt(ast.Nonlocal([]), "empty names on Nonlocal")
    767 
    768     def test_expr(self):
    769         e = ast.Expr(ast.Name("x", ast.Store()))
    770         self.stmt(e, "must have Load context")
    771 
    772     def test_boolop(self):
    773         b = ast.BoolOp(ast.And(), [])
    774         self.expr(b, "less than 2 values")
    775         b = ast.BoolOp(ast.And(), [ast.Num(3)])
    776         self.expr(b, "less than 2 values")
    777         b = ast.BoolOp(ast.And(), [ast.Num(4), None])
    778         self.expr(b, "None disallowed")
    779         b = ast.BoolOp(ast.And(), [ast.Num(4), ast.Name("x", ast.Store())])
    780         self.expr(b, "must have Load context")
    781 
    782     def test_unaryop(self):
    783         u = ast.UnaryOp(ast.Not(), ast.Name("x", ast.Store()))
    784         self.expr(u, "must have Load context")
    785 
    786     def test_lambda(self):
    787         a = ast.arguments([], None, [], [], None, [])
    788         self.expr(ast.Lambda(a, ast.Name("x", ast.Store())),
    789                   "must have Load context")
    790         def fac(args):
    791             return ast.Lambda(args, ast.Name("x", ast.Load()))
    792         self._check_arguments(fac, self.expr)
    793 
    794     def test_ifexp(self):
    795         l = ast.Name("x", ast.Load())
    796         s = ast.Name("y", ast.Store())
    797         for args in (s, l, l), (l, s, l), (l, l, s):
    798             self.expr(ast.IfExp(*args), "must have Load context")
    799 
    800     def test_dict(self):
    801         d = ast.Dict([], [ast.Name("x", ast.Load())])
    802         self.expr(d, "same number of keys as values")
    803         d = ast.Dict([ast.Name("x", ast.Load())], [None])
    804         self.expr(d, "None disallowed")
    805 
    806     def test_set(self):
    807         self.expr(ast.Set([None]), "None disallowed")
    808         s = ast.Set([ast.Name("x", ast.Store())])
    809         self.expr(s, "must have Load context")
    810 
    811     def _check_comprehension(self, fac):
    812         self.expr(fac([]), "comprehension with no generators")
    813         g = ast.comprehension(ast.Name("x", ast.Load()),
    814                               ast.Name("x", ast.Load()), [], 0)
    815         self.expr(fac([g]), "must have Store context")
    816         g = ast.comprehension(ast.Name("x", ast.Store()),
    817                               ast.Name("x", ast.Store()), [], 0)
    818         self.expr(fac([g]), "must have Load context")
    819         x = ast.Name("x", ast.Store())
    820         y = ast.Name("y", ast.Load())
    821         g = ast.comprehension(x, y, [None], 0)
    822         self.expr(fac([g]), "None disallowed")
    823         g = ast.comprehension(x, y, [ast.Name("x", ast.Store())], 0)
    824         self.expr(fac([g]), "must have Load context")
    825 
    826     def _simple_comp(self, fac):
    827         g = ast.comprehension(ast.Name("x", ast.Store()),
    828                               ast.Name("x", ast.Load()), [], 0)
    829         self.expr(fac(ast.Name("x", ast.Store()), [g]),
    830                   "must have Load context")
    831         def wrap(gens):
    832             return fac(ast.Name("x", ast.Store()), gens)
    833         self._check_comprehension(wrap)
    834 
    835     def test_listcomp(self):
    836         self._simple_comp(ast.ListComp)
    837 
    838     def test_setcomp(self):
    839         self._simple_comp(ast.SetComp)
    840 
    841     def test_generatorexp(self):
    842         self._simple_comp(ast.GeneratorExp)
    843 
    844     def test_dictcomp(self):
    845         g = ast.comprehension(ast.Name("y", ast.Store()),
    846                               ast.Name("p", ast.Load()), [], 0)
    847         c = ast.DictComp(ast.Name("x", ast.Store()),
    848                          ast.Name("y", ast.Load()), [g])
    849         self.expr(c, "must have Load context")
    850         c = ast.DictComp(ast.Name("x", ast.Load()),
    851                          ast.Name("y", ast.Store()), [g])
    852         self.expr(c, "must have Load context")
    853         def factory(comps):
    854             k = ast.Name("x", ast.Load())
    855             v = ast.Name("y", ast.Load())
    856             return ast.DictComp(k, v, comps)
    857         self._check_comprehension(factory)
    858 
    859     def test_yield(self):
    860         self.expr(ast.Yield(ast.Name("x", ast.Store())), "must have Load")
    861         self.expr(ast.YieldFrom(ast.Name("x", ast.Store())), "must have Load")
    862 
    863     def test_compare(self):
    864         left = ast.Name("x", ast.Load())
    865         comp = ast.Compare(left, [ast.In()], [])
    866         self.expr(comp, "no comparators")
    867         comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)])
    868         self.expr(comp, "different number of comparators and operands")
    869         comp = ast.Compare(ast.Num("blah"), [ast.In()], [left])
    870         self.expr(comp, "non-numeric", exc=TypeError)
    871         comp = ast.Compare(left, [ast.In()], [ast.Num("blah")])
    872         self.expr(comp, "non-numeric", exc=TypeError)
    873 
    874     def test_call(self):
    875         func = ast.Name("x", ast.Load())
    876         args = [ast.Name("y", ast.Load())]
    877         keywords = [ast.keyword("w", ast.Name("z", ast.Load()))]
    878         call = ast.Call(ast.Name("x", ast.Store()), args, keywords)
    879         self.expr(call, "must have Load context")
    880         call = ast.Call(func, [None], keywords)
    881         self.expr(call, "None disallowed")
    882         bad_keywords = [ast.keyword("w", ast.Name("z", ast.Store()))]
    883         call = ast.Call(func, args, bad_keywords)
    884         self.expr(call, "must have Load context")
    885 
    886     def test_num(self):
    887         class subint(int):
    888             pass
    889         class subfloat(float):
    890             pass
    891         class subcomplex(complex):
    892             pass
    893         for obj in "0", "hello", subint(), subfloat(), subcomplex():
    894             self.expr(ast.Num(obj), "non-numeric", exc=TypeError)
    895 
    896     def test_attribute(self):
    897         attr = ast.Attribute(ast.Name("x", ast.Store()), "y", ast.Load())
    898         self.expr(attr, "must have Load context")
    899 
    900     def test_subscript(self):
    901         sub = ast.Subscript(ast.Name("x", ast.Store()), ast.Index(ast.Num(3)),
    902                             ast.Load())
    903         self.expr(sub, "must have Load context")
    904         x = ast.Name("x", ast.Load())
    905         sub = ast.Subscript(x, ast.Index(ast.Name("y", ast.Store())),
    906                             ast.Load())
    907         self.expr(sub, "must have Load context")
    908         s = ast.Name("x", ast.Store())
    909         for args in (s, None, None), (None, s, None), (None, None, s):
    910             sl = ast.Slice(*args)
    911             self.expr(ast.Subscript(x, sl, ast.Load()),
    912                       "must have Load context")
    913         sl = ast.ExtSlice([])
    914         self.expr(ast.Subscript(x, sl, ast.Load()), "empty dims on ExtSlice")
    915         sl = ast.ExtSlice([ast.Index(s)])
    916         self.expr(ast.Subscript(x, sl, ast.Load()), "must have Load context")
    917 
    918     def test_starred(self):
    919         left = ast.List([ast.Starred(ast.Name("x", ast.Load()), ast.Store())],
    920                         ast.Store())
    921         assign = ast.Assign([left], ast.Num(4))
    922         self.stmt(assign, "must have Store context")
    923 
    924     def _sequence(self, fac):
    925         self.expr(fac([None], ast.Load()), "None disallowed")
    926         self.expr(fac([ast.Name("x", ast.Store())], ast.Load()),
    927                   "must have Load context")
    928 
    929     def test_list(self):
    930         self._sequence(ast.List)
    931 
    932     def test_tuple(self):
    933         self._sequence(ast.Tuple)
    934 
    935     def test_nameconstant(self):
    936         self.expr(ast.NameConstant(4), "singleton must be True, False, or None")
    937 
    938     def test_stdlib_validates(self):
    939         stdlib = os.path.dirname(ast.__file__)
    940         tests = [fn for fn in os.listdir(stdlib) if fn.endswith(".py")]
    941         tests.extend(["test/test_grammar.py", "test/test_unpack_ex.py"])
    942         for module in tests:
    943             fn = os.path.join(stdlib, module)
    944             with open(fn, "r", encoding="utf-8") as fp:
    945                 source = fp.read()
    946             mod = ast.parse(source, fn)
    947             compile(mod, fn, "exec")
    948 
    949 
    950 class ConstantTests(unittest.TestCase):
    951     """Tests on the ast.Constant node type."""
    952 
    953     def compile_constant(self, value):
    954         tree = ast.parse("x = 123")
    955 
    956         node = tree.body[0].value
    957         new_node = ast.Constant(value=value)
    958         ast.copy_location(new_node, node)
    959         tree.body[0].value = new_node
    960 
    961         code = compile(tree, "<string>", "exec")
    962 
    963         ns = {}
    964         exec(code, ns)
    965         return ns['x']
    966 
    967     def test_validation(self):
    968         with self.assertRaises(TypeError) as cm:
    969             self.compile_constant([1, 2, 3])
    970         self.assertEqual(str(cm.exception),
    971                          "got an invalid type in Constant: list")
    972 
    973     def test_singletons(self):
    974         for const in (None, False, True, Ellipsis, b'', frozenset()):
    975             with self.subTest(const=const):
    976                 value = self.compile_constant(const)
    977                 self.assertIs(value, const)
    978 
    979     def test_values(self):
    980         nested_tuple = (1,)
    981         nested_frozenset = frozenset({1})
    982         for level in range(3):
    983             nested_tuple = (nested_tuple, 2)
    984             nested_frozenset = frozenset({nested_frozenset, 2})
    985         values = (123, 123.0, 123j,
    986                   "unicode", b'bytes',
    987                   tuple("tuple"), frozenset("frozenset"),
    988                   nested_tuple, nested_frozenset)
    989         for value in values:
    990             with self.subTest(value=value):
    991                 result = self.compile_constant(value)
    992                 self.assertEqual(result, value)
    993 
    994     def test_assign_to_constant(self):
    995         tree = ast.parse("x = 1")
    996 
    997         target = tree.body[0].targets[0]
    998         new_target = ast.Constant(value=1)
    999         ast.copy_location(new_target, target)
   1000         tree.body[0].targets[0] = new_target
   1001 
   1002         with self.assertRaises(ValueError) as cm:
   1003             compile(tree, "string", "exec")
   1004         self.assertEqual(str(cm.exception),
   1005                          "expression which can't be assigned "
   1006                          "to in Store context")
   1007 
   1008     def test_get_docstring(self):
   1009         tree = ast.parse("'docstring'\nx = 1")
   1010         self.assertEqual(ast.get_docstring(tree), 'docstring')
   1011 
   1012         tree.body[0].value = ast.Constant(value='constant docstring')
   1013         self.assertEqual(ast.get_docstring(tree), 'constant docstring')
   1014 
   1015     def get_load_const(self, tree):
   1016         # Compile to bytecode, disassemble and get parameter of LOAD_CONST
   1017         # instructions
   1018         co = compile(tree, '<string>', 'exec')
   1019         consts = []
   1020         for instr in dis.get_instructions(co):
   1021             if instr.opname == 'LOAD_CONST':
   1022                 consts.append(instr.argval)
   1023         return consts
   1024 
   1025     @support.cpython_only
   1026     def test_load_const(self):
   1027         consts = [None,
   1028                   True, False,
   1029                   124,
   1030                   2.0,
   1031                   3j,
   1032                   "unicode",
   1033                   b'bytes',
   1034                   (1, 2, 3)]
   1035 
   1036         code = '\n'.join(['x={!r}'.format(const) for const in consts])
   1037         code += '\nx = ...'
   1038         consts.extend((Ellipsis, None))
   1039 
   1040         tree = ast.parse(code)
   1041         self.assertEqual(self.get_load_const(tree),
   1042                          consts)
   1043 
   1044         # Replace expression nodes with constants
   1045         for assign, const in zip(tree.body, consts):
   1046             assert isinstance(assign, ast.Assign), ast.dump(assign)
   1047             new_node = ast.Constant(value=const)
   1048             ast.copy_location(new_node, assign.value)
   1049             assign.value = new_node
   1050 
   1051         self.assertEqual(self.get_load_const(tree),
   1052                          consts)
   1053 
   1054     def test_literal_eval(self):
   1055         tree = ast.parse("1 + 2")
   1056         binop = tree.body[0].value
   1057 
   1058         new_left = ast.Constant(value=10)
   1059         ast.copy_location(new_left, binop.left)
   1060         binop.left = new_left
   1061 
   1062         new_right = ast.Constant(value=20)
   1063         ast.copy_location(new_right, binop.right)
   1064         binop.right = new_right
   1065 
   1066         self.assertEqual(ast.literal_eval(binop), 30)
   1067 
   1068 
   1069 def main():
   1070     if __name__ != '__main__':
   1071         return
   1072     if sys.argv[1:] == ['-g']:
   1073         for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
   1074                                  (eval_tests, "eval")):
   1075             print(kind+"_results = [")
   1076             for statement in statements:
   1077                 tree = ast.parse(statement, "?", kind)
   1078                 print("%r," % (to_tuple(tree),))
   1079             print("]")
   1080         print("main()")
   1081         raise SystemExit
   1082     unittest.main()
   1083 
   1084 #### EVERYTHING BELOW IS GENERATED #####
   1085 exec_results = [
   1086 ('Module', [('Expr', (1, 0), ('NameConstant', (1, 0), None))]),
   1087 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None)]),
   1088 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, []), [('Pass', (1, 10))], [], None)]),
   1089 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, [('Num', (1, 8), 0)]), [('Pass', (1, 12))], [], None)]),
   1090 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None), [], [], None, []), [('Pass', (1, 14))], [], None)]),
   1091 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None), []), [('Pass', (1, 17))], [], None)]),
   1092 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None), ('arg', (1, 9), 'b', None), ('arg', (1, 14), 'c', None), ('arg', (1, 22), 'd', None), ('arg', (1, 28), 'e', None)], ('arg', (1, 35), 'args', None), [('arg', (1, 41), 'f', None)], [('Num', (1, 43), 42)], ('arg', (1, 49), 'kwargs', None), [('Num', (1, 11), 1), ('NameConstant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Pass', (1, 58))], [], None)]),
   1093 ('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])]),
   1094 ('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])]),
   1095 ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]),
   1096 ('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]),
   1097 ('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]),
   1098 ('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]),
   1099 ('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]),
   1100 ('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]),
   1101 ('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]),
   1102 ('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))])]),
   1103 ('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))])]),
   1104 ('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], []), None)]),
   1105 ('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])]),
   1106 ('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])]),
   1107 ('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
   1108 ('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
   1109 ('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
   1110 ('Module', [('Global', (1, 0), ['v'])]),
   1111 ('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]),
   1112 ('Module', [('Pass', (1, 0))]),
   1113 ('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [])]),
   1114 ('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [])]),
   1115 ('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))], [])]),
   1116 ('Module', [('Expr', (1, 0), ('ListComp', (1, 1), ('Tuple', (1, 2), [('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)]))]),
   1117 ('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('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)]))]),
   1118 ('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 12), [('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 14), 'b', ('Store',))], ('Store',)), ('Name', (1, 20), 'c', ('Load',)), [], 0)]))]),
   1119 ('Module', [('Expr', (1, 0), ('GeneratorExp', (2, 4), ('Tuple', (3, 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)]))]),
   1120 ('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)]))]),
   1121 ('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)]))]),
   1122 ('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)]))]),
   1123 ('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)]))]),
   1124 ('Module', [('AsyncFunctionDef', (1, 6), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('Await', (2, 1), ('Call', (2, 7), ('Name', (2, 7), 'something', ('Load',)), [], [])))], [], None)]),
   1125 ('Module', [('AsyncFunctionDef', (1, 6), 'f', ('arguments', [], None, [], [], None, []), [('AsyncFor', (2, 7), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Num', (2, 19), 1))], [('Expr', (3, 7), ('Num', (3, 7), 2))])], [], None)]),
   1126 ('Module', [('AsyncFunctionDef', (1, 6), 'f', ('arguments', [], None, [], [], None, []), [('AsyncWith', (2, 7), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Num', (2, 20), 1))])], [], None)]),
   1127 ('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Num', (1, 10), 2)], [('Dict', (1, 3), [('Num', (1, 4), 1)], [('Num', (1, 6), 2)]), ('Num', (1, 12), 3)]))]),
   1128 ('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Num', (1, 3), 1), ('Num', (1, 6), 2)]), ('Load',)), ('Num', (1, 10), 3)]))]),
   1129 ('Module', [('AsyncFunctionDef', (1, 6), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 2), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None)]),
   1130 ]
   1131 single_results = [
   1132 ('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
   1133 ]
   1134 eval_results = [
   1135 ('Expression', ('NameConstant', (1, 0), None)),
   1136 ('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])),
   1137 ('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))),
   1138 ('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))),
   1139 ('Expression', ('Lambda', (1, 0), ('arguments', [], None, [], [], None, []), ('NameConstant', (1, 7), None))),
   1140 ('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])),
   1141 ('Expression', ('Dict', (1, 0), [], [])),
   1142 ('Expression', ('Set', (1, 0), [('NameConstant', (1, 1), None)])),
   1143 ('Expression', ('Dict', (1, 0), [('Num', (2, 6), 1)], [('Num', (4, 10), 2)])),
   1144 ('Expression', ('ListComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
   1145 ('Expression', ('GeneratorExp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))], 0)])),
   1146 ('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])),
   1147 ('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2), ('Starred', (1, 10), ('Name', (1, 11), 'd', ('Load',)), ('Load',))], [('keyword', 'c', ('Num', (1, 8), 3)), ('keyword', None, ('Name', (1, 15), 'e', ('Load',)))])),
   1148 ('Expression', ('Num', (1, 0), 10)),
   1149 ('Expression', ('Str', (1, 0), 'string')),
   1150 ('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))),
   1151 ('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))),
   1152 ('Expression', ('Name', (1, 0), 'v', ('Load',))),
   1153 ('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
   1154 ('Expression', ('List', (1, 0), [], ('Load',))),
   1155 ('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
   1156 ('Expression', ('Tuple', (1, 1), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))),
   1157 ('Expression', ('Tuple', (1, 0), [], ('Load',))),
   1158 ('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', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [])),
   1159 ]
   1160 main()
   1161