Closes #17730: in code.interact(), when banner="", do not print anything.

Also adds tests for banner printing.
This commit is contained in:
Georg Brandl 2013-10-13 21:49:06 +02:00
parent a8fc7f6fac
commit fbc3c3c2be
3 changed files with 19 additions and 2 deletions

View File

@ -132,12 +132,15 @@ interpreter objects as well as the following additions.
.. method:: InteractiveConsole.interact(banner=None) .. method:: InteractiveConsole.interact(banner=None)
Closely emulate the interactive Python console. The optional banner argument Closely emulate the interactive Python console. The optional *banner* argument
specify the banner to print before the first interaction; by default it prints a specify the banner to print before the first interaction; by default it prints a
banner similar to the one printed by the standard Python interpreter, followed banner similar to the one printed by the standard Python interpreter, followed
by the class name of the console object in parentheses (so as not to confuse by the class name of the console object in parentheses (so as not to confuse
this with the real interpreter -- since it's so close!). this with the real interpreter -- since it's so close!).
.. versionchanged:: 3.4
To suppress printing any banner, pass an empty string.
.. method:: InteractiveConsole.push(line) .. method:: InteractiveConsole.push(line)

View File

@ -216,7 +216,7 @@ class InteractiveConsole(InteractiveInterpreter):
self.write("Python %s on %s\n%s\n(%s)\n" % self.write("Python %s on %s\n%s\n(%s)\n" %
(sys.version, sys.platform, cprt, (sys.version, sys.platform, cprt,
self.__class__.__name__)) self.__class__.__name__))
else: elif banner:
self.write("%s\n" % str(banner)) self.write("%s\n" % str(banner))
more = 0 more = 0
while 1: while 1:

View File

@ -64,6 +64,20 @@ class TestInteractiveConsole(unittest.TestCase):
self.console.interact() self.console.interact()
self.assertTrue(hook.called) self.assertTrue(hook.called)
def test_banner(self):
# with banner
self.infunc.side_effect = EOFError('Finished')
self.console.interact(banner='Foo')
self.assertEqual(len(self.stderr.method_calls), 2)
banner_call = self.stderr.method_calls[0]
self.assertEqual(banner_call, ['write', ('Foo\n',), {}])
# no banner
self.stderr.reset_mock()
self.infunc.side_effect = EOFError('Finished')
self.console.interact(banner='')
self.assertEqual(len(self.stderr.method_calls), 1)
def test_main(): def test_main():
support.run_unittest(TestInteractiveConsole) support.run_unittest(TestInteractiveConsole)