def func(nargs: Optional[int] = None, nouts: Optional[int] = None, ndefs: Optional[int] = None):
    """
        decorates normal function to Function with (optional) number of arguments and outputs.

        : func(nargs: Optional[int] = None, nouts: Optional[int] = None, ndefs: Optional[int] = None)
    """
    return lambda f: wraps(f)(WrappedFunction(f, nargs=nargs, nouts=nouts, ndefs=ndefs))
decorates normal function to Function with (optional) number of arguments and outputs.

        : func(nargs: Optional[int] = None, nouts: Optional[int] = None, ndefs: Optional[int] = None)