def visit_Attribute(self, node): """Get attribute with fallback to dictionary lookup. Note: Variables starting with an underscore are exempt (reserved for internal use); as are the default system symbols. """ if isinstance(node.value, ast.Name) and \ (node.value.id.startswith('_') or node.value.id in SYMBOLS): return ASTTransformer.visit_Attribute(self, node) ## This should be spellable as ## return ast.Call( ## ast.Name(config.SYMBOLS.lookup_attr, ast.Load()), ## [self.visit(node.value), ast.Str(node.attr)], ## [], None, None) ## .. except Python 2.5 doesn't allow it. call = ast.Call() name = ast.Name() name.id = config.SYMBOLS.lookup_attr name.ctx = ast.Load() call.func = name string = ast.Str() string.s = node.attr args = [self.visit(node.value), string] call.args = args call.keywords = [] call.starargs = None call.kwargs = None return call
def visit_FunctionDef(self, node): if len(self.locals) > 1: self.locals[-1].add(node.name) self.names.add(node.name) # process defaults *before* defining parameters node.args.defaults = tuple(self.visit(x) for x in node.args.defaults) if node.args.args: argnames = [arg.id for arg in node.args.args] self.locals.append(set(argnames)) argnames = set(argnames) newnames = argnames.difference(self.names) self.names.update(newnames) try: return ASTTransformer.visit_FunctionDef(self, node) finally: if node.args.args: self.locals.pop() self.names -= newnames
def visit_FunctionDef(self, node): if len(self.locals) > 1: self.locals[-1].add(node.name) self.names.add(node.name) # process defaults *before* defining parameters node.args.defaults = tuple( self.visit(x) for x in node.args.defaults) if node.args.args: argnames = [arg.id for arg in node.args.args] self.locals.append(set(argnames)) argnames = set(argnames) newnames = argnames.difference(self.names) self.names.update(newnames) try: return ASTTransformer.visit_FunctionDef(self, node) finally: if node.args.args: self.locals.pop() self.names -= newnames
def visit_Delete(self, node): ASTTransformer.visit_Delete(self, node) # drop node pass
def visit_Assign(self, node): node.value = self.visit(node.value) return ASTTransformer.visit_Assign(self, node)