code: def _get(self, key_path, key_index=0, default=UndefinedKey):
      key_elt = key_path[key_index]
      elt = super(ConfigTree, self).get(key_elt, UndefinedKey)
  
      if elt is UndefinedKey:
          if default is UndefinedKey:
              raise ConfigMissingException(
                  "No configuration setting found for key {key}".format(
                      key=".".join(key_path[: key_index + 1])
                  )
              )
          else:
              return default
  
      if key_index == len(key_path) - 1:
          if isinstance(elt, NoneValue):
              return None
          elif isinstance(elt, list):
              return [
                  None if isinstance(x, NoneValue) else x for x in elt
              ]
          else:
              return elt
      elif isinstance(elt, ConfigTree):
          return elt._get(key_path, key_index + 1, default)
      else:
          if default is UndefinedKey:
              raise ConfigWrongTypeException(
                  "{key} has type {type} rather than dict".format(
                      key=".".join(key_path[: key_index + 1]),
                      type=type(elt).__name__,
                  )
              )
          else:
              return default
  
imports: from collections import OrderedDict
  from pyparsing import lineno
  from pyparsing import col
  import re
  import copy
  from .exceptions import ConfigException, ConfigWrongTypeException, ConfigMissingException
label_desc: Use image node_id 5 for calling the ConfigTree obj's underlying member method code with example usage: obj._get(key_path, key_index, default) and returns: default, None, elt, unknown, elt, default