Flatten arbitrary depth of nesting. Good for unknown nesting structure
    iterable object.

    Example::

        >>> list(flatten_all([[1, 2], "abc", [3, ["x", "y", "z"]], 4]))
        [1, 2, "abc", 3, "x", "y", "z", 4]

    **中文文档**

    将任意维度的列表压平成一维列表。

    注: 使用hasattr(i, "__iter__")方法做是否是可循环对象的判断, 性能要高于其他
    任何方法, 例如: isinstance(i, collections.Iterable)

def flatten_all(nested_iterable):
    """Flatten arbitrary depth of nesting. Good for unknown nesting structure
    iterable object.

    Example::

        >>> list(flatten_all([[1, 2], "abc", [3, ["x", "y", "z"]], 4]))
        [1, 2, "abc", 3, "x", "y", "z", 4]

    **中文文档**

    将任意维度的列表压平成一维列表。

    注: 使用hasattr(i, "__iter__")方法做是否是可循环对象的判断, 性能要高于其他
    任何方法, 例如: isinstance(i, collections.Iterable)
    """
    for item in nested_iterable:
        if hasattr(item, "__iter__") and not isinstance(item, string_types):
            for i in flatten_all(item):
                yield i
        else:
            yield item