Пример #1
0
    def test_try_catch_has_assignment_for_name_2(self):
        scope = codegen.Scope()
        try_ = codegen.Try([], scope)
        name = scope.reserve_name('foo')

        # Add to 'except'
        try_.except_block.add_assignment(name, codegen.String('x'))
        self.assertFalse(try_.has_assignment_for_name(name))

        # Add to 'else'
        try_.else_block.add_assignment(name, codegen.String('x'), allow_multiple=True)
        self.assertTrue(try_.has_assignment_for_name(name))
Пример #2
0
 def test_try_catch_multiple_exceptions(self):
     scope = codegen.Scope()
     scope.reserve_name('MyError')
     scope.reserve_name('OtherError')
     try_ = codegen.Try([scope.variable('MyError'),
                         scope.variable('OtherError')], scope)
     self.assertCodeEqual(as_source_code(try_), """
         try:
             pass
         except (MyError, OtherError):
             pass
     """)
Пример #3
0
    def test_try_catch_has_assignment_for_name_1(self):
        scope = codegen.Scope()
        try_ = codegen.Try([], scope)
        name = scope.reserve_name('foo')
        self.assertFalse(try_.has_assignment_for_name(name))

        # Just add to 'try' block
        try_.try_block.add_assignment(name, codegen.String('x'))
        # Not all branches define name, so overall can't trust the name
        # to be defined at the end.
        self.assertFalse(try_.has_assignment_for_name(name))

        # Now add to 'except' block as well
        try_.except_block.add_assignment(name, codegen.String('x'), allow_multiple=True)
        self.assertTrue(try_.has_assignment_for_name(name))
Пример #4
0
    def test_multiple_add_assignment_in_inherited_scope(self):
        # try/if etc inherit their scope from function
        scope = codegen.Scope()
        scope.reserve_name('myfunc')
        func = codegen.Function('myfunc',
                                args=[],
                                parent_scope=scope)
        try_ = codegen.Try([], func)
        name = func.reserve_name('name')

        # We'd really like to ensure no multiple assignments ever,
        # but the way that if/try etc. work make that hard.
        # Instead, we add a keyword argument to allow the second assignment.
        try_.try_block.add_assignment(name, codegen.Number(1))
        self.assertRaises(AssertionError,
                          try_.try_block.add_assignment,
                          name, codegen.Number(2))
        self.assertRaises(AssertionError,
                          try_.except_block.add_assignment,
                          name, codegen.Number(2))
        try_.except_block.add_assignment(name, codegen.Number(2),
                                         allow_multiple=True)
Пример #5
0
 def test_try_catch(self):
     scope = codegen.Scope()
     scope.reserve_name('MyError')
     try_ = codegen.Try([scope.variable('MyError')], scope)
     self.assertCodeEqual(as_source_code(try_), """
         try:
             pass
         except MyError:
             pass
     """)
     scope.reserve_name('x')
     scope.reserve_name('y')
     scope.reserve_name('z')
     try_.try_block.add_assignment('x', codegen.String("x"))
     try_.except_block.add_assignment('y', codegen.String("y"))
     try_.else_block.add_assignment('z', codegen.String("z"))
     self.assertCodeEqual(as_source_code(try_), """
         try:
             x = 'x'
         except MyError:
             y = 'y'
         else:
             z = 'z'
     """)