[Python-checkins] [3.11] gh-103668: Run pyugrade on idlelib (GH-103671) (#103730)

terryjreedy webhook-mailer at python.org
Sun Apr 23 21:09:53 EDT 2023


https://github.com/python/cpython/commit/5054459678db1f9737e31b96a859112dbac98c52
commit: 5054459678db1f9737e31b96a859112dbac98c52
branch: 3.11
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: terryjreedy <tjreedy at udel.edu>
date: 2023-04-23T21:09:46-04:00
summary:

[3.11] gh-103668: Run pyugrade on idlelib (GH-103671) (#103730)

---------
(cherry picked from commit bd2dca035af88694e25fb060f984fbbcda82bed8)
Co-authored-by: Nikita Sobolev <mail at sobolevn.me>
Co-authored-by: Terry Jan Reedy tjreedy at udel.edu

files:
M Lib/idlelib/calltip_w.py
M Lib/idlelib/debugger.py
M Lib/idlelib/debugobj.py
M Lib/idlelib/editor.py
M Lib/idlelib/filelist.py
M Lib/idlelib/idle_test/test_config.py
M Lib/idlelib/idle_test/test_outwin.py
M Lib/idlelib/multicall.py
M Lib/idlelib/outwin.py
M Lib/idlelib/pyshell.py
M Lib/idlelib/redirector.py
M Lib/idlelib/rpc.py
M Lib/idlelib/run.py
M Lib/idlelib/textview.py
M Lib/idlelib/tooltip.py
M Lib/idlelib/tree.py
M Lib/idlelib/undo.py

diff --git a/Lib/idlelib/calltip_w.py b/Lib/idlelib/calltip_w.py
index 1e0404aa49f5..278546064add 100644
--- a/Lib/idlelib/calltip_w.py
+++ b/Lib/idlelib/calltip_w.py
@@ -25,7 +25,7 @@ def __init__(self, text_widget):
         text_widget: a Text widget with code for which call-tips are desired
         """
         # Note: The Text widget will be accessible as self.anchor_widget
-        super(CalltipWindow, self).__init__(text_widget)
+        super().__init__(text_widget)
 
         self.label = self.text = None
         self.parenline = self.parencol = self.lastline = None
@@ -54,7 +54,7 @@ def position_window(self):
             return
         self.lastline = curline
         self.anchor_widget.see("insert")
-        super(CalltipWindow, self).position_window()
+        super().position_window()
 
     def showtip(self, text, parenleft, parenright):
         """Show the call-tip, bind events which will close it and reposition it.
@@ -73,7 +73,7 @@ def showtip(self, text, parenleft, parenright):
         self.parenline, self.parencol = map(
             int, self.anchor_widget.index(parenleft).split("."))
 
-        super(CalltipWindow, self).showtip()
+        super().showtip()
 
         self._bind_events()
 
@@ -143,7 +143,7 @@ def hidetip(self):
             # ValueError may be raised by MultiCall
             pass
 
-        super(CalltipWindow, self).hidetip()
+        super().hidetip()
 
     def _bind_events(self):
         """Bind event handlers."""
diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py
index ccd03e46e161..452c62b42655 100644
--- a/Lib/idlelib/debugger.py
+++ b/Lib/idlelib/debugger.py
@@ -49,9 +49,9 @@ def __frame2message(self, frame):
         filename = code.co_filename
         lineno = frame.f_lineno
         basename = os.path.basename(filename)
-        message = "%s:%s" % (basename, lineno)
+        message = f"{basename}:{lineno}"
         if code.co_name != "?":
-            message = "%s: %s()" % (message, code.co_name)
+            message = f"{message}: {code.co_name}()"
         return message
 
 
@@ -213,7 +213,8 @@ def interaction(self, message, frame, info=None):
                 m1 = "%s" % str(type)
             if value is not None:
                 try:
-                    m1 = "%s: %s" % (m1, str(value))
+                   # TODO redo entire section, tries not needed.
+                    m1 = f"{m1}: {value}"
                 except:
                     pass
             bg = "yellow"
diff --git a/Lib/idlelib/debugobj.py b/Lib/idlelib/debugobj.py
index 5a4c99788420..71d01c7070df 100644
--- a/Lib/idlelib/debugobj.py
+++ b/Lib/idlelib/debugobj.py
@@ -87,7 +87,7 @@ def GetSubList(self):
                 continue
             def setfunction(value, key=key, object=self.object):
                 object[key] = value
-            item = make_objecttreeitem("%r:" % (key,), value, setfunction)
+            item = make_objecttreeitem(f"{key!r}:", value, setfunction)
             sublist.append(item)
         return sublist
 
diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py
index 08d6aa2efde2..505815502600 100644
--- a/Lib/idlelib/editor.py
+++ b/Lib/idlelib/editor.py
@@ -38,12 +38,13 @@
 def _sphinx_version():
     "Format sys.version_info to produce the Sphinx version string used to install the chm docs"
     major, minor, micro, level, serial = sys.version_info
-    release = '%s%s' % (major, minor)
-    release += '%s' % (micro,)
+    # TODO remove unneeded function since .chm no longer installed
+    release = f'{major}{minor}'
+    release += f'{micro}'
     if level == 'candidate':
-        release += 'rc%s' % (serial,)
+        release += f'rc{serial}'
     elif level != 'final':
-        release += '%s%s' % (level[0], serial)
+        release += f'{level[0]}{serial}'
     return release
 
 
@@ -950,7 +951,7 @@ def update_recent_files_list(self, new_file=None):
         rf_list = []
         file_path = self.recent_files_path
         if file_path and os.path.exists(file_path):
-            with open(file_path, 'r',
+            with open(file_path,
                       encoding='utf_8', errors='replace') as rf_list_file:
                 rf_list = rf_list_file.readlines()
         if new_file:
@@ -1458,7 +1459,7 @@ def newline_and_indent_event(self, event):
                     else:
                         self.reindent_to(y.compute_backslash_indent())
                 else:
-                    assert 0, "bogus continuation type %r" % (c,)
+                    assert 0, f"bogus continuation type {c!r}"
                 return "break"
 
             # This line starts a brand new statement; indent relative to
diff --git a/Lib/idlelib/filelist.py b/Lib/idlelib/filelist.py
index 254f5caf6b81..f87781d2570f 100644
--- a/Lib/idlelib/filelist.py
+++ b/Lib/idlelib/filelist.py
@@ -22,7 +22,7 @@ def open(self, filename, action=None):
             # This can happen when bad filename is passed on command line:
             messagebox.showerror(
                 "File Error",
-                "%r is a directory." % (filename,),
+                f"{filename!r} is a directory.",
                 master=self.root)
             return None
         key = os.path.normcase(filename)
@@ -90,7 +90,7 @@ def filename_changed_edit(self, edit):
             self.inversedict[conflict] = None
             messagebox.showerror(
                 "Name Conflict",
-                "You now have multiple edit windows open for %r" % (filename,),
+                f"You now have multiple edit windows open for {filename!r}",
                 master=self.root)
         self.dict[newkey] = edit
         self.inversedict[edit] = newkey
diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py
index 697fda527968..08ed76fe2882 100644
--- a/Lib/idlelib/idle_test/test_config.py
+++ b/Lib/idlelib/idle_test/test_config.py
@@ -191,7 +191,7 @@ def setUpClass(cls):
             idle_dir = os.path.abspath(sys.path[0])
         for ctype in conf.config_types:
             config_path = os.path.join(idle_dir, '../config-%s.def' % ctype)
-            with open(config_path, 'r') as f:
+            with open(config_path) as f:
                 cls.config_string[ctype] = f.read()
 
         cls.orig_warn = config._warn
diff --git a/Lib/idlelib/idle_test/test_outwin.py b/Lib/idlelib/idle_test/test_outwin.py
index e347bfca7f19..d6e85ad67441 100644
--- a/Lib/idlelib/idle_test/test_outwin.py
+++ b/Lib/idlelib/idle_test/test_outwin.py
@@ -159,7 +159,7 @@ def test_file_line_helper(self, mock_open):
         for line, expected_output in test_lines:
             self.assertEqual(flh(line), expected_output)
             if expected_output:
-                mock_open.assert_called_with(expected_output[0], 'r')
+                mock_open.assert_called_with(expected_output[0])
 
 
 if __name__ == '__main__':
diff --git a/Lib/idlelib/multicall.py b/Lib/idlelib/multicall.py
index dc02001292fc..0200f445cc93 100644
--- a/Lib/idlelib/multicall.py
+++ b/Lib/idlelib/multicall.py
@@ -52,9 +52,9 @@
     _modifier_masks = (MC_CONTROL, MC_ALT, MC_SHIFT, MC_META)
 
 # a dictionary to map a modifier name into its number
-_modifier_names = dict([(name, number)
+_modifier_names = {name: number
                          for number in range(len(_modifiers))
-                         for name in _modifiers[number]])
+                         for name in _modifiers[number]}
 
 # In 3.4, if no shell window is ever open, the underlying Tk widget is
 # destroyed before .__del__ methods here are called.  The following
@@ -134,7 +134,7 @@ def nbits(n):
         return nb
     statelist = []
     for state in states:
-        substates = list(set(state & x for x in states))
+        substates = list({state & x for x in states})
         substates.sort(key=nbits, reverse=True)
         statelist.append(substates)
     return statelist
@@ -258,9 +258,9 @@ def __del__(self):
 _binder_classes = (_ComplexBinder,) * 4 + (_SimpleBinder,) * (len(_types)-4)
 
 # A dictionary to map a type name into its number
-_type_names = dict([(name, number)
+_type_names = {name: number
                      for number in range(len(_types))
-                     for name in _types[number]])
+                     for name in _types[number]}
 
 _keysym_re = re.compile(r"^\w+$")
 _button_re = re.compile(r"^[1-5]$")
diff --git a/Lib/idlelib/outwin.py b/Lib/idlelib/outwin.py
index 5ab08bbaf4bc..ac67c904ab97 100644
--- a/Lib/idlelib/outwin.py
+++ b/Lib/idlelib/outwin.py
@@ -42,7 +42,7 @@ def file_line_helper(line):
         if match:
             filename, lineno = match.group(1, 2)
             try:
-                f = open(filename, "r")
+                f = open(filename)
                 f.close()
                 break
             except OSError:
diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py
index e68233a5a413..bdde15616617 100755
--- a/Lib/idlelib/pyshell.py
+++ b/Lib/idlelib/pyshell.py
@@ -249,7 +249,7 @@ def store_file_breaks(self):
         breaks = self.breakpoints
         filename = self.io.filename
         try:
-            with open(self.breakpointPath, "r") as fp:
+            with open(self.breakpointPath) as fp:
                 lines = fp.readlines()
         except OSError:
             lines = []
@@ -279,7 +279,7 @@ def restore_file_breaks(self):
         if filename is None:
             return
         if os.path.isfile(self.breakpointPath):
-            with open(self.breakpointPath, "r") as fp:
+            with open(self.breakpointPath) as fp:
                 lines = fp.readlines()
             for line in lines:
                 if line.startswith(filename + '='):
@@ -441,7 +441,7 @@ def build_subprocess_arglist(self):
         # run from the IDLE source directory.
         del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc',
                                        default=False, type='bool')
-        command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,)
+        command = f"__import__('idlelib.run').run.main({del_exitf!r})"
         return [sys.executable] + w + ["-c", command, str(self.port)]
 
     def start_subprocess(self):
@@ -574,9 +574,9 @@ def transfer_path(self, with_cwd=False):
 
         self.runcommand("""if 1:
         import sys as _sys
-        _sys.path = %r
+        _sys.path = {!r}
         del _sys
-        \n""" % (path,))
+        \n""".format(path))
 
     active_seq = None
 
@@ -703,14 +703,14 @@ def stuffsource(self, source):
     def prepend_syspath(self, filename):
         "Prepend sys.path with file's directory if not already included"
         self.runcommand("""if 1:
-            _filename = %r
+            _filename = {!r}
             import sys as _sys
             from os.path import dirname as _dirname
             _dir = _dirname(_filename)
             if not _dir in _sys.path:
                 _sys.path.insert(0, _dir)
             del _filename, _sys, _dirname, _dir
-            \n""" % (filename,))
+            \n""".format(filename))
 
     def showsyntaxerror(self, filename=None):
         """Override Interactive Interpreter method: Use Colorizing
@@ -1536,7 +1536,7 @@ def main():
     try:
         opts, args = getopt.getopt(sys.argv[1:], "c:deihnr:st:")
     except getopt.error as msg:
-        print("Error: %s\n%s" % (msg, usage_msg), file=sys.stderr)
+        print(f"Error: {msg}\n{usage_msg}", file=sys.stderr)
         sys.exit(2)
     for o, a in opts:
         if o == '-c':
@@ -1668,9 +1668,9 @@ def main():
     if cmd or script:
         shell.interp.runcommand("""if 1:
             import sys as _sys
