def visit_FunctionDef(self, node): if self.decorate_func_name is None: self.decorate_func_name = node.name for idx, arg in enumerate(node.args.args): self.arg_name_to_idx[arg.id] = idx self.generic_visit(node) # Remove the decorated name of dygraph_to_static if hasattr(node, 'decorator_list'): decorator_list = [] for d in node.decorator_list: if isinstance(d, gast.Name) and d.id not in DECORATOR_NAMES: raise NotImplementedError( "ProgramTranslator hasn't implemented multiple decorators. Please remove " + d.id + " in " + self.decorate_func_name) if isinstance(d, gast.Attribute): full_attribute_name = get_attribute_full_name(d) has_translate_decorator = False for deco in DECORATOR_NAMES: if deco in full_attribute_name: has_translate_decorator = True break if not has_translate_decorator: raise NotImplementedError( "ProgramTranslator hasn't implemented multiple decorators. Please remove " + full_attribute_name + " in " + self.decorate_func_name) node.decorator_list = decorator_list return node
def visit_Attribute(self, node): if self._is_call_func_name_node(node): return attr_full_name = get_attribute_full_name(node) # Class variables are not allowed to appear in the arguments list # of defined function under class methods in Python. """ def class_func(self): def while_loop_body(self.x, y) # `self.x` is illegal. """ # TODO: If do change the variable with `self.var`, need a better # way to deal with this case. if attr_full_name.startswith("self."): return self.current_seen_vars.add(node) for loop_node in self.current_loop: self.in_loop_vars[loop_node].add(node)
def _var_node_to_name(self, node): if isinstance(node, gast.Name): return node.id elif isinstance(node, gast.Attribute): return get_attribute_full_name(node)