# From: https://[Log in to view URL]

import inspect
from sys import stdout

def _should_dump_repr(obj):
    return inspect.ismethod(obj)       \
           or inspect.isfunction(obj)  \
           or inspect.isgenerator(obj) \
           or inspect.istraceback(obj) \
           or inspect.isbuiltin(obj)

def _dump_helper(obj, indent, visited):
    if id(obj) in visited:
        stdout.write('\x1b[31mRecursion on %s with id=%i\x1b[0m' % (type(obj).__name__, id(obj)))
    elif obj is None:
        stdout.write('\x1b[3mNone\x1b[0m')
    elif isinstance(obj, str):
        stdout.write('\x1b[32m%s\x1b[0m' % repr(obj))
    elif isinstance(obj, bytes):
        stdout.write('b\x1b[32m%s\x1b[0m' % repr(obj)[1:])
    elif isinstance(obj, bool):
        stdout.write('\x1b[35m%s\x1b[0m' % obj)
    elif isinstance(obj, int) or isinstance(obj, float):
        stdout.write('\x1b[34m%s\x1b[0m' % obj)
    elif _should_dump_repr(obj):
        stdout.write('\x1b[36m%s\x1b[0m' % repr(obj))
    elif isinstance(obj, dict):
        if not obj:
            stdout.write('{}')
        else:
            stdout.write('{\n')
            visited.add(id(obj))
            for key, value in obj.items():
                stdout.write(' ' * 2 * (indent + 1))
                _dump_helper(key, indent + 1, visited)
                stdout.write(': ')
                _dump_helper(value, indent + 1, visited)
                stdout.write(',\n')

            visited.remove(id(obj))
            stdout.write('%s}' % (' ' * 2 * indent))

    elif isinstance(obj, set):
        if not obj:
            stdout.write('set()')
        else:
            stdout.write('{\n')
            visited.add(id(obj))
            for value in obj:
                stdout.write(' ' * 2 * (indent + 1))
                _dump_helper(value, indent + 1, visited)
                stdout.write(',\n')

            visited.remove(id(obj))
            stdout.write('%s}' % (' ' * 2 * indent))

    elif isinstance(obj, list):
        if not obj:
            stdout.write('[]')
        else:
            stdout.write('[\n')
            visited.add(id(obj))
            for value in obj:
                stdout.write(' ' * 2 * (indent + 1))
                _dump_helper(value, indent + 1, visited)
                stdout.write(',\n')

            visited.remove(id(obj))
            stdout.write('%s]' % (' ' * 2 * indent))

    elif isinstance(obj, tuple):
        if not obj:
            stdout.write('tuple()')
        else:
            stdout.write('(\n')
            visited.add(id(obj))
            for value in obj:
                stdout.write(' ' * 2 * (indent + 1))
                _dump_helper(value, indent + 1, visited)
                stdout.write(',\n')

            visited.remove(id(obj))
            stdout.write('%s)' % (' ' * 2 * indent))

    else:
        stdout.write(str(type(obj)))
        attrs = {}

        for name in dir(obj):
            if name[:2] == name[-2:] == '__' and len(name) > 4:
                continue

            try:
                value = getattr(obj, name)
                if inspect.ismethod(value) or inspect.isbuiltin(value):
                    continue

                attrs[name] = value
            except AttributeError:
                pass

        if attrs:
            stdout.write(' {\n')
            visited.add(id(obj))
            for key, value in attrs.items():
                stdout.write('%s\x1b[4m%s\x1b[0m: ' % (' ' * 2 * (indent + 1), key))
                _dump_helper(value, indent + 1, visited)
                stdout.write(',\n')

            visited.remove(id(obj))
            stdout.write('%s}' % (' ' * 2 * indent))

    if indent == 0:
        stdout.write('\n')

def dump(obj):
    return _dump_helper(obj, 0, set())

x = {'hello': ['a', 1, 2], 'world': ['foo', 'bar']}
x['world'].append(x['hello'])
x['hello'].append(x['world'])
dump(x)

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: