diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py index 3a3e885..793f222 100644 --- a/IPython/core/interactiveshell.py +++ b/IPython/core/interactiveshell.py @@ -431,6 +431,8 @@ class InteractiveShell(SingletonConfigurable): last_execution_succeeded = Bool(True, help='Did last executed command succeeded') + last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True) + def __init__(self, ipython_dir=None, profile_dir=None, user_module=None, user_ns=None, custom_exceptions=((), None), **kwargs): @@ -2613,7 +2615,7 @@ class InteractiveShell(SingletonConfigurable): result = ExecutionResult() if (not raw_cell) or raw_cell.isspace(): - self.last_execution_succeeded = True + self.last_execution_succeeded, self.last_execution_result = True, result return result if silent: @@ -2624,7 +2626,7 @@ class InteractiveShell(SingletonConfigurable): def error_before_exec(value): result.error_before_exec = value - self.last_execution_succeeded = False + self.last_execution_succeeded, self.last_execution_result = False, result return result self.events.trigger('pre_execute') @@ -2714,7 +2716,7 @@ class InteractiveShell(SingletonConfigurable): has_raised = self.run_ast_nodes(code_ast.body, cell_name, interactivity=interactivity, compiler=compiler, result=result) - self.last_execution_succeeded = not has_raised + self.last_execution_succeeded, self.last_execution_result = not has_raised, result # Reset this so later displayed values do not modify the # ExecutionResult diff --git a/IPython/core/tests/test_interactiveshell.py b/IPython/core/tests/test_interactiveshell.py index 45bcc8e..6871ed2 100644 --- a/IPython/core/tests/test_interactiveshell.py +++ b/IPython/core/tests/test_interactiveshell.py @@ -470,6 +470,17 @@ class InteractiveShellTestCase(unittest.TestCase): text = ip.object_inspect_text('a') self.assertIsInstance(text, str) + def test_last_execution_result(self): + """ Check that last execution result gets set correctly (GH-10702) """ + result = ip.run_cell('a = 5; a') + self.assertTrue(ip.last_execution_succeeded) + self.assertEqual(ip.last_execution_result.result, 5) + + result = ip.run_cell('a = x_invalid_id_x') + self.assertFalse(ip.last_execution_succeeded) + self.assertFalse(ip.last_execution_result.success) + self.assertIsInstance(ip.last_execution_result.error_in_exec, NameError) + class TestSafeExecfileNonAsciiPath(unittest.TestCase):