class_docstr: Dispatch methods based on type signature
  
  Use ``dispatch`` to add implementations
  
  Examples
  --------
  
  >>> from sympy.multipledispatch import dispatch
  >>> @dispatch(int)
  ... def f(x):
  ...     return x + 1
  
  >>> @dispatch(float)
  ... def f(x): # noqa: F811
  ...     return x - 1
  
  >>> f(3)
  4
  >>> f(3.0)
  2.0
code: def __call__(self, *args, **kwargs):
      types = tuple([type(arg) for arg in args])
      try:
          func = self._cache[types]
      except KeyError:
          func = self.dispatch(*types)
          if not func:
              raise NotImplementedError(
                  "Could not find signature for %s: <%s>"
                  % (self.name, str_signature(types))
              )
          self._cache[types] = func
      try:
          return func(*args, **kwargs)
  
      except MDNotImplementedError:
          funcs = self.dispatch_iter(*types)
          next(funcs)  # burn first
          for func in funcs:
              try:
                  return func(*args, **kwargs)
              except MDNotImplementedError:
                  pass
          raise NotImplementedError(
              "Matching functions for "
              "%s: <%s> found, but none completed successfully"
              % (self.name, str_signature(types))
          )
  
imports: from __future__ import annotations
  from warnings import warn
  import inspect
  from .conflict import ordering, ambiguities, super_signature, AmbiguityWarning
  from .utils import expand_tuples
  import itertools
label_desc: Use image node_id 7 for calling the Dispatcher obj's underlying member method code with example usage: obj.__call__() and returns: func, func