cpython/Lib/lib2to3/fixes/fix_import.py
Georg Brandl c09315d639 Merged revisions 67376 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

................
  r67376 | benjamin.peterson | 2008-11-25 05:07:45 +0100 (Tue, 25 Nov 2008) | 17 lines

  Merged revisions 67183,67191,67371 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3

  ........
    r67183 | benjamin.peterson | 2008-11-10 21:51:33 -0600 (Mon, 10 Nov 2008) | 1 line

    handle 'import x as y' in fix_imports; this still needs more work...
  ........
    r67191 | benjamin.peterson | 2008-11-11 17:24:51 -0600 (Tue, 11 Nov 2008) | 1 line

    super() is good
  ........
    r67371 | benjamin.peterson | 2008-11-24 16:02:00 -0600 (Mon, 24 Nov 2008) | 1 line

    don't blow up in the metaclass fixer when assignments in the class statement aren't simple
  ........
................
2008-12-05 09:02:42 +00:00

67 lines
2.1 KiB
Python

"""Fixer for import statements.
If spam is being imported from the local directory, this import:
from spam import eggs
Becomes:
from .spam import eggs
And this import:
import spam
Becomes:
from . import spam
"""
# Local imports
from .. import fixer_base
from os.path import dirname, join, exists, pathsep
from ..fixer_util import FromImport, syms
class FixImport(fixer_base.BaseFix):
PATTERN = """
import_from< type='from' imp=any 'import' ['('] any [')'] >
|
import_name< type='import' imp=any >
"""
def transform(self, node, results):
imp = results['imp']
mod_name = unicode(imp.children[0] if imp.type == syms.dotted_as_name \
else imp)
if mod_name.startswith('.'):
# Already a new-style import
return
if not probably_a_local_import(mod_name, self.filename):
# I guess this is a global import -- skip it!
return
if results['type'].value == 'from':
# Some imps are top-level (eg: 'import ham')
# some are first level (eg: 'import ham.eggs')
# some are third level (eg: 'import ham.eggs as spam')
# Hence, the loop
while not hasattr(imp, 'value'):
imp = imp.children[0]
imp.value = "." + imp.value
node.changed()
else:
new = FromImport('.', getattr(imp, 'content', None) or [imp])
new.set_prefix(node.get_prefix())
node = new
return node
def probably_a_local_import(imp_name, file_path):
# Must be stripped because the right space is included by the parser
imp_name = imp_name.split('.', 1)[0].strip()
base_path = dirname(file_path)
base_path = join(base_path, imp_name)
# If there is no __init__.py next to the file its not in a package
# so can't be a relative import.
if not exists(join(dirname(base_path), '__init__.py')):
return False
for ext in ['.py', pathsep, '.pyc', '.so', '.sl', '.pyd']:
if exists(base_path + ext):
return True
return False