code: def display(obj, skiphidden=True, **printargs):
      top = findnode(obj)
      maxhex = len(hex(ctypes.sizeof(top.type))) - 2
      def addrformat(addr):
          if isinstance(addr, int):
              return "0x{0:0{1}X}".format(addr, maxhex)
          else:
              intpart = int(addr)
              fracbits = int((addr - intpart) * 8)
              return "0x{0:0{1}X}'{2}".format(intpart, maxhex, fracbits)
      def formatval(here):
          if isinstance(here, BoundSimpleNode):
              return "{0}({1})".format(here.type.__name__, here.value)
          else:
              return str(here.value)
      if isinstance(top, UnboundNode):
          headers = ['Path', 'Addr', 'Type']
          results = [
              (('  ' * n.depth) + n.name, addrformat(n.baseoffset), n.type.__name__)
                  for n in walknode(top, skiphidden)
          ]
      else:
          headers = ['Path', 'Addr', 'Value']
          results = [
              (('  ' * n.depth) + n.name, addrformat(n.baseoffset), formatval(n))
                  for n in walknode(top, skiphidden)
          ]
      widths = [
          max(max(len(d[col]) for d in results), len(h))
              for col, h in enumerate(headers)
      ]
      def lp(args):
          print(*args, **printargs)
      lp(d.center(w) for d, w in zip(headers, widths))
      lp('-' * w for w in widths)
      for r in results:
          lp(d.ljust(w) for d, w in zip(r, widths))