On Sun, 27 Apr 2003, Eckhard Lehmann wrote:
ich beiß mir schon seit paar Stunden die Zähne an folgendem Problem aus:
Ich habe zwei Klassen: LinearModel und DataSet. LinearModel existiert im Modul rinterface.py, DataSet im Modul xdata.py. [...] def __init__(self, dset): if not (isinstance(dset, xdata.DataSet)): raise ValueError, "dset must be a DataSet" ... self.DataSet = dset self.DataSet.setLinearModel(self) ...
in rinterface.py mache ich natürlich ein "import xdata" am Anfang Entsprechend enthält DataSet eine methode setLinearModel(), die etwa so aussieht:
def setLinearModel(self, lm): if isinstance(lm, rinterface.LinearModel): self.LModel = lm else: raise AttributeError, "lm must be a LinearModel"
[...] Obwohl ich nicht ganz sicher bin, was genau passiert, denke ich dass da zwei Dinge ungluecklich sind: a) Dein "Kreuzimport" (a macht import b und b macht import a) ist unschoen und fuehrt wahrscheinlich zu Deinen Problemen (reine Vermutung) b) Dein explizites Testen auf korrekte Klasse is un-Python-isch. Warum rufts Du nicht einfach die passende Methode auf und behandlest dann ggf. die Exception, falls das Objekt nicht das korrekte Interface definiert? In Python gilt normalerweise "Operation ausfuehren und Ausnahmen behandlen statt erst zu schauen bevor man springt" (praegnant als "es ist einfacher um Vergebung als um Erlaubnis zu fragen" ausgedrueckt). Was, wenn jemand Deinen Kode nimmt und ein anderes/besseres lineares Modell oder DataSet definiert? Dann funktioniert Dein Kode nicht, da Du nur die eigenen Klassen erlaubst... Wenn Du doch unbedingt auf korrektes Interface testen wills, schlage ich vor, die Interfaces als eigene Klassen (von denen Deine Implementationen dann erben) in einem separaten File zu definieren. Beide File machen dann ein Import von diesem Interface-def File statt sich gegenseitig zu importieren. (Und Dein Interface-Test fragt dann natuerlich auf diese abstrakte Interfaceklasse ab statt auf die konkrete Implementation.) Holger _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de