python:函数在返回其中一个参数时偶尔返回Nonetype?

时间:2014-04-05 01:33:06

标签: python multithreading pygame

我在pygame中编写了一个滚动列表窗口小部件(我知道,它很愚蠢,我承认它。但我很乐意这样做)无论如何,这个函数由一个文件查看器对象进行线程化,该对象传递一个实例本身连同一个绝对路径,addr,来显示内容。

首先收集文件名,然后将它们存储在2个成员数组中,文件名作为第一个实例,格式化消息作为第二个成员显示在屏幕上:

示例:["videos","[34]: D -- videos"]

忙碌的功能等待用户点击其中一个图块作为他/她的输入:obj.waitingForReplyobj.Answer存储用户点击的面板的元组。如果它存储一个目录,该函数应该调用自己来查看目录的内容,如果它是一个文件,函数退出并且线程通过将obj.Quit设置为true来结束。这也会杀死文件查看器的实例,因为它的目的是为用户提供一个GUI来选择要读入程序的文件。每当我进入另一个目录时它立即崩溃,但随后选择离开并返回上一个父目录,方法是选择:Back: [1]: D -- Desktop当我选择另一个目录进行查看时显示。

我正在考虑使用队列作为信号量,但我不认为这是我的问题

代码:

def listdirectory(obj,addr,prev=False,type="D",error=0):
    var=0
    choose = 1
    yesnext=False
    yesprev=False
    next=0
    print "in listdirectory"
    while(obj.Quit==False):
        mylist = []
        if(prev!=False):
            yesprev=True
            what = "F"
            if(os.path.isdir(prev)):
                what="D"
            m = re.split("\/",prev)
            mylist.append([prev, format1(choose,what,m[(len(m)-1)],1)])
            choose+=1
        if(yesnext):
            what = "F"
            if(os.path.isdir(next)):
                what="D"
            m = re.split("\/",next)
            mylist.append([next, format1(choose,what,m[(len(m)-1)],0)])
            choose+=1
        for items in os.listdir(addr):
            what = "F"
            check = concat(concat(addr,"/"),items)
            if(os.path.isdir(check)):
                what="D"
            m = re.split("\/",items)
            mylist.append([items, format2(choose,what,m[(len(m)-1)])])
            choose+=1

        print "listdirectory, currDrawing spinlock"
        while obj.currDrawing:
            var = (var+1)%2
        obj.currDrawing=True
        obj.loaddir(mylist)
        obj.currDrawing=False
        obj.waitingForReply=True
        while obj.waitingForReply:
            var = (var+1)%2
        if(obj.Answer!=False):
            chkprev = re.split("\/",addr)
            apath = concat(concat(addr,"/"),obj.Answer[0])
            if(obj.Answer[0]==chkprev[(len(chkprev)-2)]):
                return addr
            elif(os.path.isdir(apath)):
                yesnext=True
                next = listdirectory(obj,apath,addr)
                print "value of next: %r" % next
                next = re.split("\/",next)
                next = next[(len(next)-1)]
            else:
                obj.Quit=True
        choose=1

崩溃时:

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 486, in __bootstrap_inner
    self.run()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/threading.py", line 446, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/Users/Jason/Desktop/cup-robot-project/cup-robot-3/src/fileopener.py", line 524, in listdirectory
    next = re.split("\/",next)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 165, in split
    return _compile(pattern, 0).split(string, maxsplit)
TypeError: expected string or buffer

只是为了澄清:return addr用于调用前一个listdirectory函数。当它退出时,函数不应返回任何内容,因为所需的变量存储在self.Answer中,可通过其中一个对象成员函数进行访问。整个函数在技术上是一个守护进程:while self.Quit==False IDK,如果它改变任何东西

1 个答案:

答案 0 :(得分:2)

函数中唯一的return语句是:

        if(obj.Answer[0]==chkprev[(len(chkprev)-2)]):
            return addr

如果此条件不成立,并且以下语句os.path.isdir(apath)不为True,它将到达行obj.Quit=True,离开for循环,然后到达函数的末尾,其中有没有return。此时它将返回None