[1.6.x] Fixed #21335 -- Use importlib from python3 when using python3

Backport of 3351e94ffa from master.
This commit is contained in:
Andrey Antukh 2013-10-26 01:07:40 +02:00 committed by Claude Paroz
parent 747f77552a
commit e052ada0f6
1 changed files with 22 additions and 17 deletions

View File

@ -1,6 +1,8 @@
# Taken from Python 2.7 with permission from/by the original author. # Taken from Python 2.7 with permission from/by the original author.
import sys import sys
from django.utils import six
def _resolve_name(name, package, level): def _resolve_name(name, package, level):
"""Return the absolute name of the module to be imported.""" """Return the absolute name of the module to be imported."""
if not hasattr(package, 'rindex'): if not hasattr(package, 'rindex'):
@ -15,22 +17,25 @@ def _resolve_name(name, package, level):
return "%s.%s" % (package[:dot], name) return "%s.%s" % (package[:dot], name)
def import_module(name, package=None): if six.PY3:
"""Import a module. 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 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 specifies the package to use as the anchor point from which to resolve the
relative import to an absolute import. relative import to an absolute import.
""" """
if name.startswith('.'): if name.startswith('.'):
if not package: if not package:
raise TypeError("relative imports require the 'package' argument") raise TypeError("relative imports require the 'package' argument")
level = 0 level = 0
for character in name: for character in name:
if character != '.': if character != '.':
break break
level += 1 level += 1
name = _resolve_name(name[level:], package, level) name = _resolve_name(name[level:], package, level)
__import__(name) __import__(name)
return sys.modules[name] return sys.modules[name]