docstr: Base class to handle making key hashes and checking for their existence. Additionally,
  this class handles saving entries for complex-typed parameters, along with their hashes to
  ensure experiments are reproducible
  
  Parameters
  ----------
  parameters: Dict
      All the parameters to be included when creating the key hash. Keys should correspond to
      parameter names, and values should be the values of the corresponding keys
  **kwargs: Dict
      Additional arguments
  
  Attributes
  ----------
  parameters: Dict
      A deep copy of the given `parameters` input
  key: Str, or None
      If a key has been generated for `parameters`, it is saved here. Else, None
  exists: Boolean
      True if `key` is not None, and already exists in `tested_keys_dir`. Else, False
  lookup_dir: Str
      The directory in which complex-typed parameter entries will be saved
  tested_keys_dir: Str, or None
      The directory is which `key` will be saved if it does not already contain `key`
docstr_tok: ["Base","class","to","handle","making","key","hashes","and","checking","for","their","existence",".","Additionally",",","this","class","handles","saving","entries","for","complex-typed","parameters",",","along","with","their","hashes","to","ensure","experiments","are","reproducible","Parameters","--","--","--","--","--","parameters",":","Dict","All","the","parameters","to","be","included","when","creating","the","key","hash",".","Keys","should","correspond","to","parameter","names",",","and","values","should","be","the","values","of","the","corresponding","keys","*","*","kwargs",":","Dict","Additional","arguments","Attributes","--","--","--","--","--","parameters",":","Dict","A","deep","copy","of","the","given","`","parameters","`","input","key",":","Str",",","or","None","If","a","key","has","been","generated","for","`","parameters","`",",","it","is","saved","here",".","Else",",","None","exists",":","Boolean","True","if","`","key","`","is","not","None",",","and","already","exists","in","`","tested_keys_dir","`",".","Else",",","False","lookup_dir",":","Str","The","directory","in","which","complex-typed","parameter","entries","will","be","saved","tested_keys_dir",":","Str",",","or","None","The","directory","is","which","`","key","`","will","be","saved","if","it","does","not","already","contain","`","key","`"]
code: def __init__(self, parameters, **kwargs):
      """Base class to handle making key hashes and checking for their existence. Additionally,
      this class handles saving entries for complex-typed parameters, along with their hashes to
      ensure experiments are reproducible
  
      Parameters
      ----------
      parameters: Dict
          All the parameters to be included when creating the key hash. Keys should correspond to
          parameter names, and values should be the values of the corresponding keys
      **kwargs: Dict
          Additional arguments
  
      Attributes
      ----------
      parameters: Dict
          A deep copy of the given `parameters` input
      key: Str, or None
          If a key has been generated for `parameters`, it is saved here. Else, None
      exists: Boolean
          True if `key` is not None, and already exists in `tested_keys_dir`. Else, False
      lookup_dir: Str
          The directory in which complex-typed parameter entries will be saved
      tested_keys_dir: Str, or None
          The directory is which `key` will be saved if it does not already contain `key`
      """
      self.parameters = deepcopy(parameters)
      self.key = None
      self.exists = False
  
      self.lookup_dir = None
      self.tested_keys_dir = None
  
      self.validate_environment()
      self.handle_complex_types()
      self.make_key()
  
      self.does_key_exist()
  
imports: from hyperparameter_hunter.feature_engineering import FeatureEngineer, EngineerStep
  from hyperparameter_hunter.i_o.exceptions import EnvironmentInvalidError, EnvironmentInactiveError
  from hyperparameter_hunter.keys.hashing import make_hash_sha256
  from hyperparameter_hunter.compat.keras_helper import keras_callback_to_dict, keras_initializer_to_dict, parameterize_compiled_keras_model
  from hyperparameter_hunter.compat.keras_optimization_helper import initialize_dummy_model
  from hyperparameter_hunter.metrics import Metric
  from hyperparameter_hunter.sentinels import Sentinel
  from hyperparameter_hunter.settings import G
  from hyperparameter_hunter.utils.file_utils import write_json, read_json, add_to_json, make_dirs
  from hyperparameter_hunter.utils.file_utils import RetryMakeDirs
  from hyperparameter_hunter.utils.general_utils import subdict
  from hyperparameter_hunter.utils.boltons_utils import remap, default_enter
  from abc import ABCMeta, abstractmethod
  from copy import deepcopy
  from functools import partial
  from inspect import isclass, getsource
  from os import listdir
  import os.path
  import pandas
  import shelve
label_desc: Use image node_id 1 to create a new KeyMaker object  with example: obj = KeyMaker(parameters)