Python 为什么我会有这个打字错误?

Python 为什么我会有这个打字错误?,python,list,iteration,typeerror,Python,List,Iteration,Typeerror,已解决:好吧,你们可能不会相信这一点。我做了很多挖掘工作,结果发现我们正在加载和使用的所有文件都是错误创建的。这些文件与我们正在编写的代码不一致——根据我们加载的文件的当前状态,我们想在程序中做的事情根本不可能。我目前正在解决这个问题。对不起,没问题了,伙计们 在Python中,我的代码基本上如下所示: partsList = getPartsList() # this function returns a list for part in partsList: ... bar(par

已解决:好吧,你们可能不会相信这一点。我做了很多挖掘工作,结果发现我们正在加载和使用的所有文件都是错误创建的。这些文件与我们正在编写的代码不一致——根据我们加载的文件的当前状态,我们想在程序中做的事情根本不可能。我目前正在解决这个问题。对不起,没问题了,伙计们


在Python中,我的代码基本上如下所示:

partsList = getPartsList() # this function returns a list
for part in partsList:
    ...
bar(partsList)

def bar(partsList):
    for part in partsList:
        ...
但是当我运行代码时,我得到以下类型的错误:

TypeError: iteration over non-sequence
TypeError
与注释行有关:

def bar(partsList):
    for part in partsList: # this is the line with the TypeError
        ...
这怎么可能?我知道
partsList
不是一个非序列,因为就在我的程序调用
bar(partsList)
之前,我显式地迭代了
partsList

我的函数在与之交互之前不会修改
partsList
,在调用函数之前迭代时也不会修改
partsList
,但在调用函数时它会从列表变为非序列


我完全在一个类中工作,所以实际上这些都是方法;我只是想,如果我以这种方式呈现代码,会更容易阅读


以下是对评论的回应:

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
        ...
我希望能为大家提供完整的代码,但目前该程序需要275个文件才能运行,并且有20个+
.py
文件。我要提到的是,所讨论的方法确实在通过给定列表进行迭代后使用递归。我认为这可能与错误有关,但当试图打印列表本身及其内容时,程序在通过该方法之前给出了相同的
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
        ...
def someMethod(self):
...
partsList=self.getPartsList()#此函数返回一个列表
对于零件列表中的零件:
...
打印零件列表#打印[对象(1)和对象(2)]
自选条(零件列表)
def栏(自身、零件列表):
打印零件列表#打印件
对于part-in-partsList:#仍然给我输入错误
...
当我说
filename.class
时,我的字面意思不是
filename
class
。你们知道我的意思


第二个打印语句是否打印
,因为它指向实际的
零件列表
?我不完全确定指针和引用在Python中是如何工作的。

您没有正确定义
bar
;它的第一个参数是对调用它的对象的引用,第二个参数是作为显式参数传递的列表

def bar(self, partsList):
    for part in partsList:
        ...

你的答案在印刷品上

def bar(self, partsList):
    print partsList        # prints <filename.class instance at 0x04886148>
    for part in partsList: # still gives me the TypeError
        ...
以交互方式运行此命令可获得以下信息:

从fake_尝试导入myClass x=myClass() x、 someMethod() A. B C ['a','b','c'] A. B c

您会注意到,当我调用“print pList”时,我收到了列表的一个漂亮的打印输出。您正在接收类类型的对象

我理解并同情你的处境。有一个大的,复杂的程序抛出错误可能是相当痛苦的调试。不幸的是,在没有看到您的全部代码的情况下,我认为这里的任何人都无法调试您的问题,因为我猜您调用“someMethod”的方式在实际代码中是意外的(或在意外的地方),这会导致您出现问题

有几种方法可以调试它

  • 我假设在添加someMethod功能之前,一切都在运行?将代码还原到错误之前的状态,并一次添加行(必要时使用伪函数),以准确查找意外值的来源。如果您无法回复,我的第一步将是简化围绕此问题的所有逻辑。您有一个函数“getPartsList()”应该返回一个列表。它看起来就在这里,但更容易检查。创建一个只返回假列表的伪函数,并查看其行为。一步一步地改变事情,直到你解决了问题所在

  • 您可能不熟悉inspect模块。尝试在模块中导入inspect并使用inspect.getmember(x),x是您想要了解更多信息的对象。我可能会用它来代替bar方法中的print partsList(类似于inspect.getmember(partsList)),我猜您是在传递一个类,而不是列表,这应该告诉您该类被实例化为什么


  • 请给我们看一个重现错误的样品。我猜你在
    for
    循环中有
    partsList
    ,但是如果没有更多的信息,我们只能猜测。你能打印
    partsList
    的内容并向我们显示输出吗?你能提供完整的回溯和复制问题的可运行代码吗?“我完全在一个类中工作…”我们需要完整的代码,因为上面的代码并不代表会发生什么。我们并不是要求所有的代码。我们要求的是可复制的最小样品。您还可以使用
    print()
    语句查看此处的确切内容(在函数中使用
    print(repr(partsList))
    并告诉我们这是什么内容)。但就目前而言,你的问题无法回答。对不起,我打错了示例。我现在编辑了我的文章以反映实际的代码。您的示例在调用
    self.bar
    时仍然不一致地使用了本地(且未定义的)
    partsList
    ,而不是
    self.partsList
    ,因此仍然不清楚是什么