2011-01-12 31 views
0

Ich habe den folgenden Code, die aus Text zwei Strings extrahiert von verschiedenen MusternRuntime: maximale Rekursionstiefe überschritten

def urlChange(self, event): 
    text = self.txtUrl.GetValue() 
    matches = re.findall('GET (\S+).*Host: (\S+).*Cookie: (.+\S)\s*', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    groups = matches[0] 
    self.txtUrl.SetValue(groups[1] + groups[0]) 
    self.txtCookie.SetValue(groups[2]) 
    else: 
    matches = re.findall('GET (\S+).*Host: (\S+).*', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    groups = matches[0] 
    self.txtUrl.SetValue(groups[1] + groups[0]) 
    self.txtCookie.Clear() 
    else: 
    matches = re.findall('.*(http://\S+)', text, re.DOTALL or re.MULTILINE) 
    if matches: 
    self.txtUrl.SetValue(matches[0]) 
    matches = re.findall('.*Cookie: (.+\S)', text, re.DOTALL or re.MULTILINE) 
    if matches: 
     self.txtCookie.SetValue(matches[0]) 

nur passend, wenn die letzten re.findall('.*(http://\S+)'... Anweisung ausgeführt bekomme ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "./curl-gui.py", line 105, in urlChange 
    text = self.txtUrl.GetValue() 
RuntimeError: maximum recursion depth exceeded 
Error in sys.excepthook: 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 48, in apport_excepthook 
    if not enabled(): 
    File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 21, in enabled 
    import re 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

Original exception was: 
Traceback (most recent call last): 
    File "./curl-gui.py", line 105, in urlChange 
    text = self.txtUrl.GetValue() 
RuntimeError: maximum recursion depth exceeded 
+4

weiß ich nichts, aber es sieht aus wie das Problem der Zeile 'self.txtUrl.GetValue()' ist. Was macht 'GetValue'? – Kobi

Antwort

2

Das sieht aus wie GUI-Code?

Wenn ja, nehme ich an, dass urlChange aufgerufen wird, wenn sich self.txtUrl ändert. Deshalb, wenn Sie self.txtUrl.SetValue(matches[0]) nennen löst es einen weiteren Anruf zu urlChange, die dann wiederholt und htis die Rekursion Grenze.

Nur eine Vermutung - würde mehr Kontext müssen sicher sein, aber das ist das einzige möglicherweise rekursive Verhalten, das ich in diesem Code sehen kann.

Um dies zu umgehen, sollten Sie wahrscheinlich den Wert textUrl überprüfen, um zu sehen, ob es Änderungen vor dem Aufruf SetValue - um gegen die Rekursion zu schützen.

+0

ich es getestet - es kein Problem ist der Text innerhalb der Event-Handler zu ändern, ist es nicht eine unendliche Rekursion auslösen. Ich kann das Problem jedoch nicht reproduzieren. Es wurde wahrscheinlich auf den Eingabetext selbst bezogen. – jackhab

+0

Es sieht so aus, als könnten Sie ein seltsames Verhalten bei bestimmten Werten bekommen - da Sie den Wert im Textfeld vergleichen und dann durch etwas anderes ersetzen, aber es ist schwer zu erkennen, welche Werte es auslösen könnten. –

1

Haben Sie versucht, mit Hilfe sys.setrecursionlimit das recrsion Limit erhöhen()? Es ist standardmäßig auf 1000

+1

Punkt gut gemacht. Methoden, deren Implementierungsdetails Ihnen unbekannt sind, können Rekursionen in ihnen enthalten, die Ihnen nicht bekannt sind. Das Erhöhen der Rekursionsgrenze kann die Frage entscheiden. Ich wäre abgeneigt, die Rekursionsgrenze kostenlos zurückzusetzen. – ncmathsadist

Verwandte Themen