[setuptools] Bug in setuptools ImpLoader
From PEP 302: The load_module() method has a few responsibilities that it must fulfill *before* it runs any code: - If there is an existing module object named 'fullname' in sys.modules, the loader *must* use that existing module. (Otherwise, the reload() builtin will not work correctly.) If a module named 'fullname' does not exist in sys.modules, the loader must create a new module object and add it to sys.modules. (emphasis on must) The current implementation always reloads the module if it exists. This problem exists in both the 0.6 and 0.7 series. Since pkgutil is in Python 2.5, this is an issue there as well. -- Jeremy Kloth http://4suite.org/
At 12:24 PM 9/8/2006 -0600, Jeremy Kloth wrote:
From PEP 302:
The load_module() method has a few responsibilities that it must fulfill *before* it runs any code:
- If there is an existing module object named 'fullname' in sys.modules, the loader *must* use that existing module. (Otherwise, the reload() builtin will not work correctly.) If a module named 'fullname' does not exist in sys.modules, the loader must create a new module object and add it to sys.modules. (emphasis on must)
The current implementation always reloads the module if it exists.
Yes, that's the *intent* of the above paragraph. An importer that *doesn't* reload under these circumstances will break the reload() builtin.
This problem exists in both the 0.6 and 0.7 series. Since pkgutil is in Python 2.5, this is an issue there as well.
Unless I've misunderstood you, this is not a problem, it's the correct and intended behavior. When a loader is asked to load a module that's in sys.modules, it's supposed to *reload* it. Otherwise, the reload() builtin won't work.
On Friday 08 September 2006 1:16 pm, Phillip J. Eby wrote:
At 12:24 PM 9/8/2006 -0600, Jeremy Kloth wrote:
From PEP 302:
The load_module() method has a few responsibilities that it must fulfill *before* it runs any code:
- If there is an existing module object named 'fullname' in sys.modules, the loader *must* use that existing module. (Otherwise, the reload() builtin will not work correctly.) If a module named 'fullname' does not exist in sys.modules, the loader must create a new module object and add it to sys.modules. (emphasis on must)
The current implementation always reloads the module if it exists.
Yes, that's the *intent* of the above paragraph. An importer that *doesn't* reload under these circumstances will break the reload() builtin.
I read the paragraph as stating that the loader *returns* the module from sys.modules instantly or it would break reload(). After re-reading PEP 302 several times, it becomes clear that the intention is that the module's contents are replaced before returning the module.
This problem exists in both the 0.6 and 0.7 series. Since pkgutil is in Python 2.5, this is an issue there as well.
Unless I've misunderstood you, this is not a problem, it's the correct and intended behavior. When a loader is asked to load a module that's in sys.modules, it's supposed to *reload* it. Otherwise, the reload() builtin won't work.
It would be worth adding a sentence stating that loader.load_module() is the same as a reload() if the module is already imported (just like the docs for imp.load_module). My confusion, no problem here except for in the code that was expecting my concept for things to work. -- Jeremy Kloth http://4suite.org/
participants (2)
-
Jeremy Kloth
-
Phillip J. Eby