def unpack_infer(stmt, context=None): """return an iterator on nodes infered by the given statement if the infered value is a list or a tuple, recurse on it to get values infered by its content """ if isinstance(stmt, (List, Tuple)): # XXX loosing context return chain(*imap(unpack_infer, stmt.nodes)) infered = stmt.infer(context).next() if infered is stmt: return iter((stmt, )) return chain(*imap(unpack_infer, stmt.infer(context)))
def unpack_infer(stmt, context=None): """return an iterator on nodes infered by the given statement if the infered value is a list or a tuple, recurse on it to get values infered by its content """ if isinstance(stmt, (List, Tuple)): # XXX loosing context return chain(*map(unpack_infer, stmt.nodes)) infered = next(stmt.infer(context)) if infered is stmt: return iter( (stmt,) ) return chain(*map(unpack_infer, stmt.infer(context)))
def methods(self): """return an iterator on all methods defined in the class and its ancestors """ done = {} for astng in chain(iter((self, )), self.ancestors): for meth in astng.mymethods(): if done.has_key(meth.name): continue done[meth.name] = None yield meth
def methods(self): """return an iterator on all methods defined in the class and its ancestors """ done = {} for astng in chain(iter((self,)), self.ancestors()): for meth in astng.mymethods(): if done.has_key(meth.name): continue done[meth.name] = None yield meth
def infer_argument(self, funcnode, name, context): """infer a function argument value according the the call context""" # 1. search in named keywords try: return self.nargs[name].infer(context) except KeyError: # Function.argnames can be None in astng (means that we don't have # information on argnames) if funcnode.argnames is not None: try: argindex = funcnode.argnames.index(name) except ValueError: pass else: # 2. first argument of instance/class method if argindex == 0 and funcnode.type in ('method', 'classmethod'): if context.boundnode is not None: boundnode = context.boundnode else: # XXX can do better ? boundnode = funcnode.parent.frame() if funcnode.type == 'method': return iter((Instance(boundnode),)) if funcnode.type == 'classmethod': return iter((boundnode,)) # 2. search arg index try: return self.args[argindex].infer(context) except IndexError: pass # 3. search in *args (.starargs) if self.starargs is not None: its = [] for infered in self.starargs.infer(context): if infered is YES: its.append((YES,)) continue try: its.append(infered.getitem(argindex).infer(context)) except (InferenceError, AttributeError): its.append((YES,)) except IndexError: continue if its: return chain(*its) # 4. XXX search in **kwargs (.dstarargs) if self.dstarargs is not None: its = [] for infered in self.dstarargs.infer(context): if infered is YES: its.append((YES,)) continue try: its.append(infered.getitem(name).infer(context)) except (InferenceError, AttributeError): its.append((YES,)) except IndexError: continue if its: return chain(*its) # 5. */** argument, (Tuple or Dict) mularg = funcnode.mularg_class(name) if mularg is not None: # XXX should be able to compute values inside return iter((mularg,)) # 6. return default value if any try: return funcnode.default_value(name).infer(context) except NoDefault: raise InferenceError(name)