<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_py3_info():
 """ Inspect Py3 class and get constants, exceptions, methods along with their docstrings. """

    # get all documented constants and their values
    constants, values = get_variable_docstrings("../py3status/py3.py")
    # we only care about ones defined in Py3
    constants = constants["Py3"]
    # sort them alphabetically
    constants = [(k, v) for k, v in sorted(constants.items())]

    # filter values as we only care about values defined in Py3
    values = dict([(v, k[4:]) for k, v in values.items() if k.startswith("Py3.")])

    def make_value(attr, arg, default):
        """
        If the methods parameter is defined as a constant then do a
        replacement.  Otherwise return the values representation.
        """
        if (attr, arg) in CONSTANT_PARAMS and default in values:
            return values[default]
        return repr(default)

    # inspect Py3 to find it's methods etc
    py3 = Py3()
    # no private ones
    attrs = [x for x in dir(py3) if not x.startswith("_")]
    exceptions = []
    methods = []
    for attr in attrs:
        item = getattr(py3, attr)
        if "method" in str(item):
            # a method so we need to get the call parameters
            args, vargs, kw, defaults = inspect.getargspec(item)
            args = args[1:]
            len_defaults = len(defaults) if defaults else 0
            len_args = len(args)

            sig = []
            for index, arg in enumerate(args):
                # default values set?
                if len_args - index <= len_defaults:
                    default = defaults[len_defaults - len_args + index]
                    sig.append("%s=%s" % (arg, make_value(attr, arg, default)))
                else:
                    sig.append(arg)

            definition = "%s(%s)" % (attr, ", ".join(sig))
            methods.append((definition, item.__doc__))
            continue
        try:
            # find any exceptions
            if isinstance(item(), Exception):
                exceptions.append((attr, item.__doc__))
                continue
        except:  # noqa e722
            pass
    return {"methods": methods, "exceptions": exceptions, "constants": constants}