RequireArgs Usage

RequireArgs decorator defines required args for **kwargs of a function.

Includes features:

from kwhelp.decorator import TypeCheckKw, RequireArgs

@RequireArgs("speed", "limit", "name")
@TypeCheckKw(arg_info={"speed": 0, "limit": 0, "hours": 0, "name": 1},
                types=[(int, float), str])
def speed_msg(**kwargs) -> str:
    name = kwargs.get('name')
    limit = kwargs.get('limit')
    speed = kwargs.get('speed')
    if limit > speed:
        msg = f"Current speed is '{speed}'. {name} may go faster as the limit is '{limit}'."
    elif speed == limit:
        msg = f"Current speed is '{speed}'. {name} are at the limit."
    else:
        msg = f"Please slow down limit is '{limit}' and current speed is '{speed}'."
    if 'hours' in kwargs:
        msg = msg + f" Current driving hours is '{kwargs['hours']}'."
    return msg
>>> result = speed_msg(speed=45, limit=60, name="John")
>>> print(result)
Current speed is '45'. John may go faster as the limit is '60'.
>>> result = speed_msg(speed=45, limit=60)
>>> print(result)
ValueError: 'name' is a required arg.
>>> result = speed_msg(speed="Fast", limit=60, name="John")
>>> print(result)
TypeError: Arg 'speed' is expected to be of '<class 'int'> | <class 'float'>' but got 'str'