def infer_getattr(self, context=None):
    """infer a Getattr node by using getattr on the associated object"""
    if not context:
        context = InferenceContext()
    for owner in self.expr.infer(context):
        if owner is YES:
            yield owner
            continue
        try:
            with context.scope(boundnode=owner):
                for obj in owner.igetattr(self.attrname, context):
                    yield obj
        except (NotFoundError, InferenceError):
            pass
        except AttributeError:
            # XXX method / function
            pass
def infer_callfunc(self, context=None):
    """infer a CallFunc node by trying to guess what the function returns"""
    if context is None:
        context = InferenceContext()
    for callee in self.func.infer(context):
        with context.scope(
            callcontext=CallContext(self.args, self.starargs, self.kwargs),
            boundnode=None,
        ):
            if callee is YES:
                yield callee
                continue
            try:
                if hasattr(callee, 'infer_call_result'):
                    for infered in callee.infer_call_result(self, context):
                        yield infered
            except InferenceError:
                ## XXX log error ?
                continue