Tests if the given items are iterables (collections) but no strings.
        Per default this function yields whether ``True`` or ``False`` depending on the fact if all
        items withstand the validation or not. Per default the validation / evaluation is
        short-circuit and will return as soon an item evaluates to ``False``.

        When ``raise_ex`` is set to ``True`` the function will raise a meaningful error message
        after the first item evaluates to ``False`` (short-circuit).

        When ``summary`` is set to ``False`` a dictionary is returned containing the individual
        evaluation result of each item (non short-circuit).

        Examples:

            >>> l = ['i', 'am', 'an', 'iterable']
            >>> Validator.is_real_iterable(l=l)
            True

            >>> d = {'i': 'am', 'a': 'dict'}
            >>> Validator.is_real_iterable(d=d)
            True

            >>> s = "i am a string"
            >>> Validator.is_real_iterable(s=s)
            False

            >>> Validator.is_real_iterable(raise_ex=True, s=s)
            Traceback (most recent call last):
                ...
            ValueError: 's' is not an iterable

        Args:

            raise_ex (bool, optional): If set to ``True`` an exception is raised if at least one
            item is validated to ``False`` (works short-circuit and will abort the validation when
            the first item is evaluated to ``False``).

            summary (bool, optional): If set to ``False`` instead of returning just a single
            ``bool`` the validation will return a dictionary containing the individual evaluation
            result of each item.

        Returns:
            (boolean or dictionary): ``True`` when the value was successfully validated; ``False``
                otherwise.
            If ``summary`` is set to ``False`` a dictionary containing the individual evaluation
            result of each item will be returned.
            If ``raise_ex`` is set to True, instead of returning False a meaningful error will be
            raised.

def is_real_iterable(raise_ex: bool = False, summary: bool = True,
                         **items: Any) -> ValidationReturn:
        """
        Tests if the given items are iterables (collections) but no strings.
        Per default this function yields whether ``True`` or ``False`` depending on the fact if all
        items withstand the validation or not. Per default the validation / evaluation is
        short-circuit and will return as soon an item evaluates to ``False``.

        When ``raise_ex`` is set to ``True`` the function will raise a meaningful error message
        after the first item evaluates to ``False`` (short-circuit).

        When ``summary`` is set to ``False`` a dictionary is returned containing the individual
        evaluation result of each item (non short-circuit).

        Examples:

            >>> l = ['i', 'am', 'an', 'iterable']
            >>> Validator.is_real_iterable(l=l)
            True

            >>> d = {'i': 'am', 'a': 'dict'}
            >>> Validator.is_real_iterable(d=d)
            True

            >>> s = "i am a string"
            >>> Validator.is_real_iterable(s=s)
            False

            >>> Validator.is_real_iterable(raise_ex=True, s=s)
            Traceback (most recent call last):
                ...
            ValueError: 's' is not an iterable

        Args:

            raise_ex (bool, optional): If set to ``True`` an exception is raised if at least one
            item is validated to ``False`` (works short-circuit and will abort the validation when
            the first item is evaluated to ``False``).

            summary (bool, optional): If set to ``False`` instead of returning just a single
            ``bool`` the validation will return a dictionary containing the individual evaluation
            result of each item.

        Returns:
            (boolean or dictionary): ``True`` when the value was successfully validated; ``False``
                otherwise.
            If ``summary`` is set to ``False`` a dictionary containing the individual evaluation
            result of each item will be returned.
            If ``raise_ex`` is set to True, instead of returning False a meaningful error will be
            raised.

        """

        return Validator.__test_all(
            condition=lambda _, val: hasattr(val, '__iter__') and not isinstance(val, str),
            formatter=lambda name, _: "'{varname}' is not an iterable".format(varname=name),
            raise_ex=raise_ex,
            summary=summary,
            **items
        )