Created
January 9, 2013 23:19
-
-
Save cesarkawakami/4497940 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""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 | |
def _resolve_name(name, package, level): | |
"""Return the absolute name of the module to be imported.""" | |
if not hasattr(package, 'rindex'): | |
raise ValueError("'package' not set to a string") | |
dot = len(package) | |
for x in xrange(level, 1, -1): | |
try: | |
dot = package.rindex('.', 0, dot) | |
except ValueError: | |
raise ValueError("attempted relative import beyond top-level " | |
"package") | |
return "%s.%s" % (package[:dot], name) | |
def import_module(name, package=None): | |
"""Import a module. | |
The 'package' argument is required when performing a relative import. It | |
specifies the package to use as the anchor point from which to resolve the | |
relative import to an absolute import. | |
""" | |
if name.startswith('.'): | |
if not package: | |
raise TypeError("relative imports require the 'package' argument") | |
level = 0 | |
for character in name: | |
if character != '.': | |
break | |
level += 1 | |
name = _resolve_name(name[level:], package, level) | |
__import__(name) | |
return sys.modules[name] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment