code: def visit_feature_engineer(path, key, value):
      """Helper to be used within a `visit` function intended for a `remap`-like function
  
      Parameters
      ----------
      path: Tuple
          The path of keys that leads to `key`
      key: String
          The parameter name
      value: Object
          The value of the parameter `key`
  
      Returns
      -------
      False if the value represents a dataset, or tuple of (`key`, <hash of `value`>). If neither of
      these are returned, a `ContinueRemap` exception is raised
  
      Raises
      ------
      ContinueRemap
          If a value is not returned by `visit_function_engineer`. For proper functioning, this raised
          `ContinueRemap` is assumed to be handled by the calling `visit` function. Usually, the
          `except` block for `ContinueRemap` will simply continue execution of `visit`
  
      Examples
      --------
      >>> visit_feature_engineer(("feature_engineer",), "datasets", dict())
      False
      >>> visit_feature_engineer(("feature_engineer", "steps"), "f", lambda _: _)  # pytest: +ELLIPSIS
      ('f', '...')
      >>> visit_feature_engineer(("feature_engineer", "steps"), "foo", lambda _: _)
      Traceback (most recent call last):
          File "optimization_utils.py", line ?, in visit_feature_engineer
      hyperparameter_hunter.i_o.exceptions.ContinueRemap: Just keep doing what you were doing
      >>> visit_feature_engineer(("feature_engineer",), "foo", dict())
      Traceback (most recent call last):
          File "optimization_utils.py", line ?, in visit_feature_engineer
      hyperparameter_hunter.i_o.exceptions.ContinueRemap: Just keep doing what you were doing
      >>> visit_feature_engineer(("foo",), "bar", dict())
      Traceback (most recent call last):
          File "optimization_utils.py", line ?, in visit_feature_engineer
      hyperparameter_hunter.i_o.exceptions.ContinueRemap: Just keep doing what you were doing
      """
      if path and path[0] == "feature_engineer":
          # Drop dataset hashes
          if key in (
              "datasets",
              "original_hashes",
              "updated_hashes",
          ) and isinstance(value, dict):
              return False
          # Ensure `EngineerStep.f` is hashed
          with suppress(IndexError):
              if path[1] == "steps" and key == "f" and callable(value):
                  return key, make_hash_sha256(value)
      raise ContinueRemap
  
file_path: hyperparameter_hunter/hyperparameter_hunter/utils/optimization_utils.py
imports: from hyperparameter_hunter.i_o.exceptions import ContinueRemap
  from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.space.dimensions import Real, Integer, Categorical, RejectedOptional
  from hyperparameter_hunter.utils.boltons_utils import get_path, remap
  from hyperparameter_hunter.utils.file_utils import read_json
  from hyperparameter_hunter.utils.general_utils import extra_enter_attrs
  from contextlib import suppress
  import pandas
label_desc: Use image node_id 5 for calling a global function with example usage: visit_feature_engineer(path, key, value) and returns: False, key,  make_hash_sha256