Seite 1 von 1

Seltsammer Fehler

Verfasst: Montag 22. November 2010, 17:43
von albertus
Guten Abend,

ich habe eine Klasse programmiert die IDLE zu einem Restart bringt, wenn ich sie initialisiere und mir mit dir(obj) die Attribute anschauen will. Schreibe ich ein kleines Skript das das selbe wie in IDLE von Hand gemacht bekomme ich auf der Konsole folgende Ausgabe zu sehen

albert@albert:~/Dropbox/programmieren> python temp.py
Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored
Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored
Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <type 'exceptions.KeyError'> ignored
Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored
Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.AttributeError'> ignored
Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <type 'exceptions.KeyError'> ignored

[Liste mit den Attributen]

Ich habe so gar keinen Plan woran das liegen könnte! Vielleicht kann mir hier jemand den stubs in die richtige Richtung geben?

Mit freundlichen Grüßen

Albertus

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 18:08
von 0x1cedd1ce
Das ist ganz klar, du hast ein Funktion die sich selbst aufruft. Das ist eigentlich nichts besonderes, aber deine Funktion kommt nie zu einem Ende, sondern ruft sich solange selbst auf, bis ein limit "max recursion depth" erreicht ist. Poste mal den Code der entsprechenden Funktion, dann kann man dir weiterhelfen. Also "__subclasscheck__" ist wahrscheinlich das Problem

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 19:08
von albertus
0x1cedd1ce hat geschrieben:Das ist ganz klar, du hast ein Funktion die sich selbst aufruft. Das ist eigentlich nichts besonderes, aber deine Funktion kommt nie zu einem Ende, sondern ruft sich solange selbst auf, bis ein limit "max recursion depth" erreicht ist. Poste mal den Code der entsprechenden Funktion, dann kann man dir weiterhelfen. Also "__subclasscheck__" ist wahrscheinlich das Problem
Problem ich habe "__subclasscheck__" in meiner Klasse nicht definiert :? . Meine Nachforschungen haben ergeben das "__subclasscheck__" ein Bestandteil der Metaclass "type" ist. Somit stellt sich mir die Frage, wie schafft es meine "Klasse" "__subclasscheck__" in eine recursion zu zwingen?

Mit freundlichen Grüßen

Albertus

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 19:29
von BlackJack
@albertus: Irgendwie. Mehr kann ich ohne Quelltext oder Glaskugel nicht sagen...

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 19:39
von 0x1cedd1ce
Genau jetzt währe der Zeitpunkt um dein Source loszuwerden.

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 20:10
von albertus
0x1cedd1ce hat geschrieben:Genau jetzt währe der Zeitpunkt um dein Source loszuwerden.
Ok es wird Zeit den Source loszuwerden aber nicht mehr heute dafür reicht die Zeit nicht mehr aber Morgen im laufe des Vormitags

Re: Seltsammer Fehler

Verfasst: Montag 22. November 2010, 22:07
von albertus
Guten Abend,

ich habe es doch noch geschafft den Fehler einzugrenzen es liegt an die Implementierung von __getattr__. Mit folgender Testklasse lest sich der Fehler reproduzieren:

Code: Alles auswählen

class Test(object):
	def __init__(self,):
		self.a = 1
		self.b = 2
	def __getattr__(self, name):
		print "Test", name
		if hasattr(self, name):
		    return getattr(self, name)
	def bar(self, x ):
		return self.a * x + self.b
x = Test()
dir(x)
Mir ist auch klar warum das schief gehen muss ich rufe getattr auf um den Namen des Attributs zurückzugeben das ruft dann wiederum __getattr__ und so weiter. Das hat man von schnellen Hacks!

Re: Seltsammer Fehler

Verfasst: Dienstag 23. November 2010, 10:06
von bwbg
__getattr__ ist nicht das, was du hier willst, du willst properties. Zumal getattr __getattr__ aufruft. Und schau dir mal die Dokumentation zu hasattr an.

Grüße ...
bwbg