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))