def visit_Raise(self, n): e = None if n.type is not None: e = self.visit(n.type) if n.inst is not None and not (isinstance(n.inst, ast27.Name) and n.inst.id == "None"): inst = self.visit(n.inst) if isinstance(inst, ast3.Tuple): args = inst.elts else: args = [inst] e = ast3.Call(e, args, [], lineno=e.lineno, col_offset=-1) ret = ast3.Raise(e, None) if n.tback is not None: ret.traceback = self.visit(n.tback) return ret
def _replace_return(self, parent: Any, return_: ast.Return) -> None: """Replace return with exception raising.""" index = parent.body.index(return_) parent.body.pop(index) exception = ast.Name(id='_py_backwards_generator_return_{}'.format( self._name_suffix)) raise_exception = ast.Raise(exc=exception, cause=None) parent.body.insert(index, raise_exception) set_value = ast.Assign(targets=[ ast.Attribute(value=exception, attr='value'), ], value=return_.value) parent.body.insert(index, set_value) assign = ast.Assign(targets=[exception], value=ast.Call(func=ast.Name(id='StopIteration'), args=[], keywords=[])) parent.body.insert(index, assign)