Re: Re: [Python-de] Namespaces, Klassen u. Objekte...??
python-lists@duerer-sinclair.de schrieb am
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)
befürchte ich auch...
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
[...] Ja, ist mir gestern auch noch eingefallen. Eigentlich ist das nicht unbedingt nötig, die Klassen zu testen und ich werds jetzt auch anders machen, sprich Exceptions abfangen... Aber trotzdem ist das seltsam - obwohl nicht gerade der glücklichste Programmierstil und nicht "Python-isch", so müsste es doch trotzdem funktionieren, oder? Ecky ;) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Mon, 28 Apr 2003 elehmann@e-lehmann.de wrote: [...]
a) Dein "Kreuzimport" (a macht import b und b macht import a) ist unschoen und fuehrt wahrscheinlich zu Deinen Problemen (reine Vermutung)
befürchte ich auch...
[...]
Aber trotzdem ist das seltsam - obwohl nicht gerade der glücklichste Programmierstil und nicht "Python-isch", so müsste es doch trotzdem funktionieren, oder?
Hier mein Erklaerungsversuch: file a.py: ---------------------- print "a pre" import b print "a body" ---------------------- file b.py: ---------------------- print "b pre" import a print "b body" ---------------------- Jetzt fuehren wir a.py aus und stellen fest, dass der "body" von a tatsaechlic 2x ausgefuehrt wird. Meine Vermutung (da musst Du mental a und b durch Deine Filenamen ersetzen): Beim ersten Durchlauf von a wird eine Klasse definiert und an ihren Namen gebunden. Diese Klasse wird in b dann abgefragt. Beim 2. Durchlauf durch a re-definiertst Du die Klasse und bindest die eue Klasse an den alten Namen. Dein Kode in a erzeugt dann eine Instanz von der neuen Klasse und gibt da an die Routine in b. Die prueft aber auf eine Instanz der urspruenglichen (der alten) Klasse (denn das ist das einzige, was waehrend der Defition von b bekannt war) und das ist sie halt nicht. Keine Ahnung, ob das tatsaechlich stattfindet, aber es klingt logisch fuer mich. Die Antwort auf Deine Frage ist somit: Nein, es sollte icht funktionieren. Wer verwirrten Kode (Kreuzimporte) schreibt bekommt verwirrendes Laufzeitverhalten. :-) Holger _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
python-lists@duerer-sinclair.de wrote:
Die Antwort auf Deine Frage ist somit: Nein, es sollte icht funktionieren. Wer verwirrten Kode (Kreuzimporte) schreibt bekommt verwirrendes Laufzeitverhalten. :-)
Kreuzweise Importe sind normalerweise ueberhaupt kein Problem. Tatsaechlich wird eine Datei nur beim erstenmal Importieren von der Datei gelesen, und ihre toplevel-Statements ausgefuehrt. Jeder weitere Import liefert einfach das schon in __modules__ hinterlegte Modulobjekt zurueck. Eine Widerholung der vollen Importprozedur kann ggf. mit reload(<module>) erzwungen werden. Das urspruengliche Problem muss also eine andere Ursache haben. Ich habe das Originalposting nicht mehr vorliegen, aber ich vermute eine Konfusion zwischen der Klassendefinition und konkreten Instanzen dieser Klasse, oder etwas in dieser Richtung. -schorsch -- Georg Mischler -- simulations developer -- schorsch at schorsch com +schorsch.com+ -- lighting design tools -- http://www.schorsch.com/ _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Georg Mischler wrote:
python-lists@duerer-sinclair.de wrote:
Die Antwort auf Deine Frage ist somit: Nein, es sollte icht funktionieren. Wer verwirrten Kode (Kreuzimporte) schreibt bekommt verwirrendes Laufzeitverhalten. :-)
Kreuzweise Importe sind normalerweise ueberhaupt kein Problem. Tatsaechlich wird eine Datei nur beim erstenmal Importieren von der Datei gelesen, und ihre toplevel-Statements ausgefuehrt.
Außer natürlich wenn das Skript einmal als __main__ und einmal per Namen importiert wird. Python kann nicht erkennen, daß er zweimal dasselbe Modul ist, und das führt zu Klassen, die gleich aber nicht identisch sind, was dazu führt, daß der isinstance-Check fehlschlägt, obwohl die Klassen doch eigentlich "dieselben" sind.
[...]
Bis demnächst, Walter Dörwald _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Georg Mischler wrote:
python-lists@duerer-sinclair.de wrote:
Die Antwort auf Deine Frage ist somit: Nein, es sollte icht funktionieren. Wer verwirrten Kode (Kreuzimporte) schreibt bekommt verwirrendes Laufzeitverhalten. :-)
Kreuzweise Importe sind normalerweise ueberhaupt kein Problem. Tatsaechlich wird eine Datei nur beim erstenmal Importieren von der Datei gelesen, und ihre toplevel-Statements ausgefuehrt.
Außer natürlich wenn das Skript einmal als __main__ und einmal per Namen importiert wird. Python kann nicht erkennen, daß er zweimal dasselbe Modul ist, und das führt zu Klassen, die gleich aber nicht identisch sind, was dazu führt, daß der isinstance-Check fehlschlägt, obwohl die Klassen doch eigentlich "dieselben" sind.
Dabei muß man aber betrachten, dass es sich nicht um die gleichen Klassen handelt. Klassen werden, selbst wenn die Namen lokal für den Entwickler gleich heißen mögen, über den gesamten Namen (Paket + Modul + Klassen-Namen) identifiziert. Einfach Lösung: python -c "import a" oder (mein Favorit) "Kleines Start-Skript, dass keine Klassen und fast keine Funktion beinhaltet)
[...]
schönen Abend Martin Möllenbeck _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
On Mon, 28 Apr 2003 12:07:04 -0400 (EDT), Georg Mischler wrote:
Kreuzweise Importe sind normalerweise ueberhaupt kein Problem.
Zyklische Modulabhängigkeiten sind IMMER ein Problem, in jeder Sprache, weil's einfach schweinisches Design ist. Ciao, Jürgen _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
elehmann@e-lehmann.de
-
Georg Mischler
-
Juergen Hermann
-
Martin.Moellenbeck@t-online.de
-
python-lists@duerer-sinclair.de
-
Walter Dörwald