def items(self): """method from the `dict` interface returning a list of tuple containing each locally defined name with its associated node, which is an instance of `Function` or `Class` """ return zip(self.keys(), self.values()) def has_key(self, name): """method from the `dict` interface returning True if the given name is defined in the locals dictionary """ return self.locals.has_key(name) __contains__ = has_key extend_class(Module, LocalsDictMixIn) extend_class(Class, LocalsDictMixIn) extend_class(Function, LocalsDictMixIn) extend_class(Lambda, LocalsDictMixIn) # GenExpr has it's own locals but isn't a frame extend_class(GenExpr, LocalsDictMixIn) def frame(self): return self.parent.frame() GenExpr.frame = frame class GetattrMixIn(object):
def items(self): """method from the `dict` interface returning a list of tuple containing each locally defined name with its associated node, which is an instance of `Function` or `Class` """ return zip(self.keys(), self.values()) def has_key(self, name): """method from the `dict` interface returning True if the given name is defined in the locals dictionary """ return self.locals.has_key(name) __contains__ = has_key extend_class(Module, LocalsDictMixIn) extend_class(Class, LocalsDictMixIn) extend_class(Function, LocalsDictMixIn) extend_class(Lambda, LocalsDictMixIn) # GenExpr has it's own locals but isn't a frame extend_class(GenExpr, LocalsDictMixIn) def frame(self): return self.parent.frame() GenExpr.frame = frame class GetattrMixIn(object): def getattr(self, name, context=None): try: return self.locals[name] except KeyError:
if skip_klass is not None and isinstance(child_node, skip_klass): continue for matching in child_node.nodes_of_class(klass, skip_klass): yield matching def _infer_name(self, frame, name): if isinstance(self, INFER_NEED_NAME_STMTS) or (isinstance( self, (Function, Lambda)) and self is frame): return name return None def eq(self, value): return False extend_class(Node, NodeNG) Const.eq = lambda self, value: self.value == value def decorators_scope(self): # skip the function node to go directly to the upper level scope return self.parent.parent.scope() Decorators.scope = decorators_scope # block range overrides ####################################################### def object_block_range(node, lineno):
for child_node in self.getChildNodes(): if skip_klass is not None and isinstance(child_node, skip_klass): continue for matching in child_node.nodes_of_class(klass, skip_klass): yield matching def _infer_name(self, frame, name): if isinstance(self, INFER_NEED_NAME_STMTS) or ( isinstance(self, (Function, Lambda)) and self is frame): return name return None def eq(self, value): return False extend_class(Node, NodeNG) Const.eq = lambda self, value: self.value == value def decorators_scope(self): # skip the function node to go directly to the upper level scope return self.parent.parent.scope() Decorators.scope = decorators_scope # block range overrides ####################################################### def object_block_range(node, lineno): """handle block line numbers range for function/class statements: start from the "def" or "class" position whatever the given lineno """