2017-05-09 113 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。 –

相關問題