From cd42e1cc98d6cbc69b460cd114c0c3e9586eb460 Mon Sep 17 00:00:00 2001
From: Pavel Nekrasov
Date: Thu, 5 Nov 2026 21:53:10 +0300
Subject: [PATCH 1/3] Fix single-element tuple in idlelib redirector __repr__
Drop the stray comma in two __repr__ f-strings so repr() does not
format a one-element tuple.
---
Lib/idlelib/idle_test/test_redirector.py | 7 +++++--
Lib/idlelib/redirector.py | 4 ++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/Lib/idlelib/idle_test/test_redirector.py b/Lib/idlelib/idle_test/test_redirector.py
index bd486d7da66010..2e88656e81de1c 100644
--- a/Lib/idlelib/idle_test/test_redirector.py
+++ b/Lib/idlelib/idle_test/test_redirector.py
@@ -64,8 +64,11 @@ def tearDown(self):
self.redir.close()
def test_repr(self): # partly for 100% coverage
- self.assertIn('Redirector', repr(self.redir))
- self.assertIn('Original', repr(self.orig_insert))
+ self.assertRegex(repr(self.redir),
+ r"^WidgetRedirector\(Text<.+>\)$")
+ self.assertRegex(
+ repr(self.orig_insert),
+ r"^OriginalCommand\(WidgetRedirector\(Text<.+>\), 'insert'\)$")
def test_register(self):
self.assertEqual(self.text.get('1.0', 'end'), '\n')
diff --git a/Lib/idlelib/redirector.py b/Lib/idlelib/redirector.py
index 8e2ba68d3815bf..821a45ee7982a4 100644
--- a/Lib/idlelib/redirector.py
+++ b/Lib/idlelib/redirector.py
@@ -48,7 +48,7 @@ def __init__(self, widget):
def __repr__(self):
w = self.widget
- return f"{self.__class__.__name__,}({w.__class__.__name__}<{w._w}>)"
+ return f"{self.__class__.__name__}({w.__class__.__name__}<{w._w}>)"
def close(self):
"Unregister operations and revert redirection created by .__init__."
@@ -143,7 +143,7 @@ def __init__(self, redir, operation):
self.orig_and_operation = (redir.orig, operation)
def __repr__(self):
- return f"{self.__class__.__name__,}({self.redir!r}, {self.operation!r})"
+ return f"{self.__class__.__name__}({self.redir!r}, {self.operation!r})"
def __call__(self, *args):
return self.tk_call(self.orig_and_operation + args)
From d41a91767c8adb61301cc3e6a6318d9c28eed0b4 Mon Sep 17 00:00:00 2001
From: Pavel Nekrasov
Date: Fri, 6 Nov 2026 17:12:41 +0300
Subject: [PATCH 2/3] Add NEWS entry
---
.../next/IDLE/2026-11-06-17-12-40.gh-issue-161477.smXIKC.rst | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 Misc/NEWS.d/next/IDLE/2026-11-06-17-12-40.gh-issue-161477.smXIKC.rst
diff --git a/Misc/NEWS.d/next/IDLE/2026-11-06-17-12-40.gh-issue-161477.smXIKC.rst b/Misc/NEWS.d/next/IDLE/2026-11-06-17-12-40.gh-issue-161477.smXIKC.rst
new file mode 100644
index 00000000000000..ca955e608bc893
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2026-11-06-17-12-40.gh-issue-161477.smXIKC.rst
@@ -0,0 +1,3 @@
+Fix ``repr()`` of ``idlelib.redirector.WidgetRedirector`` and
+``idlelib.redirector.OriginalCommand``, which displayed a spurious
+one-element tuple.
From 0b6f37238afb491276088585aa3c1cbfff00c190 Mon Sep 17 00:00:00 2001
From: Terry Jan Reedy
Date: Fri, 6 Nov 2026 17:20:15 -0500
Subject: [PATCH 3/3] Apply suggestion
---
Lib/idlelib/idle_test/test_redirector.py | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/Lib/idlelib/idle_test/test_redirector.py b/Lib/idlelib/idle_test/test_redirector.py
index 2e88656e81de1c..58e7775071c19c 100644
--- a/Lib/idlelib/idle_test/test_redirector.py
+++ b/Lib/idlelib/idle_test/test_redirector.py
@@ -64,11 +64,10 @@ def tearDown(self):
self.redir.close()
def test_repr(self): # partly for 100% coverage
- self.assertRegex(repr(self.redir),
- r"^WidgetRedirector\(Text<.+>\)$")
- self.assertRegex(
- repr(self.orig_insert),
- r"^OriginalCommand\(WidgetRedirector\(Text<.+>\), 'insert'\)$")
+ self.assertEqual(repr(self.redir),
+ f"WidgetRedirector(Text<{self.text._w}>)")
+ self.assertEqual(repr(self.orig_insert),
+ f"OriginalCommand({self.redir!r}, 'insert')")
def test_register(self):
self.assertEqual(self.text.get('1.0', 'end'), '\n')