docs: def print_object_size_tree(obj, lbl='obj', maxdepth=None):
      """ Needs work """
      from utool import util_str
      from utool import util_type
  
      byte_str2 = util_str.byte_str2
  
      def _get_object_size_tree(obj, depth=0, lbl='obj', seen=None):
          indent = ' ' * (depth * 4)
          if maxdepth is not None and depth >= maxdepth:
              size_list = [get_object_nbytes(obj)]
              print(indent + str(size_list[0]))
              return size_list
          if (obj is None or isinstance(obj, (int, bool, float))):
              return [sys.getsizeof(obj)]
          elif isinstance(obj, six.string_types):
              return [sys.getsizeof(obj)]
          object_id = id(obj)
          if object_id in seen:
              print(indent + '%s ' % ('(seen) ' + lbl,))
              return []
          seen.add(object_id)
          size_list = [(lbl, sys.getsizeof(obj))]
          if isinstance(obj, np.ndarray):
              size_list.append(obj.nbytes)
              print('%s%s = %s ' % (indent, '(ndarray) %s' % (lbl,), byte_str2(obj.nbytes)))
          elif (isinstance(obj, (tuple, list, set, frozenset))):
              typestr = util_type.type_str(type(obj))
              print('%s(%s) %s = %s ' % (indent, typestr, lbl, byte_str2(sys.getsizeof(obj))))
              for item in obj:
                  size_list += _get_object_size_tree(item, depth + 1, 'item', seen)
          elif isinstance(obj, dict):
              print('%s(dict) %s = %s ' % (indent, lbl, byte_str2(sys.getsizeof(obj))))
              try:
                  for key, val in six.iteritems(obj):
                      size_list += _get_object_size_tree(key, depth + 1, key, seen)
                      size_list += _get_object_size_tree(val, depth + 1, key, seen)
              except RuntimeError as dictex:
                  ut.printex(dictex, 'RuntimeError in parsing dict nbytes',
                             keys=['key', (type, 'obj')], iswarning=True)
                  raise
          elif isinstance(obj, object) and hasattr(obj, '__dict__'):
              if hasattr(obj, 'used_memory'):
                  size_ = obj.used_memory()
                  print('(%sflann?) %s = %s ' % (indent, lbl, byte_str2(size_)))
                  size_list += [size_]
              else:
                  print('%s(object) %s = %s ' % (indent, lbl, byte_str2(sys.getsizeof(obj))))
              size_list += _get_object_size_tree(obj.__dict__,
                                                 depth=depth + 1,
                                                 lbl='__dict__', seen=seen)
          return size_list
      seen = set([])
      _get_object_size_tree(obj, depth=0, lbl=lbl, seen=seen)
      del seen