我得到了aTypeError:' NoneType'对象不可迭代

时间:2014-10-31 09:08:15

标签: python error-handling

在功能getLink(urls)中,我有return (cloud,parent,children) 在main函数中,我有(cloud,parent,children) = getLink(urls)并且我得到了这一行的错误:TypeError:'NoneType'对象不可迭代

父级和子级都是http链接的list。既然,它不能在这里粘贴它们,parent是一个包含大约30个链接的列表; children是一个包含大约30个项目的列表,每个项目大约是10-100个链接,除以“,”。

云是一个包含大约100个单词的列表,如:['官方商店','Java Applets中心','关于谷歌','网络历史'.......

我不知道为什么会收到错误。传递参数有什么不对吗?或者因为列表占用太多空间?

#crawler url: read webpage and return a list of url and a list of its name
def crawler(url):
    try:
        m = urllib.request.urlopen(url)
        msg = m.read()
....
        return (list(set(list(links))),list(set(list(titles))) )
    except Exception:
        print("url wrong!")

#this is the function has gone wrong: it throw an exception here, also the error I mentioned, also it will end while before len(parent) reach 100. 
def getLink(urls):
    try:
        newUrl=[]
        parent = []
        children =[]
        cloud =[]
        i=0

        while len(parent)<=100:

            url = urls[i]
            if url in parent:
                i += 1
                continue
            (links, titles) = crawler(url)
            parent.append(url)
            children.append(",".join(links))
            cloud = cloud + titles
            newUrl= newUrl+links
            print ("links: ",links)
            i += 1
            if i == len(urls):
                urls = list(set(newUrl))
                newUrl = []
                i = 0

        return (cloud,parent,children)
    except Exception:
        print("can not get links")


def readfile(file):
    #not related, this function will return a list of url 

def main():
    file='sampleinput.txt'
    urls=readfile(file)
    (cloud,parent,children) = getLink(urls)

if __name__=='__main__':
    main()

1 个答案:

答案 0 :(得分:1)

可能有一种方法可以使您的函数在没有到达显式return语句的情况下结束。

请查看以下示例代码。

def get_values(x):
    if x:
        return 'foo', 'bar'

x, y = get_values(1)
x, y = get_values(0)

当使用0作为参数调用函数时,将跳过return,函数将返回None

您可以添加一个显式return作为函数的最后一行。在这个答案给出的例子中,它看起来像这样。

def get_values(x):
    if x:
        return 'foo', 'bar'
    return None, None

查看代码后更新

get_link中触发异常时,您只需打印一些内容并从该函数返回。您没有return语句,因此Python将返回None。调用函数现在尝试将None扩展为三个值,但失败了。

更改您的异常处理以返回具有三个值的元组,就像您在一切正常时一样。对每个值使用None是一个好主意,它会向您显示出错的地方。另外,我不会在函数中打印任何内容。不要混淆业务逻辑和输入/输出。

except Exception:
    return None, None, None

然后在您的主函数中使用以下内容:

cloud, parent, children = getLink(urls)
if cloud is None:
    print("can not get links")
else:
    # do some more work