code: def inference_tip(infer_function, raise_on_overwrite=False):
      
  
      def transform(node, infer_function=infer_function):
          if (
              raise_on_overwrite
              and node._explicit_inference is not None
              and node._explicit_inference is not infer_function
          ):
              raise InferenceOverwriteError(
                  "Inference already set to {existing_inference}. "
                  "Trying to overwrite with {new_inference} for {node}".format(
                      existing_inference=infer_function,
                      new_inference=node._explicit_inference,
                      node=node,
                  )
              )
          # pylint: disable=no-value-for-parameter
          node._explicit_inference = _inference_tip_cached(infer_function)
          return node
  
      return transform
docs: Given an instance specific inference function, return a function to be
      given to MANAGER.register_transform to set this inference function.
  
      :param bool raise_on_overwrite: Raise an `InferenceOverwriteError`
          if the inference tip will overwrite another. Used for debugging
  
      Typical usage
  
      .. sourcecode:: python
  
         MANAGER.register_transform(Call, inference_tip(infer_named_tuple),
                                    predicate)
  
      .. Note::
  
          Using an inference tip will override
          any previously set inference tip for the given
          node. Use a predicate in the transform to prevent
          excess overwrites.