base: Make the Python module loader PEP302 compliant

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.
This commit is contained in:
Andreas Sandberg 2013-06-03 13:51:03 +02:00
parent d989a3ad50
commit 63dae28703

View 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__