reload-Warnung (war: Re: [Python-de] reimport über __import__)

Stefan Schwarzer sschwarzer at sschwarzer.net
Don Jul 6 21:27:13 CEST 2006


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



More information about the python-de mailing list