def visit_Name(self, node): # If the name refers to a local inside a lambda, list comprehension, or # generator expression, leave it alone if isinstance(node.ctx, _ast.Load) and \ node.id not in flatten(self.locals): # Otherwise, translate the name ref into a context lookup name = _new(_ast.Name, '_lookup_name', _ast.Load()) namearg = _new(_ast.Name, '__data__', _ast.Load()) strarg = _new(_ast.Str, node.id) node = _new(_ast.Call, name, [namearg, strarg], []) elif isinstance(node.ctx, _ast.Store): if len(self.locals) > 1: self.locals[-1].add(node.id) return node
def visit_Attribute(self, node): if not isinstance(node.ctx, _ast.Load): return ASTTransformer.visit_Attribute(self, node) func = _new(_ast.Name, '_lookup_attr', _ast.Load()) args = [self.visit(node.value), _new(_ast.Str, node.attr)] return _new(_ast.Call, func, args, [])