def filter_kwargs()

in mobile_cv/arch/utils/helper.py [0:0]


def filter_kwargs(func, kwargs, log_skipped=True):
    """Filter kwargs based on signature of `func`
    Return arguments that matches `func`
    """
    import inspect

    sig = inspect.signature(func)

    # if *args or **kwargs in the function, return all arguments
    param_types = {param.kind for param in sig.parameters.values()}
    var_types = {
        inspect.Parameter.VAR_KEYWORD,
        inspect.Parameter.VAR_POSITIONAL,
    }
    if len(param_types.intersection(var_types)) > 0:
        return kwargs

    filter_keys = [
        param.name
        for param in sig.parameters.values()
        if param.kind
        in [
            param.POSITIONAL_OR_KEYWORD,
            param.KEYWORD_ONLY,
            param.POSITIONAL_ONLY,
        ]
    ]

    if log_skipped:
        skipped_args = [x for x in kwargs.keys() if x not in filter_keys]
        if skipped_args:
            logger.warning(f"Arguments {skipped_args} skipped for op {func.__name__}")

    filtered_dict = {
        filter_key: kwargs[filter_key]
        for filter_key in filter_keys
        if filter_key in kwargs
    }
    return filtered_dict