[Python-checkins] cpython: Issue #25507: Move 4 objects from pyshell to run and switch inports.

terry.reedy python-checkins at python.org
Fri Jul 15 02:43:20 EDT 2016


https://hg.python.org/cpython/rev/93d325c64104
changeset:   102353:93d325c64104
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Fri Jul 15 02:43:03 2016 -0400
summary:
  Issue #25507: Move 4 objects from pyshell to run and switch inports.
This removes one problem inport and reduces len(sys.modules) by 37.

files:
  Lib/idlelib/pyshell.py     |  101 +--------------------
  Lib/idlelib/run.py         |  121 +++++++++++++++++++++++-
  Lib/idlelib/stackviewer.py |    2 +-
  3 files changed, 114 insertions(+), 110 deletions(-)


diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py
--- a/Lib/idlelib/pyshell.py
+++ b/Lib/idlelib/pyshell.py
@@ -25,7 +25,6 @@
 import threading
 import time
 import tokenize
-import io
 
 import linecache
 from code import InteractiveInterpreter
@@ -37,6 +36,7 @@
 from idlelib.undo import UndoDelegator
 from idlelib.outwin import OutputWindow
 from idlelib.config import idleConf
+from idlelib.run import idle_formatwarning, PseudoInputFile, PseudoOutputFile
 from idlelib import rpc
 from idlelib import debugger
 from idlelib import debugger_r
@@ -52,19 +52,6 @@
 warning_stream = sys.__stderr__  # None, at least on Windows, if no console.
 import warnings
 
-def idle_formatwarning(message, category, filename, lineno, line=None):
-    """Format warnings the IDLE way."""
-
-    s = "\nWarning (from warnings module):\n"
-    s += '  File \"%s\", line %s\n' % (filename, lineno)
-    if line is None:
-        line = linecache.getline(filename, lineno)
-    line = line.strip()
-    if line:
-        s += "    %s\n" % line
-    s += "%s: %s\n" % (category.__name__, message)
-    return s
-
 def idle_showwarning(
         message, category, filename, lineno, file=None, line=None):
     """Show Idle-format warning (after replacing warnings.showwarning).
@@ -1316,92 +1303,6 @@
             return 'disabled'
         return super().rmenu_check_paste()
 
-class PseudoFile(io.TextIOBase):
-
-    def __init__(self, shell, tags, encoding=None):
-        self.shell = shell
-        self.tags = tags
-        self._encoding = encoding
-
-    @property
-    def encoding(self):
-        return self._encoding
-
-    @property
-    def name(self):
-        return '<%s>' % self.tags
-
-    def isatty(self):
-        return True
-
-
-class PseudoOutputFile(PseudoFile):
-
-    def writable(self):
-        return True
-
-    def write(self, s):
-        if self.closed:
-            raise ValueError("write to closed file")
-        if type(s) is not str:
-            if not isinstance(s, str):
-                raise TypeError('must be str, not ' + type(s).__name__)
-            # See issue #19481
-            s = str.__str__(s)
-        return self.shell.write(s, self.tags)
-
-
-class PseudoInputFile(PseudoFile):
-
-    def __init__(self, shell, tags, encoding=None):
-        PseudoFile.__init__(self, shell, tags, encoding)
-        self._line_buffer = ''
-
-    def readable(self):
-        return True
-
-    def read(self, size=-1):
-        if self.closed:
-            raise ValueError("read from closed file")
-        if size is None:
-            size = -1
-        elif not isinstance(size, int):
-            raise TypeError('must be int, not ' + type(size).__name__)
-        result = self._line_buffer
-        self._line_buffer = ''
-        if size < 0:
-            while True:
-                line = self.shell.readline()
-                if not line: break
-                result += line
-        else:
-            while len(result) < size:
-                line = self.shell.readline()
-                if not line: break
-                result += line
-            self._line_buffer = result[size:]
-            result = result[:size]
-        return result
-
-    def readline(self, size=-1):
-        if self.closed:
-            raise ValueError("read from closed file")
-        if size is None:
-            size = -1
-        elif not isinstance(size, int):
-            raise TypeError('must be int, not ' + type(size).__name__)
-        line = self._line_buffer or self.shell.readline()
-        if size < 0:
-            size = len(line)
-        eol = line.find('\n', 0, size)
-        if eol >= 0:
-            size = eol + 1
-        self._line_buffer = line[size:]
-        return line[:size]
-
-    def close(self):
-        self.shell.close()
-
 
 def fix_x11_paste(root):
     "Make paste replace selection on x11.  See issue #5124."
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -1,10 +1,11 @@
+import io
+import linecache
+import queue
 import sys
-import linecache
+import _thread as thread
+import threading
 import time
 import traceback
-import _thread as thread
-import threading
-import queue
 import tkinter
 
 from idlelib import calltips
@@ -14,7 +15,6 @@
 from idlelib import debugobj_r
 from idlelib import stackviewer
 from idlelib import rpc
-from idlelib import pyshell
 from idlelib import iomenu
 
 import __main__
@@ -23,6 +23,19 @@
 
 import warnings
 
+def idle_formatwarning(message, category, filename, lineno, line=None):
+    """Format warnings the IDLE way."""
+
+    s = "\nWarning (from warnings module):\n"
+    s += '  File \"%s\", line %s\n' % (filename, lineno)
+    if line is None:
+        line = linecache.getline(filename, lineno)
+    line = line.strip()
+    if line:
+        s += "    %s\n" % line
+    s += "%s: %s\n" % (category.__name__, message)
+    return s
+
 def idle_showwarning_subproc(
         message, category, filename, lineno, file=None, line=None):
     """Show Idle-format warning after replacing warnings.showwarning.
