首页 > 解决方案 > 为什么我尝试解压地图会导致“TypeError:'int' object is not iterable”

问题描述

我知道TypeError: 'int' object is not iterable当我们尝试迭代不可迭代的东西时会发生这种情况。例如,

for x in 4:
    pass

m = map(str, 99)

就我而言,我构建了一张地图,即使有问题,它也不会失败,直到以后。类似以下行的东西执行得很好

m = map(foo, [1, 2, 3])

问题出在我的功能foo上。后来,当我尝试解包映射迭代器时,例如通过写作list(m)foo提出了TypeError我只是不知道为什么。

import itertools    

def contains_iter(cont):
    """
    returns true if container is an iterator
                 or
                 if container is not an iterator
                 but container contains an iterator
                 or
                 if container is not an iterator
                 but container contains a container
                 which contains an iterator.
                 etc...
    """
    range_type = type(range(1))
    if hasattr(cont, "__next__") or isinstance(cont, range_type):
        return True
    try:
        for elem in cont:
            if elem == cont:
                # string "a" in "a"
                break
            if contains_iter(elem):
                return True
        r = False
    except TypeError:
        # object is not iterable
        r = False
    finally:
        pass
    return r

def deiter(it):
    status = contains_iter(it)
    if status:
        assert(hasattr(it, "__iter__"))
        mahp = map(deiter, it)
        tup = tuple(mahp)
        return tup
    return it


def print_io(inny):
    def outty(*args):
        args = deiter(args)
        try:
            output = inny(*args)
        except BaseException as exc:
            output = str(type(exc)) + str(exc)
        output = deiter(output)
        call_sig = "flatten" + str(args)
        output = "OUTPUT:  " + str(output)
        print(40*"#", call_sig, output, 40*"#", sep="\n")
        return
    return outty

class FlatClass:
    def __call__(self, *args):
        try:
            if len(args) <= 1:
                try:
                    r = iter(args[0])
                except BaseException:
                    r = args[0]
                    # if len(args) == 0
                    # `args[0]` raises
                    # exception
            else:
                args = map(self, args)
                r = itertools.chain(*args)
        except IndexError:
            r = tuple() # empty tuple
        finally:
            pass
        return r

flatten = print_io(FlatClass())

flatten(1, [2])

标签: pythonpython-3.xiterator

解决方案


你有一个itertools.chain电话试图链接不是可迭代的东西:

else:
    args = map(self, args)
    r = itertools.chain(*args)

其中一些参数是整数。创建链迭代器时不会检测到这一点,只有当您最终尝试迭代它时才会检测到。

由于不知道这段代码的目标是什么,我们不能说如何修复它。这段代码还有很多其他部分是可疑的(范围不是迭代器)、无目的的(finally: pass)或不必要的复杂(range_type = type(range(1))只是集合range_type = range),而且几乎可以肯定还有更多的错误,但这是导致直接问题的原因。


推荐阅读