class_docstr: Widget for displaying hierarchical python data structures
  (eg, nested dicts, lists, and arrays)
docstr: Given any python object, return:
    * type
    * a short string representation
    * a dict of sub-objects to be parsed
    * optional widget to display as sub-node
code: def parse(self, data):
      """
      Given any python object, return:
        * type
        * a short string representation
        * a dict of sub-objects to be parsed
        * optional widget to display as sub-node
      """
      # defaults for all objects
      typeStr = type(data).__name__
      if typeStr == "instance":
          typeStr += ": " + data.__class__.__name__
      widget = None
      desc = ""
      childs = {}
  
      # type-specific changes
      if isinstance(data, dict):
          desc = "length=%d" % len(data)
          if isinstance(data, OrderedDict):
              childs = data
          else:
              try:
                  childs = OrderedDict(sorted(data.items()))
              except TypeError:  # if sorting falls
                  childs = OrderedDict(data.items())
      elif isinstance(data, (list, tuple)):
          desc = "length=%d" % len(data)
          childs = OrderedDict(enumerate(data))
      elif HAVE_METAARRAY and (
          hasattr(data, "implements") and data.implements("MetaArray")
      ):
          childs = OrderedDict(
              [
                  ("data", data.view(np.ndarray)),
                  ("meta", data.infoCopy()),
              ]
          )
      elif isinstance(data, np.ndarray):
          desc = "shape=%s dtype=%s" % (data.shape, data.dtype)
          table = TableWidget()
          table.setData(data)
          table.setMaximumHeight(200)
          widget = table
      elif isinstance(
          data, types.TracebackType
      ):  ## convert traceback to a list of strings
          frames = list(
              map(
                  str.strip,
                  traceback.format_list(traceback.extract_tb(data)),
              )
          )
          # childs = OrderedDict([
          # (i, {'file': child[0], 'line': child[1], 'function': child[2], 'code': child[3]})
          # for i, child in enumerate(frames)])
          # childs = OrderedDict([(i, ch) for i,ch in enumerate(frames)])
          widget = QtWidgets.QPlainTextEdit("\n".join(frames))
          widget.setMaximumHeight(200)
          widget.setReadOnly(True)
      else:
          desc = str(data)
  
      return typeStr, desc, childs, widget
  
file_path: pyqtgraph/pyqtgraph/widgets/DataTreeWidget.py
imports: import traceback
  import types
  from collections import OrderedDict
  import numpy
  from ..Qt import QtWidgets
  from .TableWidget import TableWidget
label_desc: Use image node_id 4 for calling the DataTreeWidget obj's underlying member method code with example usage: obj.parse(data) and returns: typeStr,  desc,  childs,  widget