code: def get_engineering_step_params(f: callable) -> Tuple[str]:
      """Verify that callable `f` requests valid input parameters, and returns a tuple of the same
      parameters, with the assumption that the parameters are modified by `f`
  
      Parameters
      ----------
      f: Callable
          Feature engineering step function that requests, modifies, and returns datasets
  
      Returns
      -------
      Tuple
          Argument/return value names declared by `f`
  
      Examples
      --------
      >>> def impute_negative_one(all_inputs):
      ...     all_inputs.fillna(-1, inplace=True)
      ...     return all_inputs
      >>> get_engineering_step_params(impute_negative_one)
      ('all_inputs',)
      >>> def standard_scale(train_inputs, non_train_inputs):
      ...     scaler = StandardScaler()
      ...     train_inputs[train_inputs.columns] = scaler.fit_transform(train_inputs.values)
      ...     non_train_inputs[train_inputs.columns] = scaler.transform(non_train_inputs.values)
      ...     return train_inputs, non_train_inputs
      >>> get_engineering_step_params(standard_scale)
      ('train_inputs', 'non_train_inputs')
      >>> def error_invalid_dataset(train_inputs, foo):
      ...     return train_inputs, foo
      >>> get_engineering_step_params(error_invalid_dataset)
      Traceback (most recent call last):
          File "feature_engineering.py", line ?, in get_engineering_step_params
      ValueError: Invalid dataset name: 'foo'"""
      valid_datasets = MERGED_DATASET_NAMES + STANDARD_DATASET_NAMES
      source_code = getsource(f)
      tree = ast.parse(source_code)
  
      #################### Add Links to Nodes' Parents ####################
      for node in ast.walk(tree):
          for child in ast.iter_child_nodes(node):
              child.parent = node
  
      #################### Collect Parameters and Returns ####################
      parser = ParameterParser()
      parser.visit(tree)
  
      for name in parser.args:
          if name not in valid_datasets:
              raise ValueError(f"Invalid dataset name: {name!r}")
          if name.endswith("_data"):
              raise ValueError(
                  f"Sorry, 'data'-suffixed parameters like {name!r} are not supported yet. "
                  "Try using both the 'inputs' and 'targets' params for this dataset, instead!"
              )
  
      return tuple(parser.args)
  
imports: from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.space.dimensions import Categorical, RejectedOptional
  from hyperparameter_hunter.utils.boltons_utils import remap, default_visit, default_enter
  from hyperparameter_hunter.utils.general_utils import subdict
  import ast
  from contextlib import suppress
  from inspect import getsource
  import numpy
  import pandas
  from typing import List, Callable, Dict, Union, Tuple
label_desc: Use image node_id 6 for calling a global function with example usage: get_engineering_step_params(f) and returns: tuple