已解决:好的,你们可能不会相信这一点。我做了很多挖掘,结果发现我们正在加载和使用的所有文件都是错误的。这些文件不符合我们正在编写的代码 - 根据我们加载的文件的当前状态,我们想要在程序中执行的操作根本不可能。我目前正在努力解决这个问题。对不起,对不起,伙计们!
在Python中,我的代码基本上如下所示:
partsList = getPartsList() # this function returns a list
for part in partsList:
...
bar(partsList)
def bar(partsList):
for part in partsList:
...
但是当我运行代码时,我得到以下TypeError:
TypeError: iteration over non-sequence
此TypeError
参考了以下注明的一行:
def bar(partsList):
for part in partsList: # this is the line with the TypeError
...
这怎么可能?我知道partsList
不是非序列,因为在我的程序调用{{1}}之前,我明确地迭代bar(partsList)
。
我的函数在与它交互之前不会修改partsList
,并且在调用函数之前迭代它时我不会修改partsList
,但它会以某种方式从列表变为非序列当函数被调用时。
我完全在一个班级内工作,所以这些都是实际的方法;我只是觉得如果以这种方式呈现代码会更容易阅读。
以下是对评论的回应:
我希望我能为您提供完整的代码,但目前该程序只需要运行275个文件,并且有20多个
partsList
个文件。我将提到有问题的方法在迭代之后通过其给定列表使用递归。我认为这可能与错误相关联,但是当尝试打印列表本身及其内容时,程序在之前提供相同的.py
甚至一次通过该方法,所以由于递归,我知道这是而不是;它从未复发过。
好的我已经插入了如下的print语句(请记住这些是在类中的方法中):
TypeError
当我说def someMethod(self):
...
partsList = self.getPartsList() # this function returns a list
for part in partsList:
...
print partsList # prints [object(1), object(2)]
self.bar(partsList)
def bar(self, partsList):
print partsList # prints <filename.class instance at 0x04886148>
for part in partsList: # still gives me the TypeError
...
时,我的意思并不是filename.class
和filename
。你们知道我的意思。
第二个打印语句打印class
是因为它指向实际的<filename.class instance at 0x04886148>
吗?我不完全确定指针和引用在Python中是如何工作的。
答案 0 :(得分:1)
您没有正确定义bar
;它的第一个参数是对调用它的对象的引用,第二个参数是您作为显式参数传递的列表。
def bar(self, partsList):
for part in partsList:
...
答案 1 :(得分:0)
您的答案就在打印行中。
def bar(self, partsList):
print partsList # prints <filename.class instance at 0x04886148>
for part in partsList: # still gives me the TypeError
...
partsList不是进入此方法的列表。以下是您的代码中的一些经过调整的功能性示例代码:
class myClass():
def someMethod(self):
partsList=self.getPartsList()
for part in partsList:
print part
self.bar(partsList)
def bar(self, pList):
print pList
for part in pList:
print part
def getPartsList(self):
return ['a', 'b', 'c']
以交互方式运行这个让我知道:
来自fake_try的导入myClass x = myClass() x.someMethod() 一个 b C [&#39; a&#39;,&#39; b&#39;,&#39; c&#39;] 一个 b ç
当我打电话给#34;打印pList&#34;时,你会注意到我收到了列表的漂亮打印输出。您正在接收类类型的对象。
我理解并同情你的情况。有一个庞大,复杂的程序抛出错误可能是非常痛苦的调试。不幸的是,如果没有看到您的整个代码,我不认为这里的任何人都可以调试您的问题,因为我的猜测是您正在调用“某些方法”。以某种方式在实际代码中(或在意外的地方)意外,这会导致您遇到问题。
有几种方法可以调试它。
我假设所有东西都运行了UNTIL你添加了someMethod功能?将代码恢复到错误之前的状态,并一次添加行(如果需要,可以使用虚函数)以准确找到意外值的来源。如果你无法恢复我的第一步就是简化围绕这个问题的所有逻辑。你有一个功能&#39; getPartsList()&#39;应该返回一个列表。它看起来像是在这里,但让它更容易检查。创建一个虚拟函数,只返回一个虚假列表,看看行为是什么。一步一步地改变一切,直到你解决问题所在。
您可能不熟悉检查模块。尝试在模块中导入inspect并使用inspect.getmember(x),x是您想要了解更多信息的对象。我可能会用这个替代你在bar方法中打印partsList(类似于inspect.getmember(partsList))我猜你以某种方式在那里传递一个类而不是列表,这应该告诉你这是什么class已被实例化为。