from typing import Container
from typing import List
import inspect


def get_unannotated_params(func, annotations: Container) -> List[str]:
    """ Return a list of ``func`` argument names which are not type annotated.

    ``annotations`` should be a result of get_type_hints call for ``func``.

    >>> from typing import get_type_hints
    >>> def foo(x, y: str, *, z, w: int, **kwargs): pass
    >>> annotations = get_type_hints(foo)
    >>> get_unannotated_params(foo, annotations)
    ['x', 'z']
    """
    ARGS_KWARGS = {
        inspect.Parameter.VAR_POSITIONAL,  # *args argument
        inspect.Parameter.VAR_KEYWORD      # **kwargs argument
    }
    res = []
    for name, param in inspect.signature(func).parameters.items():
        if name in annotations or param.kind in ARGS_KWARGS:
            continue
        res.append(name)
    return res