Commit 8bdd3b3d authored by Brett Cannon's avatar Brett Cannon

Make importlib backwards-compatible to Python 2.2 (but this is not promised to

last; just doing it to be nice).

Also fix a message for an exception.
parent 7757d7bb
"""Backport of importlib.import_module from 3.x.""" """Backport of importlib.import_module from 3.x."""
# While not critical (and in no way guaranteed!), it would be nice to keep this
# code compatible with Python 2.3.
import sys import sys
def _resolve_name(name, package, level): def _resolve_name(name, package, level):
...@@ -9,8 +11,14 @@ def _resolve_name(name, package, level): ...@@ -9,8 +11,14 @@ def _resolve_name(name, package, level):
raise ValueError("attempted relative import beyond top-level " raise ValueError("attempted relative import beyond top-level "
"package") "package")
except AttributeError: except AttributeError:
raise ValueError("__package__ not set to a string") raise ValueError("'package' not set to a string")
base = package.rsplit('.', level)[0] try:
# rpartition is more "correct" and rfind is just as easy to use, but
# neither are in Python 2.3.
dot_rindex = package.rindex('.', level)[0]
base = package[:dot_rindex]
except ValueError:
base = package
if name: if name:
return "%s.%s" % (base, name) return "%s.%s" % (base, name)
else: else:
...@@ -34,5 +42,10 @@ def import_module(name, package=None): ...@@ -34,5 +42,10 @@ def import_module(name, package=None):
break break
level += 1 level += 1
name = _resolve_name(name[level:], package, level) name = _resolve_name(name[level:], package, level)
# Try to import specifying the level to be as accurate as possible, but
# realize that keyword arguments are not found in Python 2.3.
try:
__import__(name, level=0)
except TypeError:
__import__(name) __import__(name)
return sys.modules[name] return sys.modules[name]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment