2017-05-09 55 views
-1

我有一个运行良好在一定的时间,但最终失败了下面的代码“最大递归深度超过”错误:的Python:最大递归深度超过误差

def getImg(data): 
    if data and len(data) > 0: 
    for entry in data: 
     print " -- Entry name", entry[‘url’] 
     # eventually grab an img using the entry[‘url’] data 
     time.sleep(6) 
    else: 
    print “no entry” 
    offset = offset + 1 
    queryDb(offset) 

def queryDb(offset): 
    offset = str(offset) 
    cur.execute("SELECT name FROM mutable OFFSET " + offset + " LIMIT 1"); 
    result = cur.fetchone() 
    id = result[0] 
    url="http://localhost:8080/?query=" + id 
    r=requests.get(url) 
    getImg(json.loads(r.content), artistName, gid) 

queryDb(0) 

的代码基本上是遍历数据库表使用递增偏移量。然后它调用getImg,它将从网站中检索一些图像(如数据中指定的),然后再次使用增加的索引呼叫queryDb。数据中可能有多个条目,并且网站有一个速率限制(因此是睡眠),所以最好的方法似乎是让循环与每次通话之间的睡眠一起运行,一旦完成,然后再次调用queryDb。

问题是这会导致递归错误。

什么是更好的方法来做到这一点,同时避免递归问题?

+4

queryDB调用GETIMG,然后调用GETIMG和queryDB等永远... – ForceBru

+3

'queryDb'调用'getImg',这调用'queryDb',调用'getImg' ... –

+0

是的,我知道。问题是我怎样才能实现这个没有递归? –

回答

1

你增加你的计数器每次调用一次getImg,这意味着你增加它每一次调用queryDb。那么,为什么不只是做一个循环:

def getImg(data): 
    if data and len(data) > 0: 
    for entry in data: 
     print " -- Entry name", entry['url'] 
     # eventually grab an img using the entry['url'] data 
     time.sleep(6) 
    else: 
    print “no entry” 

def queryDb(offset): 
    offset = str(offset) 
    cur.execute("SELECT name FROM mutable OFFSET " + offset + " LIMIT 1"); 
    result = cur.fetchone() 
    id = result[0] 
    url="http://localhost:8080/?query=" + id 
    r=requests.get(url) 
    getImg(json.loads(r.content), artistName, gid) 

offset = 0 
while True: 
    queryDb(offset) 
    offset = offset + 1 

这只是删除从getImg递归调用,并把整个事情在一个循环。它没有解决代码中的其他任何问题,比如如何构建数据库查询。

+0

数据库查询有什么问题? –

+0

从这样的字符串构建查询不是推荐的过程。在你的情况下,它会正常工作,因为这是一个玩具的例子,你可以完全控制。一般来说,你会想要清理参数,因为对于一般情况你不知道它们来自哪里。 –

+0

当然是的。我可能会使用准备好的语句或类似的东西(对于Python来说真的很新)或者真实世界中的东西,但这实际上是一个用于删除某些图像的脚本。 –

2

你可以在queryDb使用for循环和不调用queryDb在getImg

def queryDb(): 
    cur.execute("SELECT name FROM mutable"); 
    result = cur.fetchall() 

    for row in result: 
     id = row[0] 
     url="http://localhost:8080/?query=" + id 
     r=requests.get(url) 
     getImg(json.loads(r.content), artistName, gid) 
+0

这比我的解决方案好。 –

+0

是的,这是我在发布问题后不久就意识到的解决方案。谢谢 –

+0

这个问题是没有再次调用queryDb。查询后,我需要抓住图像....一旦完成,我需要再次调用queryDb。 –

相关问题