1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # Taken from Python 2.7 with permission from/by the original author.
- import warnings
- import sys
- from django.utils import six
- from django.utils.deprecation import RemovedInDjango19Warning
- warnings.warn("django.utils.importlib will be removed in Django 1.9.",
- RemovedInDjango19Warning, stacklevel=2)
- 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 range(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)
- if six.PY3:
- from importlib import import_module
- else:
- 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]
|