def METHOD_NAME(self, obj, descend=True):
    """Return a string representation of a single object."""
    if inspect.isframe(obj):
        filename, lineno, func, context, index = inspect.getframeinfo(obj)
        return "<frame of function '%s'>" % func
    if not descend:
        return self.peek(repr(obj))
    if isinstance(obj, dict):
        return '{' + ', '.join(['%s: %s' % (self.METHOD_NAME(k, descend=False),
                                            self.METHOD_NAME(v, descend=False))
                                for k, v in obj.items()]) + '}'
    elif isinstance(obj, list):
        return '[' + ', '.join([self.METHOD_NAME(item, descend=False)
                                for item in obj]) + ']'
    elif isinstance(obj, tuple):
        return '(' + ', '.join([self.METHOD_NAME(item, descend=False)
                                for item in obj]) + ')'
    r = self.peek(repr(obj))
    if isinstance(obj, (str, int, float)):
        return r
    return '%s: %s' % (type(obj), r)