from typing import Iterable
from typing import Any


def parametrize(arg_names: Iterable[str], arg_values: Iterable[Iterable[Any]]):
    """
    Decorator to create parameterized tests.

    # Parameters

    arg_names : `Iterable[str]`, required.
        Argument names to pass to the test function.
    arg_values : `Iterable[Iterable[Any]]`, required.
        Iterable of values to pass to each of the args.
        The decorated test will be run for each inner iterable.
    """

    def decorator(func):
        def wrapper(*args, **kwargs):
            for arg_value in arg_values:
                kwargs_extra = {name: value for name, value in zip(arg_names, arg_value)}
                func(*args, **kwargs, **kwargs_extra)

        return wrapper

    return decorator