code: def igetattr(self, name, context=None, class_context=True):
          
          # set lookup name since this is necessary to infer on import nodes for
          # instance
          context = contextmod.copy_context(context)
          context.lookupname = name
          try:
              attr = self.getattr(name, context, class_context=class_context)[0]
              for inferred in bases._infer_stmts([attr], context, frame=self):
                  # yield Uninferable object instead of descriptors when necessary
                  if not isinstance(inferred, node_classes.Const) and isinstance(
                      inferred, bases.Instance
                  ):
                      try:
                          inferred._proxied.getattr("__get__", context)
                      except exceptions.AttributeInferenceError:
                          yield inferred
                      else:
                          yield util.Uninferable
                  else:
                      yield function_to_method(inferred, self)
          except exceptions.AttributeInferenceError as error:
              if not name.startswith("__") and self.has_dynamic_getattr(context):
                  # class handle some dynamic attributes, return a Uninferable object
                  yield util.Uninferable
              else:
                  raise exceptions.InferenceError(
                      error.message, target=self, attribute=name, context=context
                  )
docs: 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)