为什么我会收到这个TypeError?

时间:2014-07-21 17:37:39

标签: python list iteration typeerror

已解决:好的,你们可能不会相信这一点。我做了很多挖掘,结果发现我们正在加载和使用的所有文件都是错误的。这些文件不符合我们正在编写的代码 - 根据我们加载的文件的当前状态,我们想要在程序中执行的操作根本不可能。我目前正在努力解决这个问题。对不起,对不起,伙计们!


在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.classfilename。你们知道我的意思。

第二个打印语句打印class是因为它指向实际的<filename.class instance at 0x04886148>吗?我不完全确定指针和引用在Python中是如何工作的。

2 个答案:

答案 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;时,你会注意到我收到了列表的漂亮打印输出。您正在接收类类型的对象。

我理解并同情你的情况。有一个庞大,复杂的程序抛出错误可能是非常痛苦的调试。不幸的是,如果没有看到您的整个代码,我不认为这里的任何人都可以调试您的问题,因为我的猜测是您正在调用“某些方法”。以某种方式在实际代码中(或在意外的地方)意外,这会导致您遇到问题。

有几种方法可以调试它。

  1. 我假设所有东西都运行了UNTIL你添加了someMethod功能?将代码恢复到错误之前的状态,并一次添加行(如果需要,可以使用虚函数)以准确找到意外值的来源。如果你无法恢复我的第一步就是简化围绕这个问题的所有逻辑。你有一个功能&#39; getPartsList()&#39;应该返回一个列表。它看起来像是在这里,但让它更容易检查。创建一个虚拟函数,只返回一个虚假列表,看看行为是什么。一步一步地改变一切,直到你解决问题所在。

  2. 您可能不熟悉检查模块。尝试在模块中导入inspect并使用inspect.getmember(x),x是您想要了解更多信息的对象。我可能会用这个替代你在bar方法中打印partsList(类似于inspect.getmember(partsList))我猜你以某种方式在那里传递一个类而不是列表,这应该告诉你这是什么class已被实例化为。