code: def rget(obj, attrstr, default=None, delim='.'):  # pragma: no cover
      
      try:
          parts = attrstr.split(delim, 1)
          attr = parts[0]
          attrstr = parts[1] if len(parts) == 2 else None
          if isinstance(obj, dict):
              value = obj[attr]
          elif isinstance(obj, list):
              value = obj[int(attr)]
          elif isinstance(obj, tuple):
              value = obj[int(attr)]
          elif isinstance(obj, object):
              value = getattr(obj, attr)
          if attrstr:
              return rget(value, attrstr, default, delim)
          return value
      except:  # noqa: E722
          return default
docs: Returns the value at the specified attrstr location within a nexted tree of
          dicts, lists, tuples, functions, classes, etc. The lookup is done recursivley
          for each key in attrstr (split by by the delimiter) This function is heavily
          influenced by the lookups used in Django templates.
  
          Parameters:
              obj (any): Object to start the lookup in (dict, obj, list, tuple, etc).
              attrstr (str): String to lookup (ex: 'foo.bar.baz.value')
              default (any): Default value to return if not found.
              delim (str): Delimiter separating keys in attrstr.