2017-05-09 4 views
-1

Ich habe den folgenden Code, die für eine gewisse Zeit in Ordnung läuft, aber schließlich nicht mit einem „Maximum Rekursionstiefe überschritten“ Fehler:Python: Maximale Rekursionstiefe überschritten Fehler

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) 

Der Code ist im Grunde über eine Datenbank looping Tabelle mit einem inkrementierenden Offset. Es ruft dann getImg an, die einige Bilder (wie in Daten angegeben) von einer Website abrufen und dann queryDb erneut mit einem erhöhten Index aufrufen. Es kann mehrere Einträge in den Daten geben und die Website hat ein Ratenlimit (daher der Schlaf), so dass der beste Weg zu sein scheint, die Schleife mit dem Schlaf zwischen jedem Aufruf laufen zu lassen, und einmal fertig ist, dann rufe queryDb erneut auf.

Problem ist das verursacht den Rekursionsfehler.

Was ist ein besserer Weg dies zu tun, während das Rekursionsproblem vermieden wird?

+4

queryDB ruft getImg, dann ruft getImg queryDB und so weiter für immer ... – ForceBru

+3

'queryDb' ruft' getImg', die ruft 'queryDb' auf, die' getImg' aufruft ... –

+0

Ja, das weiß ich. Die Frage ist, wie kann ich das ohne Rekursion erreichen? –

Antwort

1

Sie erhöhen Ihren Zähler einmal pro Anruf zu getImg, was bedeutet, dass Sie es einmal pro Anruf zu queryDb erhöhen. Also, warum es nicht nur in einer Schleife:

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 

Dies entfernt nur den rekursiven Aufruf von getImg und bringt das Ganze in einer Schleife. Es behandelt keines der anderen Probleme in Ihrem Code, z. B. wie Sie die DB-Abfrage erstellen.

+0

Was ist falsch mit der DB-Abfrage? –

+0

Das Konstruieren von Abfragen von Strings wie diesem ist keine empfohlene Prozedur. In Ihrem Fall wird es gut funktionieren, da dies ein Spielzeugbeispiel ist, über das Sie die volle Kontrolle haben. Im Allgemeinen möchten Sie die Parameter bereinigen, da Sie im allgemeinen Fall nicht wissen würden, woher sie kommen. –

+0

Ja natürlich. Ich würde wahrscheinlich vorbereitete Anweisungen oder etwas ähnliches (wirklich neu zu Python) oder etwas in der realen Welt verwenden, aber das ist buchstäblich ein Skript, um einige Bilder zu kratzen. –

2

Sie eine for-Schleife in queryDb verwenden könnte und nicht queryDb rufen in 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

Das ist besser als meine Lösung. –

+0

Ja, das ist die Lösung, die ich gleich nach der Veröffentlichung der Frage realisiert habe. Danke –

+0

Das Problem damit ist, dass nichts queryDb erneut aufruft. Nach der Abfrage muss ich die Bilder holen .... und wenn das erledigt ist, muss ich queryDb erneut aufrufen. –

Verwandte Themen