@@ -32,7 +45,7 @@
     if file is None:
         file = sys.stderr
     try:
-        file.write(pyshell.idle_formatwarning(
+        file.write(idle_formatwarning(
                 message, category, filename, lineno, line))
     except IOError:
         pass # the file (probably stderr) is invalid - this warning gets lost.
@@ -291,6 +304,96 @@
             quitting = True
             thread.interrupt_main()
 
+
+# Pseudofiles for shell-remote communication (also used in pyshell)
+
+class PseudoFile(io.TextIOBase):
+
+    def __init__(self, shell, tags, encoding=None):
+        self.shell = shell
+        self.tags = tags
+        self._encoding = encoding
+
+    @property
+    def encoding(self):
+        return self._encoding
+
+    @property
+    def name(self):
+        return '<%s>' % self.tags
+
+    def isatty(self):
+        return True
+
+
+class PseudoOutputFile(PseudoFile):
+
+    def writable(self):
+        return True
+
+    def write(self, s):
+        if self.closed:
+            raise ValueError("write to closed file")
+        if type(s) is not str:
+            if not isinstance(s, str):
+                raise TypeError('must be str, not ' + type(s).__name__)
+            # See issue #19481
+            s = str.__str__(s)
+        return self.shell.write(s, self.tags)
+
+
+class PseudoInputFile(PseudoFile):
+
+    def __init__(self, shell, tags, encoding=None):
+        PseudoFile.__init__(self, shell, tags, encoding)
+        self._line_buffer = ''
+
+    def readable(self):
+        return True
+
+    def read(self, size=-1):
+        if self.closed:
+            raise ValueError("read from closed file")
+        if size is None:
+            size = -1
+        elif not isinstance(size, int):
+            raise TypeError('must be int, not ' + type(size).__name__)
+        result = self._line_buffer
+        self._line_buffer = ''
+        if size < 0:
+            while True:
+                line = self.shell.readline()
+                if not line: break
+                result += line
+        else:
+            while len(result) < size:
+                line = self.shell.readline()
+                if not line: break
+                result += line
+            self._line_buffer = result[size:]
+            result = result[:size]
+        return result
+
+    def readline(self, size=-1):
+        if self.closed:
+            raise ValueError("read from closed file")
+        if size is None:
+            size = -1
+        elif not isinstance(size, int):
+            raise TypeError('must be int, not ' + type(size).__name__)
+        line = self._line_buffer or self.shell.readline()
+        if size < 0:
+            size = len(line)
+        eol = line.find('\n', 0, size)
+        if eol >= 0:
+            size = eol + 1
+        self._line_buffer = line[size:]
+        return line[:size]
+
+    def close(self):
+        self.shell.close()
+
+
 class MyHandler(rpc.RPCHandler):
 
     def handle(self):
@@ -298,11 +401,11 @@
         executive = Executive(self)
         self.register("exec", executive)
         self.console = self.get_remote_proxy("console")
-        sys.stdin = pyshell.PseudoInputFile(self.console, "stdin",
+        sys.stdin = PseudoInputFile(self.console, "stdin",
                 iomenu.encoding)
-        sys.stdout = pyshell.PseudoOutputFile(self.console, "stdout",
+        sys.stdout = PseudoOutputFile(self.console, "stdout",
                 iomenu.encoding)
-        sys.stderr = pyshell.PseudoOutputFile(self.console, "stderr",
+        sys.stderr = PseudoOutputFile(self.console, "stderr",
                 iomenu.encoding)
 
         sys.displayhook = rpc.displayhook
diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py
--- a/Lib/idlelib/stackviewer.py
+++ b/Lib/idlelib/stackviewer.py
@@ -6,7 +6,6 @@
 
 from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
 from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem
-from idlelib.pyshell import PyShellFileList
 
 def StackBrowser(root, flist=None, tb=None, top=None):
     if top is None:
@@ -121,6 +120,7 @@
         return sublist
 
 def _stack_viewer(parent):  # htest #
+    from idlelib.pyshell import PyShellFileList
     top = tk.Toplevel(parent)
     top.title("Test StackViewer")
     x, y = map(int, parent.geometry().split('+')[1:])

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


More information about the Python-checkins mailing list