code: def prune(self, prune_zero=False, prune_empty_list=True):
          
          for key, val in list(self.items()):
              if ((not val) and ((val != 0) or prune_zero) and
                      not isinstance(val, list)):
                  del self[key]
              elif isinstance(val, Dict):
                  val.prune(prune_zero, prune_empty_list)
                  if not val:
                      del self[key]
              elif isinstance(val, (list, tuple)):
                  new_iter = self._prune_iter(val, prune_zero, prune_empty_list)
                  if (not new_iter) and prune_empty_list:
                      del self[key]
                  else:
                      if isinstance(val, tuple):
                          new_iter = tuple(new_iter)
                      self[key] = new_iter
docs: Removes all empty Dicts and falsy stuff inside the Dict.
          E.g
          >>> a = Dict()
          >>> a.b.c.d
          {}
          >>> a.a = 2
          >>> a
          {'a': 2, 'b': {'c': {'d': {}}}}
          >>> a.prune()
          >>> a
          {'a': 2}
          Set prune_zero=True to remove 0 values
          E.g
          >>> a = Dict()
          >>> a.b.c.d = 0
          >>> a.prune(prune_zero=True)
          >>> a
          {}
          Set prune_empty_list=False to have them persist
          E.g
          >>> a = Dict({'a': []})
          >>> a.prune()
          >>> a
          {}
          >>> a = Dict({'a': []})
          >>> a.prune(prune_empty_list=False)
          >>> a
          {'a': []}