[Python-checkins] cpython (3.3): Issue #18055: Move to importlib from imp for IDLE.

brett.cannon python-checkins at python.org
Fri Jun 7 19:18:46 CEST 2013


http://hg.python.org/cpython/rev/a0d8ae880ae6
changeset:   84050:a0d8ae880ae6
branch:      3.3
parent:      84043:382f4718e765
user:        Brett Cannon <brett at python.org>
date:        Fri Jun 07 13:17:48 2013 -0400
summary:
  Issue #18055: Move to importlib from imp for IDLE.

files:
  Lib/idlelib/EditorWindow.py |  57 ++++++++----------------
  Misc/NEWS                   |   2 +
  2 files changed, 21 insertions(+), 38 deletions(-)


diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -1,5 +1,5 @@
-import imp
 import importlib
+import importlib.abc
 import os
 import re
 import string
@@ -35,34 +35,6 @@
         release += '%s%s' % (level[0], serial)
     return release
 
-def _find_module(fullname, path=None):
-    """Version of imp.find_module() that handles hierarchical module names"""
-
-    file = None
-    for tgt in fullname.split('.'):
-        if file is not None:
-            file.close()            # close intermediate files
-        (file, filename, descr) = imp.find_module(tgt, path)
-        if descr[2] == imp.PY_SOURCE:
-            break                   # find but not load the source file
-        module = imp.load_module(tgt, file, filename, descr)
-        try:
-            path = module.__path__
-        except AttributeError:
-            raise ImportError('No source for module ' + module.__name__)
-    if descr[2] != imp.PY_SOURCE:
-        # If all of the above fails and didn't raise an exception,fallback
-        # to a straight import which can find __init__.py in a package.
-        m = __import__(fullname)
-        try:
-            filename = m.__file__
-        except AttributeError:
-            pass
-        else:
-            file = None
-            descr = os.path.splitext(filename)[1], None, imp.PY_SOURCE
-    return file, filename, descr
-
 
 class HelpDialog(object):
 
@@ -687,20 +659,29 @@
             return
         # XXX Ought to insert current file's directory in front of path
         try:
-            (f, file, (suffix, mode, type)) = _find_module(name)
-        except (NameError, ImportError) as msg:
+            loader = importlib.find_loader(name)
+        except (ValueError, ImportError) as msg:
             tkMessageBox.showerror("Import error", str(msg), parent=self.text)
             return
-        if type != imp.PY_SOURCE:
-            tkMessageBox.showerror("Unsupported type",
-                "%s is not a source module" % name, parent=self.text)
+        if loader is None:
+            tkMessageBox.showerror("Import error", "module not found",
+                                   parent=self.text)
             return
-        if f:
-            f.close()
+        if not isinstance(loader, importlib.abc.SourceLoader):
+            tkMessageBox.showerror("Import error", "not a source-based module",
+                                   parent=self.text)
+            return
+        try:
+            file_path = loader.get_filename(name)
+        except AttributeError:
+            tkMessageBox.showerror("Import error",
+                                   "loader does not support get_filename",
+                                   parent=self.text)
+            return
         if self.flist:
-            self.flist.open(file)
+            self.flist.open(file_path)
         else:
-            self.io.loadfile(file)
+            self.io.loadfile(file_path)
 
     def open_class_browser(self, event=None):
         filename = self.io.filename
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -71,6 +71,8 @@
 IDLE
 ----
 
+- Issue #18055: Move IDLE off of imp and on to importlib.
+
 - Issue #15392: Create a unittest framework for IDLE.
   Initial patch by Rajagopalasarma Jayakrishnan.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list