gh-138568: Make help mode in PyREPL not exit on empty line input (#143512)

Signed-off-by: yihong0618 <zouzou0208@gmail.com>
Co-authored-by: yihong0618 <zouzou0208@gmail.com>
This commit is contained in:
Łukasz Langa 2026-01-07 16:30:58 +01:00 committed by GitHub
parent a1eedaee98
commit b3e4a3462f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 1 deletions

View File

@ -2004,10 +2004,11 @@ has the same effect as typing a particular string at the help> prompt.
while True:
try:
request = self.getline('help> ')
if not request: break
except (KeyboardInterrupt, EOFError):
break
request = request.strip()
if not request:
continue # back to the prompt
# Make sure significant trailing quoting marks of literals don't
# get deleted while cleaning input

View File

@ -2147,10 +2147,47 @@ class PydocUrlHandlerTest(PydocBaseTest):
class TestHelper(unittest.TestCase):
def mock_interactive_session(self, inputs):
"""
Given a list of inputs, run an interactive help session. Returns a string
of what would be shown on screen.
"""
input_iter = iter(inputs)
def mock_getline(prompt):
output.write(prompt)
next_input = next(input_iter)
output.write(next_input + os.linesep)
return next_input
with captured_stdout() as output:
helper = pydoc.Helper(output=output)
with unittest.mock.patch.object(helper, "getline", mock_getline):
helper.interact()
# handle different line endings across platforms consistently
return output.getvalue().strip().splitlines(keepends=False)
def test_keywords(self):
self.assertEqual(sorted(pydoc.Helper.keywords),
sorted(keyword.kwlist))
def test_interact_empty_line_continues(self):
# gh-138568: test pressing Enter without input should continue in help session
self.assertEqual(
self.mock_interactive_session(["", " ", "quit"]),
["help> ", "help> ", "help> quit"],
)
def test_interact_quit_commands_exit(self):
quit_commands = ["quit", "q", "exit"]
for quit_cmd in quit_commands:
with self.subTest(quit_command=quit_cmd):
self.assertEqual(
self.mock_interactive_session([quit_cmd]),
[f"help> {quit_cmd}"],
)
class PydocWithMetaClasses(unittest.TestCase):
def tearDown(self):

View File

@ -0,0 +1,2 @@
Adjusted the built-in :func:`help` function so that empty inputs are ignored in
interactive mode.