python - 为什么我尝试解压地图会导致“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])
解决方案
你有一个itertools.chain
电话试图链接不是可迭代的东西:
else:
args = map(self, args)
r = itertools.chain(*args)
其中一些参数是整数。创建链迭代器时不会检测到这一点,只有当您最终尝试迭代它时才会检测到。
由于不知道这段代码的目标是什么,我们不能说如何修复它。这段代码还有很多其他部分是可疑的(范围不是迭代器)、无目的的(finally: pass
)或不必要的复杂(range_type = type(range(1))
只是集合range_type = range
),而且几乎可以肯定还有更多的错误,但这是导致直接问题的原因。
推荐阅读
- groovy - 使用 jsonSplurper.parseText(prev.getResponseDataAsString()) 后无法获取属性
- django - Webpack - 关闭对 /sockjs-node/info 的请求或指定不同的端口
- python - 如何在 virtualenv 中导入未在 pypi.org 上发布的依赖项?
- powershell - 如何在 gci 搜索中使用 Powershell Invoke-Item?
- node.js - 如何正确处理 S3 上重复提供的图像
- python - 单击下拉选项菜单中的元素 - Selenium Python
- java - 在两个 Spring Boot 应用程序之间传输大数据
- php - 通过对象属性访问函数中的变量会抛出非法偏移类型
- javascript - 无法获取作为传递道具的元素的值
- java - servlet 问题:javax.servlet.ServletException:实例化 servlet 类时出错