Hallo, On 2006-07-03 15:11, Diez B. Roggisch wrote:
Ok und wie erreicht man das genaue Gegenteil? Bei einem Reimport soll also das Modul erneut initialisiert werden, so als wäre es noch nicht importiert worden.
Theoretisch: reload.
das "theoretisch" unterschreibe ich sofort. ;-) Bei reload ist knifflig, dass bspw. bereits instanziierte Objekte nicht "automagisch" ihre Klasse ändern, wenn ein Modul mit der Klasse darin neu geladen wird. Beispiel: $ cat test.py class C(object): pass $ python Python 2.4.3 (#1, Jun 29 2006, 16:00:56) [GCC 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
import test c1 = test.C() isinstance(c1, test.C) True reload(test) <module 'test' from 'test.pyc'> c2 = test.C() c1.__class__ is c2.__class__ False isinstance(c2, test.C) True isinstance(c1, test.C) False
Für andere Objekte im Namensraum des neu geladenen Moduls gilt Entsprechendes; gibt es noch alte Referenzen aus der Zeit vor dem Reload, verweisen diese weiterhin auf das ursprüngliche Objekt. $ cat test.py config = True $ python Python 2.4.3 (#1, Jun 29 2006, 16:00:56) [GCC 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
import test c = test.config c True # setzen von config = False in test.py ... reload(test) <module 'test' from 'test.py'> test.config False c True
Ich will gar nicht darauf hinaus, dass reload "intelligenter" sein sollte; das würde vermutlich nur in Krampf ausarten. Die Konsequenz ist vielmehr, dass ich reload bis auf gelegentliche Verwendung im interaktiven Interpreter vermeide. Ich nehme an, dass sich in den allermeisten Fällen, bei denen sich vermeintlich reload anbietet, eine andere Lösung finden lässt. Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de