Show More
@@ -91,7 +91,13 b' class DisplayHook(Configurable):' | |||
|
91 | 91 | # some uses of ipshellembed may fail here |
|
92 | 92 | return False |
|
93 | 93 | |
|
94 | sio = _io.StringIO(cell) | |
|
94 | return self.semicolon_at_end_of_expression(cell) | |
|
95 | ||
|
96 | @staticmethod | |
|
97 | def semicolon_at_end_of_expression(expression): | |
|
98 | """Parse Python expression and detects whether last token is ';'""" | |
|
99 | ||
|
100 | sio = _io.StringIO(expression) | |
|
95 | 101 | tokens = list(tokenize.generate_tokens(sio.readline)) |
|
96 | 102 | |
|
97 | 103 | for token in reversed(tokens): |
@@ -2363,12 +2363,12 b' class InteractiveShell(SingletonConfigurable):' | |||
|
2363 | 2363 | with self.builtin_trap: |
|
2364 | 2364 | result = fn(*args, **kwargs) |
|
2365 | 2365 | |
|
2366 | # The code below prevents output from being displayed | |
|
2367 |
# when using magic |
|
|
2368 | # Output from '%time foo();', for instance, would never | |
|
2369 | # be displayed. | |
|
2370 | if magic_name == "time" and len(magic_arg_s) > 0 and magic_arg_s[-1] == ";": | |
|
2371 | return None | |
|
2366 | # The code below prevents the output from being displayed | |
|
2367 | # when using magics with decodator @output_can_be_disabled | |
|
2368 | # when the last Python token in the expression is a ';'. | |
|
2369 | if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_DISABLED, False): | |
|
2370 | if DisplayHook.semicolon_at_end_of_expression(magic_arg_s): | |
|
2371 | return None | |
|
2372 | 2372 | |
|
2373 | 2373 | return result |
|
2374 | 2374 |
@@ -258,7 +258,7 b' def _function_magic_marker(magic_kind):' | |||
|
258 | 258 | |
|
259 | 259 | |
|
260 | 260 | MAGIC_NO_VAR_EXPAND_ATTR = '_ipython_magic_no_var_expand' |
|
261 | ||
|
261 | MAGIC_OUTPUT_CAN_BE_DISABLED = '_ipython_magic_output_can_be_disabled' | |
|
262 | 262 | |
|
263 | 263 | def no_var_expand(magic_func): |
|
264 | 264 | """Mark a magic function as not needing variable expansion |
@@ -275,6 +275,15 b' def no_var_expand(magic_func):' | |||
|
275 | 275 | setattr(magic_func, MAGIC_NO_VAR_EXPAND_ATTR, True) |
|
276 | 276 | return magic_func |
|
277 | 277 | |
|
278 | def output_can_be_disabled(magic_func): | |
|
279 | """Mark a magic function so its output may be disabled. | |
|
280 | ||
|
281 | The output is disabled if the Python expression used as a parameter of | |
|
282 | the magic ends in a semicolon, not counting a Python comment that can | |
|
283 | follows it. | |
|
284 | """ | |
|
285 | setattr(magic_func, MAGIC_OUTPUT_CAN_BE_DISABLED, True) | |
|
286 | return magic_func | |
|
278 | 287 | |
|
279 | 288 | # Create the actual decorators for public use |
|
280 | 289 |
@@ -37,6 +37,7 b' from IPython.core.magic import (' | |||
|
37 | 37 | magics_class, |
|
38 | 38 | needs_local_scope, |
|
39 | 39 | no_var_expand, |
|
40 | output_can_be_disabled, | |
|
40 | 41 | on_off, |
|
41 | 42 | ) |
|
42 | 43 | from IPython.testing.skipdoctest import skip_doctest |
@@ -1194,6 +1195,7 b' class ExecutionMagics(Magics):' | |||
|
1194 | 1195 | @no_var_expand |
|
1195 | 1196 | @needs_local_scope |
|
1196 | 1197 | @line_cell_magic |
|
1198 | @output_can_be_disabled | |
|
1197 | 1199 | def time(self,line='', cell=None, local_ns=None): |
|
1198 | 1200 | """Time execution of a Python statement or expression. |
|
1199 | 1201 |
@@ -419,7 +419,7 b' def test_time():' | |||
|
419 | 419 | |
|
420 | 420 | # ';' at the end of %time prevents instruction value to be printed. |
|
421 | 421 | # This tests fix for #13837. |
|
422 | def test_time_no_outputwith_semicolon(): | |
|
422 | def test_time_no_output_with_semicolon(): | |
|
423 | 423 | ip = get_ipython() |
|
424 | 424 | |
|
425 | 425 | with tt.AssertPrints(" 123456"): |
@@ -432,6 +432,21 b' def test_time_no_outputwith_semicolon():' | |||
|
432 | 432 | with tt.AssertPrints("CPU times: ", suppress=False): |
|
433 | 433 | ip.run_cell("%time 123000+456;") |
|
434 | 434 | |
|
435 | with tt.AssertPrints(" 123456"): | |
|
436 | with tt.AssertPrints("Wall time: ", suppress=False): | |
|
437 | with tt.AssertPrints("CPU times: ", suppress=False): | |
|
438 | ip.run_cell("%time 123000+456 # Comment") | |
|
439 | ||
|
440 | with tt.AssertNotPrints(" 123456"): | |
|
441 | with tt.AssertPrints("Wall time: ", suppress=False): | |
|
442 | with tt.AssertPrints("CPU times: ", suppress=False): | |
|
443 | ip.run_cell("%time 123000+456; # Comment") | |
|
444 | ||
|
445 | with tt.AssertPrints(" 123456"): | |
|
446 | with tt.AssertPrints("Wall time: ", suppress=False): | |
|
447 | with tt.AssertPrints("CPU times: ", suppress=False): | |
|
448 | ip.run_cell("%time 123000+456 # ;Comment") | |
|
449 | ||
|
435 | 450 | |
|
436 | 451 | def test_time_last_not_expression(): |
|
437 | 452 | ip.run_cell("%%time\n" |
General Comments 0
You need to be logged in to leave comments.
Login now