code: def _merge_a_into_b(a, b):
      """Merge config dictionary a into config dictionary b, clobbering the
      options in b whenever they are also specified in a.
      """
      if type(a) is not edict:
          return
  
      for k, v in a.iteritems():
          # a must specify keys that are in b
          if not b.has_key(k):
              raise KeyError("{} is not a valid config key".format(k))
  
          # the types must match, too
          old_type = type(b[k])
          if old_type is not type(v):
              if isinstance(b[k], np.ndarray):
                  v = np.array(v, dtype=b[k].dtype)
              else:
                  raise ValueError(
                      (
                          "Type mismatch ({} vs. {}) "
                          "for config key: {}"
                      ).format(type(b[k]), type(v), k)
                  )
  
          # recursively merge dicts
          if type(v) is edict:
              try:
                  _merge_a_into_b(a[k], b[k])
              except:
                  print("Error under config key: {}".format(k))
                  raise
          else:
              b[k] = v
  
imports: import os
  import os.path
  import numpy
  from easydict import EasyDict
label_desc: Use image node_id 2 for calling a global function with example usage: _merge_a_into_b(a, b) without return types