mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Backport importlib in the form of providing importlib.import_module(). This has
been done purely to help transitions from 2.7 to 3.1.
This commit is contained in:
parent
aaedcef578
commit
93881c6c58
5 changed files with 242 additions and 0 deletions
38
Lib/importlib.py
Normal file
38
Lib/importlib.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
"""Backport of importlib.import_module from 3.x."""
|
||||
import sys
|
||||
|
||||
def _resolve_name(name, package, level):
|
||||
"""Return the absolute name of the module to be imported."""
|
||||
level -= 1
|
||||
try:
|
||||
if package.count('.') < level:
|
||||
raise ValueError("attempted relative import beyond top-level "
|
||||
"package")
|
||||
except AttributeError:
|
||||
raise ValueError("__package__ not set to a string")
|
||||
base = package.rsplit('.', level)[0]
|
||||
if name:
|
||||
return "{0}.{1}".format(base, name)
|
||||
else:
|
||||
return base
|
||||
|
||||
|
||||
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]
|
Loading…
Add table
Add a link
Reference in a new issue