base: Make the Python module loader PEP302 compliant
authorAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 3 Jun 2013 11:51:03 +0000 (13:51 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 3 Jun 2013 11:51:03 +0000 (13:51 +0200)
The custom Python loader didn't comply with PEP302 for two reasons:

 * Previously, we would overwrite old modules on name
   conflicts. PEP302 explicitly states that: "If there is an existing
   module object named 'fullname' in sys.modules, the loader must use
   that existing module".

 * The "__package__" attribute wasn't set. PEP302: "The __package__
   attribute must be set."

This changeset addresses both of these issues.

src/python/importer.py

index 90fbae8b4bada546454b4c904531146596d7bfee..fa26080e508e41d92afe23c1ba3c5a1ffbbffbc1 100644 (file)
@@ -54,8 +54,12 @@ class CodeImporter(object):
         import imp
         import os
         import sys
-        mod = imp.new_module(fullname)
-        sys.modules[fullname] = mod
+
+        try:
+            mod = sys.modules[fullname]
+        except KeyError:
+            mod = imp.new_module(fullname)
+            sys.modules[fullname] = mod
 
         try:
             mod.__loader__ = self
@@ -68,6 +72,9 @@ class CodeImporter(object):
 
             if os.path.basename(srcfile) == '__init__.py':
                 mod.__path__ = fullname.split('.')
+                mod.__package__ = fullname
+            else:
+                mod.__package__ = fullname.rpartition('.')[0]
             mod.__file__ = srcfile
 
             exec code in mod.__dict__