def igetattr(self, name, context=None, class_context=True):
<EOL>context = contextmod.copy_context(context)<EOL>context.lookupname = name<EOL>try:<EOL><INDENT>attr = self.getattr(name, context, class_context=class_context)[<NUM_LIT:0>]<EOL>for inferred in bases._infer_stmts([attr], context, frame=self):<EOL><INDENT>if not isinstance(inferred, node_classes.Const) and isinstance(<EOL>inferred, bases.Instance<EOL>):<EOL><INDENT>try:<EOL><INDENT>inferred._proxied.getattr("<STR_LIT>", context)<EOL><DEDENT>except exceptions.AttributeInferenceError:<EOL><INDENT>yield inferred<EOL><DEDENT>else:<EOL><INDENT>yield util.Uninferable<EOL><DEDENT><DEDENT>else:<EOL><INDENT>yield function_to_method(inferred, self)<EOL><DEDENT><DEDENT><DEDENT>except exceptions.AttributeInferenceError as error:<EOL><INDENT>if not name.startswith("<STR_LIT>") and self.has_dynamic_getattr(context):<EOL><INDENT>yield util.Uninferable<EOL><DEDENT>else:<EOL><INDENT>raise exceptions.InferenceError(<EOL>error.message, target=self, attribute=name, context=context<EOL>)<EOL><DEDENT><DEDENT>
Infer the possible values of the given variable.

        :param name: The name of the variable to infer.
        :type name: str

        :returns: The inferred possible values.
        :rtype: iterable(NodeNG or Uninferable)