def see(obj=DEFAULT_ARG, *args, **kwargs):
    """
    see(obj=anything)

    Show the features and attributes of an object.

    This function takes a single argument, ``obj``, which can be of any type.
    A summary of the object is printed immediately in the Python interpreter.
    For example::

        >>> see([])
            []            in            +             +=            *
            *=            <             <=            ==            !=
            >             >=            dir()         hash()
            help()        iter()        len()         repr()
            reversed()    str()         .append()     .clear()
            .copy()       .count()      .extend()     .index()
            .insert()     .pop()        .remove()     .reverse()
            .sort()

    If this function is run without arguments, it will instead list the objects
    that are available in the current scope. ::

        >>> see()
            os        random    see()     sys

    The return value is an instance of :class:`SeeResult`.
    """
    use_locals = obj is DEFAULT_ARG

    if use_locals:
        # Get the local scope from the caller's stack frame.
        # Typically this is the scope of an interactive Python session.
        obj = Namespace(inspect.currentframe().f_back.f_locals)

    tokens = []
    attrs = dir(obj)

    if not use_locals:

        for name, func in INSPECT_FUNCS:
            if func(obj):
                tokens.append(name)

        for feature in FEATURES:
            if feature.match(obj, attrs):
                tokens.append(feature.symbol)

    for attr in filter(lambda a: not a.startswith('_'), attrs):
        try:
            prop = getattr(obj, attr)
        except (AttributeError, Exception):  # pylint: disable=broad-except
            prop = SeeError()
        action = output.display_name(name=attr, obj=prop, local=use_locals)
        tokens.append(action)

    if args or kwargs:
        tokens = handle_deprecated_args(tokens, args, kwargs)

    return output.SeeResult(tokens)
see(obj=anything)

    Show the features and attributes of an object.

    This function takes a single argument, ``obj``, which can be of any type.
    A summary of the object is printed immediately in the Python interpreter.
    For example::

        >>> see([])
            []            in            +             +=            *
            *=            <             <=            ==            !=
            >             >=            dir()         hash()
            help()        iter()        len()         repr()
            reversed()    str()         .append()     .clear()
            .copy()       .count()      .extend()     .index()
            .insert()     .pop()        .remove()     .reverse()
            .sort()

    If this function is run without arguments, it will instead list the objects
    that are available in the current scope. ::

        >>> see()
            os        random    see()     sys

    The return value is an instance of :class:`SeeResult`.