##// END OF EJS Templates
Implementing decorator
nfgf -
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 %time.
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