Skip to content
Browse files

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.
  • Loading branch information...
1 parent 0772f25 commit d7c236e78286ebfcfd637e25ac71424cf7e499ff @andysan committed
Showing with 4 additions and 2 deletions.
  1. +4 −2 src/python/
6 src/python/
@@ -54,8 +54,7 @@ def load_module(self, fullname):
import imp
import os
import sys
- mod = imp.new_module(fullname)
- sys.modules[fullname] = mod
+ mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
mod.__loader__ = self
@@ -68,6 +67,9 @@ def load_module(self, fullname):
if os.path.basename(srcfile) == '':
mod.__path__ = fullname.split('.')
+ mod.__package__ = fullname
+ else:
+ mod.__package__ = fullname.rpartition('.')[0]
mod.__file__ = srcfile
exec code in mod.__dict__

0 comments on commit d7c236e

Please sign in to comment.
Something went wrong with that request. Please try again.