code: def inspect_node(mixed, *, _partial=None):
      
      if isconfigurabletype(mixed, strict=True):
          inst, typ = None, mixed
      elif isconfigurable(mixed):
          inst, typ = mixed, type(mixed)
      elif hasattr(mixed, "func"):
          return inspect_node(mixed.func, _partial=(mixed.args, mixed.keywords))
      else:
          raise TypeError(
              "Not a Configurable, nor a Configurable instance and not even a partially configured Configurable. Check your inputs."
          )
  
      return ConfigurableInspection(typ, inst, list(typ.__options__), list(typ.__processors__), _partial)
docs: If the given argument is somehow a :class:`bonobo.config.Configurable` object (either a subclass, an instance, or
      a partially configured instance), then it will return a :class:`ConfigurableInspection` namedtuple, used to inspect
      the configurable metadata (options). If you want to get the option values, you don't need this, it is only usefull
      to perform introspection on a configurable.
  
      If it's not looking like a configurable, it will raise a :class:`TypeError`.
  
      :param mixed:
      :return: ConfigurableInspection
  
      :raise: TypeError