appropriately view a given dict/list/tuple/object data structure

def Dumper(obj, indent=0, increase=4, encoding='utf-8'):
    """appropriately view a given dict/list/tuple/object data structure"""
    ##############################################################################
    def p(given):
        """ensure proper decoding from unicode, if necessary"""
        if isinstance(given, str):  return given.encode(encoding)
        else:                       return given
    ##############################################################################
    try:
        if isinstance(obj, dict):
            for k,v in obj.items():
                if hasattr(v, "__iter__"):
                    print("%s%s"%(" "*(indent), p(k)))
                    Dumper(v, indent=indent+increase, increase=increase)
                else: print("%s%s=%s"%(" "*(indent), p(k), p(v)))
        elif isinstance(obj, list):
            for o in obj:
                Dumper(o, indent=indent, increase=increase) # didn't print anything this go-round
        elif isinstance(obj, tuple):
            print("%s%s"%(" "*(indent), p(obj[0])))
            next = list(obj)[1:]
            if len(next) == 1:  next = next[0]
            else:               next = tuple(next)
            Dumper(next, indent=indent+increase, increase=increase)
        elif isinstance(obj, str):
            print("%s%s"%(" "*(indent), p(obj))) # universally convert back to str for printing
        elif obj!=None:
            print("%s%s"%(" "*(indent), p(obj)))
    except Exception:
        print(type(obj), obj)