-            _sys.argv = %r
+            _sys.argv = {!r}
             del _sys
-            \n""" % (sys.argv,))
+            \n""".format(sys.argv))
         if cmd:
             shell.interp.execsource(cmd)
         elif script:
diff --git a/Lib/idlelib/redirector.py b/Lib/idlelib/redirector.py
index 9ab34c5acfb2..4928340e98df 100644
--- a/Lib/idlelib/redirector.py
+++ b/Lib/idlelib/redirector.py
@@ -47,9 +47,8 @@ def __init__(self, widget):
         tk.createcommand(w, self.dispatch)
 
     def __repr__(self):
-        return "%s(%s<%s>)" % (self.__class__.__name__,
-                               self.widget.__class__.__name__,
-                               self.widget._w)
+        w = self.widget
+        return f"{self.__class__.__name__,}({w.__class__.__name__}<{w._w}>)"
 
     def close(self):
         "Unregister operations and revert redirection created by .__init__."
@@ -143,8 +142,7 @@ def __init__(self, redir, operation):
         self.orig_and_operation = (redir.orig, operation)
 
     def __repr__(self):
-        return "%s(%r, %r)" % (self.__class__.__name__,
-                               self.redir, self.operation)
+        return f"{self.__class__.__name__,}({self.redir!r}, {self.operation!r})"
 
     def __call__(self, *args):
         return self.tk_call(self.orig_and_operation + args)
diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py
index 62eec84c9c8d..b08b80c90045 100644
--- a/Lib/idlelib/rpc.py
+++ b/Lib/idlelib/rpc.py
@@ -174,7 +174,7 @@ def localcall(self, seq, request):
         except TypeError:
             return ("ERROR", "Bad request format")
         if oid not in self.objtable:
-            return ("ERROR", "Unknown object id: %r" % (oid,))
+            return ("ERROR", f"Unknown object id: {oid!r}")
         obj = self.objtable[oid]
         if methodname == "__methods__":
             methods = {}
@@ -185,7 +185,7 @@ def localcall(self, seq, request):
             _getattributes(obj, attributes)
             return ("OK", attributes)
         if not hasattr(obj, methodname):
-            return ("ERROR", "Unsupported method name: %r" % (methodname,))
+            return ("ERROR", f"Unsupported method name: {methodname!r}")
         method = getattr(obj, methodname)
         try:
             if how == 'CALL':
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 577c49eb67b2..9eeaaa3aa04c 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -52,13 +52,13 @@ 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)
+    s += f'  File \"{filename}\", line {lineno}\n'
     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)
+    s += f"{category.__name__}: {message}\n"
     return s
 
 def idle_showwarning_subproc(
diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py
index a66c1a4309a6..23f0f4cb5027 100644
--- a/Lib/idlelib/textview.py
+++ b/Lib/idlelib/textview.py
@@ -169,7 +169,7 @@ def view_file(parent, title, filename, encoding, modal=True, wrap='word',
     with contents of the file.
     """
     try:
-        with open(filename, 'r', encoding=encoding) as file:
+        with open(filename, encoding=encoding) as file:
             contents = file.read()
     except OSError:
         showerror(title='File Load Error',
diff --git a/Lib/idlelib/tooltip.py b/Lib/idlelib/tooltip.py
index d714318dae8e..3983690dd411 100644
--- a/Lib/idlelib/tooltip.py
+++ b/Lib/idlelib/tooltip.py
@@ -92,7 +92,7 @@ def __init__(self, anchor_widget, hover_delay=1000):
         e.g. after hovering over the anchor widget with the mouse for enough
         time.
         """
-        super(OnHoverTooltipBase, self).__init__(anchor_widget)
+        super().__init__(anchor_widget)
         self.hover_delay = hover_delay
 
         self._after_id = None
@@ -107,7 +107,7 @@ def __del__(self):
             self.anchor_widget.unbind("<Button>", self._id3) # pragma: no cover
         except TclError:
             pass
-        super(OnHoverTooltipBase, self).__del__()
+        super().__del__()
 
     def _show_event(self, event=None):
         """event handler to display the tooltip"""
@@ -139,7 +139,7 @@ def hidetip(self):
             self.unschedule()
         except TclError:  # pragma: no cover
             pass
-        super(OnHoverTooltipBase, self).hidetip()
+        super().hidetip()
 
 
 class Hovertip(OnHoverTooltipBase):
@@ -154,7 +154,7 @@ def __init__(self, anchor_widget, text, hover_delay=1000):
         e.g. after hovering over the anchor widget with the mouse for enough
         time.
         """
-        super(Hovertip, self).__init__(anchor_widget, hover_delay=hover_delay)
+        super().__init__(anchor_widget, hover_delay=hover_delay)
         self.text = text
 
     def showcontents(self):
diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py
index 5947268f5c35..5f30f0f6092b 100644
--- a/Lib/idlelib/tree.py
+++ b/Lib/idlelib/tree.py
@@ -32,7 +32,7 @@
 if os.path.isdir(_icondir):
     ICONDIR = _icondir
 elif not os.path.isdir(ICONDIR):
-    raise RuntimeError("can't find icon directory (%r)" % (ICONDIR,))
+    raise RuntimeError(f"can't find icon directory ({ICONDIR!r})")
 
 def listicons(icondir=ICONDIR):
     """Utility to display the available icons."""
diff --git a/Lib/idlelib/undo.py b/Lib/idlelib/undo.py
index 85ecffecb4cb..5f10c0f05c1a 100644
--- a/Lib/idlelib/undo.py
+++ b/Lib/idlelib/undo.py
@@ -309,7 +309,7 @@ def __repr__(self):
         s = self.__class__.__name__
         strs = []
         for cmd in self.cmds:
-            strs.append("    %r" % (cmd,))
+            strs.append(f"    {cmd!r}")
         return s + "(\n" + ",\n".join(strs) + "\n)"
 
     def __len__(self):



More information about the Python-checkins mailing list