##// END OF EJS Templates
Merge pull request #10410 from Carreau/deprecated-profile=II...
Thomas Kluyver -
r23520:c382dbdc merge
parent child Browse files
Show More
@@ -1,600 +1,596
1 1 """Implementation of basic magic functions."""
2 2
3 3
4 4 import argparse
5 5 import textwrap
6 6 import io
7 7 import sys
8 8 from pprint import pformat
9 9
10 10 from IPython.core import magic_arguments, page
11 11 from IPython.core.error import UsageError
12 12 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
13 13 from IPython.utils.text import format_screen, dedent, indent
14 14 from IPython.testing.skipdoctest import skip_doctest
15 15 from IPython.utils.ipstruct import Struct
16 16 from warnings import warn
17 17 from logging import error
18 18
19 19
20 20 class MagicsDisplay(object):
21 21 def __init__(self, magics_manager, ignore=None):
22 22 self.ignore = ignore if ignore else []
23 23 self.magics_manager = magics_manager
24 24
25 25 def _lsmagic(self):
26 26 """The main implementation of the %lsmagic"""
27 27 mesc = magic_escapes['line']
28 28 cesc = magic_escapes['cell']
29 29 mman = self.magics_manager
30 30 magics = mman.lsmagic()
31 31 out = ['Available line magics:',
32 32 mesc + (' '+mesc).join(sorted([m for m,v in magics['line'].items() if (v not in self.ignore)])),
33 33 '',
34 34 'Available cell magics:',
35 35 cesc + (' '+cesc).join(sorted([m for m,v in magics['cell'].items() if (v not in self.ignore)])),
36 36 '',
37 37 mman.auto_status()]
38 38 return '\n'.join(out)
39 39
40 40 def _repr_pretty_(self, p, cycle):
41 41 p.text(self._lsmagic())
42 42
43 43 def __str__(self):
44 44 return self._lsmagic()
45 45
46 46 def _jsonable(self):
47 47 """turn magics dict into jsonable dict of the same structure
48 48
49 49 replaces object instances with their class names as strings
50 50 """
51 51 magic_dict = {}
52 52 mman = self.magics_manager
53 53 magics = mman.lsmagic()
54 54 for key, subdict in magics.items():
55 55 d = {}
56 56 magic_dict[key] = d
57 57 for name, obj in subdict.items():
58 58 try:
59 59 classname = obj.__self__.__class__.__name__
60 60 except AttributeError:
61 61 classname = 'Other'
62 62
63 63 d[name] = classname
64 64 return magic_dict
65 65
66 66 def _repr_json_(self):
67 67 return self._jsonable()
68 68
69 69
70 70 @magics_class
71 71 class BasicMagics(Magics):
72 72 """Magics that provide central IPython functionality.
73 73
74 74 These are various magics that don't fit into specific categories but that
75 75 are all part of the base 'IPython experience'."""
76 76
77 77 @magic_arguments.magic_arguments()
78 78 @magic_arguments.argument(
79 79 '-l', '--line', action='store_true',
80 80 help="""Create a line magic alias."""
81 81 )
82 82 @magic_arguments.argument(
83 83 '-c', '--cell', action='store_true',
84 84 help="""Create a cell magic alias."""
85 85 )
86 86 @magic_arguments.argument(
87 87 'name',
88 88 help="""Name of the magic to be created."""
89 89 )
90 90 @magic_arguments.argument(
91 91 'target',
92 92 help="""Name of the existing line or cell magic."""
93 93 )
94 94 @line_magic
95 95 def alias_magic(self, line=''):
96 96 """Create an alias for an existing line or cell magic.
97 97
98 98 Examples
99 99 --------
100 100 ::
101 101
102 102 In [1]: %alias_magic t timeit
103 103 Created `%t` as an alias for `%timeit`.
104 104 Created `%%t` as an alias for `%%timeit`.
105 105
106 106 In [2]: %t -n1 pass
107 107 1 loops, best of 3: 954 ns per loop
108 108
109 109 In [3]: %%t -n1
110 110 ...: pass
111 111 ...:
112 112 1 loops, best of 3: 954 ns per loop
113 113
114 114 In [4]: %alias_magic --cell whereami pwd
115 115 UsageError: Cell magic function `%%pwd` not found.
116 116 In [5]: %alias_magic --line whereami pwd
117 117 Created `%whereami` as an alias for `%pwd`.
118 118
119 119 In [6]: %whereami
120 120 Out[6]: u'/home/testuser'
121 121 """
122 122 args = magic_arguments.parse_argstring(self.alias_magic, line)
123 123 shell = self.shell
124 124 mman = self.shell.magics_manager
125 125 escs = ''.join(magic_escapes.values())
126 126
127 127 target = args.target.lstrip(escs)
128 128 name = args.name.lstrip(escs)
129 129
130 130 # Find the requested magics.
131 131 m_line = shell.find_magic(target, 'line')
132 132 m_cell = shell.find_magic(target, 'cell')
133 133 if args.line and m_line is None:
134 134 raise UsageError('Line magic function `%s%s` not found.' %
135 135 (magic_escapes['line'], target))
136 136 if args.cell and m_cell is None:
137 137 raise UsageError('Cell magic function `%s%s` not found.' %
138 138 (magic_escapes['cell'], target))
139 139
140 140 # If --line and --cell are not specified, default to the ones
141 141 # that are available.
142 142 if not args.line and not args.cell:
143 143 if not m_line and not m_cell:
144 144 raise UsageError(
145 145 'No line or cell magic with name `%s` found.' % target
146 146 )
147 147 args.line = bool(m_line)
148 148 args.cell = bool(m_cell)
149 149
150 150 if args.line:
151 151 mman.register_alias(name, target, 'line')
152 152 print('Created `%s%s` as an alias for `%s%s`.' % (
153 153 magic_escapes['line'], name,
154 154 magic_escapes['line'], target))
155 155
156 156 if args.cell:
157 157 mman.register_alias(name, target, 'cell')
158 158 print('Created `%s%s` as an alias for `%s%s`.' % (
159 159 magic_escapes['cell'], name,
160 160 magic_escapes['cell'], target))
161 161
162 162 @line_magic
163 163 def lsmagic(self, parameter_s=''):
164 164 """List currently available magic functions."""
165 165 return MagicsDisplay(self.shell.magics_manager, ignore=[self.pip])
166 166
167 167 def _magic_docs(self, brief=False, rest=False):
168 168 """Return docstrings from magic functions."""
169 169 mman = self.shell.magics_manager
170 170 docs = mman.lsmagic_docs(brief, missing='No documentation')
171 171
172 172 if rest:
173 173 format_string = '**%s%s**::\n\n%s\n\n'
174 174 else:
175 175 format_string = '%s%s:\n%s\n'
176 176
177 177 return ''.join(
178 178 [format_string % (magic_escapes['line'], fname,
179 179 indent(dedent(fndoc)))
180 180 for fname, fndoc in sorted(docs['line'].items())]
181 181 +
182 182 [format_string % (magic_escapes['cell'], fname,
183 183 indent(dedent(fndoc)))
184 184 for fname, fndoc in sorted(docs['cell'].items())]
185 185 )
186 186
187 187 @line_magic
188 188 def magic(self, parameter_s=''):
189 189 """Print information about the magic function system.
190 190
191 191 Supported formats: -latex, -brief, -rest
192 192 """
193 193
194 194 mode = ''
195 195 try:
196 196 mode = parameter_s.split()[0][1:]
197 197 except IndexError:
198 198 pass
199 199
200 200 brief = (mode == 'brief')
201 201 rest = (mode == 'rest')
202 202 magic_docs = self._magic_docs(brief, rest)
203 203
204 204 if mode == 'latex':
205 205 print(self.format_latex(magic_docs))
206 206 return
207 207 else:
208 208 magic_docs = format_screen(magic_docs)
209 209
210 210 out = ["""
211 211 IPython's 'magic' functions
212 212 ===========================
213 213
214 214 The magic function system provides a series of functions which allow you to
215 215 control the behavior of IPython itself, plus a lot of system-type
216 216 features. There are two kinds of magics, line-oriented and cell-oriented.
217 217
218 218 Line magics are prefixed with the % character and work much like OS
219 219 command-line calls: they get as an argument the rest of the line, where
220 220 arguments are passed without parentheses or quotes. For example, this will
221 221 time the given statement::
222 222
223 223 %timeit range(1000)
224 224
225 225 Cell magics are prefixed with a double %%, and they are functions that get as
226 226 an argument not only the rest of the line, but also the lines below it in a
227 227 separate argument. These magics are called with two arguments: the rest of the
228 228 call line and the body of the cell, consisting of the lines below the first.
229 229 For example::
230 230
231 231 %%timeit x = numpy.random.randn((100, 100))
232 232 numpy.linalg.svd(x)
233 233
234 234 will time the execution of the numpy svd routine, running the assignment of x
235 235 as part of the setup phase, which is not timed.
236 236
237 237 In a line-oriented client (the terminal or Qt console IPython), starting a new
238 238 input with %% will automatically enter cell mode, and IPython will continue
239 239 reading input until a blank line is given. In the notebook, simply type the
240 240 whole cell as one entity, but keep in mind that the %% escape can only be at
241 241 the very start of the cell.
242 242
243 243 NOTE: If you have 'automagic' enabled (via the command line option or with the
244 244 %automagic function), you don't need to type in the % explicitly for line
245 245 magics; cell magics always require an explicit '%%' escape. By default,
246 246 IPython ships with automagic on, so you should only rarely need the % escape.
247 247
248 248 Example: typing '%cd mydir' (without the quotes) changes your working directory
249 249 to 'mydir', if it exists.
250 250
251 251 For a list of the available magic functions, use %lsmagic. For a description
252 252 of any of them, type %magic_name?, e.g. '%cd?'.
253 253
254 254 Currently the magic system has the following functions:""",
255 255 magic_docs,
256 256 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
257 257 str(self.lsmagic()),
258 258 ]
259 259 page.page('\n'.join(out))
260 260
261 261
262 262 @line_magic
263 263 def page(self, parameter_s=''):
264 264 """Pretty print the object and display it through a pager.
265 265
266 266 %page [options] OBJECT
267 267
268 268 If no object is given, use _ (last output).
269 269
270 270 Options:
271 271
272 272 -r: page str(object), don't pretty-print it."""
273 273
274 274 # After a function contributed by Olivier Aubert, slightly modified.
275 275
276 276 # Process options/args
277 277 opts, args = self.parse_options(parameter_s, 'r')
278 278 raw = 'r' in opts
279 279
280 280 oname = args and args or '_'
281 281 info = self.shell._ofind(oname)
282 282 if info['found']:
283 283 txt = (raw and str or pformat)( info['obj'] )
284 284 page.page(txt)
285 285 else:
286 286 print('Object `%s` not found' % oname)
287 287
288 288 @line_magic
289 289 def profile(self, parameter_s=''):
290 290 """Print your currently active IPython profile.
291 291
292 292 See Also
293 293 --------
294 294 prun : run code using the Python profiler
295 295 (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`)
296 296 """
297 warn("The `%profile` magic has been deprecated since IPython 2.0. Please use "
298 "the value of `get_ipython().profile` instead to see current profile in use.")
299 from IPython.core.application import BaseIPythonApplication
300 if BaseIPythonApplication.initialized():
301 print(BaseIPythonApplication.instance().profile)
302 else:
303 error("profile is an application-level value, but you don't appear to be in an IPython application")
297 raise UsageError("The `%profile` magic has been deprecated since IPython 2.0. "
298 "and removed in IPython 6.0. Please use the value of `get_ipython().profile` instead "
299 "to see current profile in use. Perhaps you meant to use `%prun` to profile code?")
304 300
305 301 @line_magic
306 302 def pprint(self, parameter_s=''):
307 303 """Toggle pretty printing on/off."""
308 304 ptformatter = self.shell.display_formatter.formatters['text/plain']
309 305 ptformatter.pprint = bool(1 - ptformatter.pprint)
310 306 print('Pretty printing has been turned',
311 307 ['OFF','ON'][ptformatter.pprint])
312 308
313 309 @line_magic
314 310 def colors(self, parameter_s=''):
315 311 """Switch color scheme for prompts, info system and exception handlers.
316 312
317 313 Currently implemented schemes: NoColor, Linux, LightBG.
318 314
319 315 Color scheme names are not case-sensitive.
320 316
321 317 Examples
322 318 --------
323 319 To get a plain black and white terminal::
324 320
325 321 %colors nocolor
326 322 """
327 323 def color_switch_err(name):
328 324 warn('Error changing %s color schemes.\n%s' %
329 325 (name, sys.exc_info()[1]), stacklevel=2)
330 326
331 327
332 328 new_scheme = parameter_s.strip()
333 329 if not new_scheme:
334 330 raise UsageError(
335 331 "%colors: you must specify a color scheme. See '%colors?'")
336 332 # local shortcut
337 333 shell = self.shell
338 334
339 335 # Set shell colour scheme
340 336 try:
341 337 shell.colors = new_scheme
342 338 shell.refresh_style()
343 339 except:
344 340 color_switch_err('shell')
345 341
346 342 # Set exception colors
347 343 try:
348 344 shell.InteractiveTB.set_colors(scheme = new_scheme)
349 345 shell.SyntaxTB.set_colors(scheme = new_scheme)
350 346 except:
351 347 color_switch_err('exception')
352 348
353 349 # Set info (for 'object?') colors
354 350 if shell.color_info:
355 351 try:
356 352 shell.inspector.set_active_scheme(new_scheme)
357 353 except:
358 354 color_switch_err('object inspector')
359 355 else:
360 356 shell.inspector.set_active_scheme('NoColor')
361 357
362 358 @line_magic
363 359 def xmode(self, parameter_s=''):
364 360 """Switch modes for the exception handlers.
365 361
366 362 Valid modes: Plain, Context and Verbose.
367 363
368 364 If called without arguments, acts as a toggle."""
369 365
370 366 def xmode_switch_err(name):
371 367 warn('Error changing %s exception modes.\n%s' %
372 368 (name,sys.exc_info()[1]))
373 369
374 370 shell = self.shell
375 371 new_mode = parameter_s.strip().capitalize()
376 372 try:
377 373 shell.InteractiveTB.set_mode(mode=new_mode)
378 374 print('Exception reporting mode:',shell.InteractiveTB.mode)
379 375 except:
380 376 xmode_switch_err('user')
381 377
382 378 @line_magic
383 379 def pip(self, args=''):
384 380 """
385 381 Intercept usage of ``pip`` in IPython and direct user to run command outside of IPython.
386 382 """
387 383 print(textwrap.dedent('''
388 384 The following command must be run outside of the IPython shell:
389 385
390 386 $ pip {args}
391 387
392 388 The Python package manager (pip) can only be used from outside of IPython.
393 389 Please reissue the `pip` command in a separate terminal or command prompt.
394 390
395 391 See the Python documentation for more informations on how to install packages:
396 392
397 393 https://docs.python.org/3/installing/'''.format(args=args)))
398 394
399 395 @line_magic
400 396 def quickref(self, arg):
401 397 """ Show a quick reference sheet """
402 398 from IPython.core.usage import quick_reference
403 399 qr = quick_reference + self._magic_docs(brief=True)
404 400 page.page(qr)
405 401
406 402 @line_magic
407 403 def doctest_mode(self, parameter_s=''):
408 404 """Toggle doctest mode on and off.
409 405
410 406 This mode is intended to make IPython behave as much as possible like a
411 407 plain Python shell, from the perspective of how its prompts, exceptions
412 408 and output look. This makes it easy to copy and paste parts of a
413 409 session into doctests. It does so by:
414 410
415 411 - Changing the prompts to the classic ``>>>`` ones.
416 412 - Changing the exception reporting mode to 'Plain'.
417 413 - Disabling pretty-printing of output.
418 414
419 415 Note that IPython also supports the pasting of code snippets that have
420 416 leading '>>>' and '...' prompts in them. This means that you can paste
421 417 doctests from files or docstrings (even if they have leading
422 418 whitespace), and the code will execute correctly. You can then use
423 419 '%history -t' to see the translated history; this will give you the
424 420 input after removal of all the leading prompts and whitespace, which
425 421 can be pasted back into an editor.
426 422
427 423 With these features, you can switch into this mode easily whenever you
428 424 need to do testing and changes to doctests, without having to leave
429 425 your existing IPython session.
430 426 """
431 427
432 428 # Shorthands
433 429 shell = self.shell
434 430 meta = shell.meta
435 431 disp_formatter = self.shell.display_formatter
436 432 ptformatter = disp_formatter.formatters['text/plain']
437 433 # dstore is a data store kept in the instance metadata bag to track any
438 434 # changes we make, so we can undo them later.
439 435 dstore = meta.setdefault('doctest_mode',Struct())
440 436 save_dstore = dstore.setdefault
441 437
442 438 # save a few values we'll need to recover later
443 439 mode = save_dstore('mode',False)
444 440 save_dstore('rc_pprint',ptformatter.pprint)
445 441 save_dstore('xmode',shell.InteractiveTB.mode)
446 442 save_dstore('rc_separate_out',shell.separate_out)
447 443 save_dstore('rc_separate_out2',shell.separate_out2)
448 444 save_dstore('rc_separate_in',shell.separate_in)
449 445 save_dstore('rc_active_types',disp_formatter.active_types)
450 446
451 447 if not mode:
452 448 # turn on
453 449
454 450 # Prompt separators like plain python
455 451 shell.separate_in = ''
456 452 shell.separate_out = ''
457 453 shell.separate_out2 = ''
458 454
459 455
460 456 ptformatter.pprint = False
461 457 disp_formatter.active_types = ['text/plain']
462 458
463 459 shell.magic('xmode Plain')
464 460 else:
465 461 # turn off
466 462 shell.separate_in = dstore.rc_separate_in
467 463
468 464 shell.separate_out = dstore.rc_separate_out
469 465 shell.separate_out2 = dstore.rc_separate_out2
470 466
471 467 ptformatter.pprint = dstore.rc_pprint
472 468 disp_formatter.active_types = dstore.rc_active_types
473 469
474 470 shell.magic('xmode ' + dstore.xmode)
475 471
476 472 # mode here is the state before we switch; switch_doctest_mode takes
477 473 # the mode we're switching to.
478 474 shell.switch_doctest_mode(not mode)
479 475
480 476 # Store new mode and inform
481 477 dstore.mode = bool(not mode)
482 478 mode_label = ['OFF','ON'][dstore.mode]
483 479 print('Doctest mode is:', mode_label)
484 480
485 481 @line_magic
486 482 def gui(self, parameter_s=''):
487 483 """Enable or disable IPython GUI event loop integration.
488 484
489 485 %gui [GUINAME]
490 486
491 487 This magic replaces IPython's threaded shells that were activated
492 488 using the (pylab/wthread/etc.) command line flags. GUI toolkits
493 489 can now be enabled at runtime and keyboard
494 490 interrupts should work without any problems. The following toolkits
495 491 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
496 492
497 493 %gui wx # enable wxPython event loop integration
498 494 %gui qt4|qt # enable PyQt4 event loop integration
499 495 %gui qt5 # enable PyQt5 event loop integration
500 496 %gui gtk # enable PyGTK event loop integration
501 497 %gui gtk3 # enable Gtk3 event loop integration
502 498 %gui tk # enable Tk event loop integration
503 499 %gui osx # enable Cocoa event loop integration
504 500 # (requires %matplotlib 1.1)
505 501 %gui # disable all event loop integration
506 502
507 503 WARNING: after any of these has been called you can simply create
508 504 an application object, but DO NOT start the event loop yourself, as
509 505 we have already handled that.
510 506 """
511 507 opts, arg = self.parse_options(parameter_s, '')
512 508 if arg=='': arg = None
513 509 try:
514 510 return self.shell.enable_gui(arg)
515 511 except Exception as e:
516 512 # print simple error message, rather than traceback if we can't
517 513 # hook up the GUI
518 514 error(str(e))
519 515
520 516 @skip_doctest
521 517 @line_magic
522 518 def precision(self, s=''):
523 519 """Set floating point precision for pretty printing.
524 520
525 521 Can set either integer precision or a format string.
526 522
527 523 If numpy has been imported and precision is an int,
528 524 numpy display precision will also be set, via ``numpy.set_printoptions``.
529 525
530 526 If no argument is given, defaults will be restored.
531 527
532 528 Examples
533 529 --------
534 530 ::
535 531
536 532 In [1]: from math import pi
537 533
538 534 In [2]: %precision 3
539 535 Out[2]: u'%.3f'
540 536
541 537 In [3]: pi
542 538 Out[3]: 3.142
543 539
544 540 In [4]: %precision %i
545 541 Out[4]: u'%i'
546 542
547 543 In [5]: pi
548 544 Out[5]: 3
549 545
550 546 In [6]: %precision %e
551 547 Out[6]: u'%e'
552 548
553 549 In [7]: pi**10
554 550 Out[7]: 9.364805e+04
555 551
556 552 In [8]: %precision
557 553 Out[8]: u'%r'
558 554
559 555 In [9]: pi**10
560 556 Out[9]: 93648.047476082982
561 557 """
562 558 ptformatter = self.shell.display_formatter.formatters['text/plain']
563 559 ptformatter.float_precision = s
564 560 return ptformatter.float_format
565 561
566 562 @magic_arguments.magic_arguments()
567 563 @magic_arguments.argument(
568 564 '-e', '--export', action='store_true', default=False,
569 565 help=argparse.SUPPRESS
570 566 )
571 567 @magic_arguments.argument(
572 568 'filename', type=str,
573 569 help='Notebook name or filename'
574 570 )
575 571 @line_magic
576 572 def notebook(self, s):
577 573 """Export and convert IPython notebooks.
578 574
579 575 This function can export the current IPython history to a notebook file.
580 576 For example, to export the history to "foo.ipynb" do "%notebook foo.ipynb".
581 577
582 578 The -e or --export flag is deprecated in IPython 5.2, and will be
583 579 removed in the future.
584 580 """
585 581 args = magic_arguments.parse_argstring(self.notebook, s)
586 582
587 583 from nbformat import write, v4
588 584
589 585 cells = []
590 586 hist = list(self.shell.history_manager.get_range())
591 587 if(len(hist)<=1):
592 588 raise ValueError('History is empty, cannot export')
593 589 for session, execution_count, source in hist[:-1]:
594 590 cells.append(v4.new_code_cell(
595 591 execution_count=execution_count,
596 592 source=source
597 593 ))
598 594 nb = v4.new_notebook(cells=cells)
599 595 with io.open(args.filename, 'w', encoding='utf-8') as f:
600 596 write(nb, f, version=4)
@@ -1,176 +1,181
1 1 =====================
2 2 Development version
3 3 =====================
4 4
5 5 This document describes in-flight development work.
6 6
7 7 .. warning::
8 8
9 9 Please do not edit this file by hand (doing so will likely cause merge
10 10 conflicts for other Pull Requests). Instead, create a new file in the
11 11 `docs/source/whatsnew/pr` folder
12 12
13 13 IPython 6.0
14 14 ===========
15 15
16 16 Released .... ...., 2017
17 17
18 18 IPython 6 feature a major improvement in the completion machinery which is now
19 19 capable of completing non-executed code. It is also the first version of IPython
20 20 to stop compatibility with Python 2, which is still supported on the bugfix only
21 21 5.x branch. Read below to have a non-exhaustive list of new features.
22 22
23 23 Make sure you have pip > 9.0 before upgrading.
24 24 You should be able to update by using:
25 25
26 26 .. code::
27 27
28 28 pip install ipython --upgrade
29 29
30 30 New completion API and Interface
31 31 --------------------------------
32 32
33 33 The completer Completion API has seen an overhaul, and the new completer have
34 34 plenty of improvement both from the end users of terminal IPython or for
35 35 consumers of the API.
36 36
37 37 This new API is capable of pulling completions from :any:`jedi`, thus allowing
38 38 type inference on non-executed code. If :any:`jedi` is installed completion like
39 39 the following are now becoming possible without code evaluation:
40 40
41 41 >>> data = ['Number of users', 123_456]
42 42 ... data[0].<tab>
43 43
44 44 That is to say, IPython is now capable of inferring that `data[0]` is a string,
45 45 and will suggest completions like `.capitalize`. The completion power of IPython
46 46 will increase with new Jedi releases, and a number of bugs and more completions
47 47 are already available on development version of :any:`jedi` if you are curious.
48 48
49 49 With the help of prompt toolkit, types of completions can be shown in the
50 50 completer interface:
51 51
52 52 .. image:: ../_images/jedi_type_inference_60.png
53 53 :alt: Jedi showing ability to do type inference
54 54 :align: center
55 55 :width: 400px
56 56 :target: ../_images/jedi_type_inference_60.png
57 57
58 58 The appearance of the completer is controlled by the
59 59 ``c.TerminalInteractiveShell.display_completions`` option that will show the
60 60 type differently depending on the value among ``'column'``, ``'multicolumn'``
61 61 and ``'readlinelike'``
62 62
63 63 The use of Jedi also full fill a number of request and fix a number of bugs
64 64 like case insensitive completion, completion after division operator: See
65 65 :ghpull:`10182`.
66 66
67 67 Extra patches and updates will be needed to the :mod:`ipykernel` package for
68 68 this feature to be available to other clients like jupyter Notebook, Lab,
69 69 Nteract, Hydrogen...
70 70
71 71 The use of Jedi can is barely noticeable on recent enough machines, but can be
72 72 feel on older ones, in cases were Jedi behavior need to be adjusted, the amount
73 73 of time given to Jedi to compute type inference can be adjusted with
74 74 ``c.IPCompleter.jedi_compute_type_timeout``, with object whose type were not
75 75 inferred will be shown as ``<unknown>``. Jedi can also be completely deactivated
76 76 by using the ``c.Completer.use_jedi=False`` option.
77 77
78 78
79 79 The old ``Completer.complete()`` API is waiting deprecation and should be
80 80 replaced replaced by ``Completer.completions()`` in a near future. Feedback on
81 81 the current state of the API and suggestions welcome.
82 82
83 83 Python 3 only codebase
84 84 ----------------------
85 85
86 86 One of the large challenges in IPython 6.0 has been the adoption of a pure
87 87 Python 3 code base, which lead us to great length to upstream patches in pip,
88 88 pypi and warehouse to make sure Python 2 system still upgrade to the latest
89 89 compatible Python version compatible.
90 90
91 91 We remind our Python 2 users that IPython 5 is still compatible with Python 2.7,
92 92 still maintained and get regular releases. Using pip 9+, upgrading IPython will
93 93 automatically upgrade to the latest version compatible with your system.
94 94
95 95 .. warning::
96 96
97 97 If you are on a system using an older verison of pip on Python 2, pip may
98 98 still install IPython 6.0 on your system, and IPython will refuse to start.
99 99 You can fix this by ugrading pip, and reinstalling ipython, or forcing pip to
100 100 install an earlier version: ``pip install 'ipython<6'``
101 101
102 102 The ability to use only Python 3 on the code base of IPython has bring a number
103 103 of advantage. Most of the newly written code make use of `optional function type
104 104 anotation <https://www.python.org/dev/peps/pep-0484/>`_ leading to clearer code
105 105 and better documentation.
106 106
107 107 The total size of the repository has also for a first time between releases
108 108 (excluding the big split for 4.0) decreased by about 1500 lines, potentially
109 109 quite a bit more codewide as some documents like this one are append only and
110 110 are about 300 lines long.
111 111
112 112 The removal as of Python2/Python3 shim layer has made the code quite clearer and
113 113 more idiomatic in a number of location, and much friendlier to work with and
114 114 understand. We hope to further embrace Python 3 capability in the next release
115 115 cycle and introduce more of the Python 3 only idioms (yield from, kwarg only,
116 116 general unpacking) in the code base of IPython, and see if we can take advantage
117 117 of these as well to improve user experience with better error messages and
118 118 hints.
119 119
120 120
121 121 Miscs improvements
122 122 ------------------
123 123
124 124
125 125 - The :cellmagic:`capture` magic can now capture the result of a cell (from an
126 126 expression on the last line), as well as printed and displayed output.
127 127 :ghpull:`9851`.
128 128
129 129 - Pressing Ctrl-Z in the terminal debugger now suspends IPython, as it already
130 130 does in the main terminal prompt.
131 131
132 132 - autoreload can now reload ``Enum``. See :ghissue:`10232` and :ghpull:`10316`
133 133
134 134 - IPython.display has gained a :any:`GeoJSON <IPython.display.GeoJSON>` object.
135 135 :ghpull:`10288` and :ghpull:`10253`
136 136
137 137 .. DO NOT EDIT THIS LINE BEFORE RELEASE. FEATURE INSERTION POINT.
138 138
139 139
140 140 Functions Deprecated in 6.x Development cycle
141 141 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142 142
143 143 - Loading extensions from ``ipython_extension_dir`` print a warning that this
144 144 location is pending deprecation. This should only affect users still having
145 145 extensions installed with ``%install_ext`` which has been deprecated since
146 146 IPython 4.0, and removed in 5.0. Extensions still present in
147 147 ``ipython_extension_dir`` may shadow more recently installed versions using
148 148 pip. It is thus recommended to clean ``ipython_extension_dir`` of any
149 149 extension now available as a package.
150 150
151 151
152 152 - ``IPython.utils.warn`` was deprecated in IPython 4.0, and has now been removed.
153 153 instead of ``IPython.utils.warn`` inbuilt :any:`warnings` module is used.
154 154
155 155
156 156 - The function `IPython.core.oinspect.py:call_tip` is unused, was marked as
157 157 Deprecated (raising a Deprecation Warning) and marked for later removal
158 158 :ghpull:`10104`
159 159
160 160 Backwards incompatible changes
161 161 ------------------------------
162 162
163 163 Functions Removed in 6.x Development cycle
164 164 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
165 165
166 166 The following functions have been removed in the
167 167 development cycle marked for Milestone 6.0.
168 168
169 169 - ``IPython/utils/process.py`` - ``is_cmd_found``
170 170 - ``IPython/utils/process.py`` - ``pycmd2argv``
171 171
172 172 - The `--deep-reload` flag and the corresponding options to inject `dreload` or
173 173 `reload` into the interactive namespace have been removed. You have to
174 174 explicitly import `reload` from `IPython.lib.deepreload` to use it.
175 175
176 - the :magic:`profile` used to print current IPython profile in use, and which
177 was deprecated in IPython 2.0 does now raise a `DeprecationWarning` error when
178 used. It is often confused with the :magic:`prun` and the deprecation remove
179 should free up the ``profile`` name in future versions.
180
176 181 .. DO NOT EDIT THIS LINE BEFORE RELEASE. INCOMPAT INSERTION POINT.
General Comments 0
You need to be logged in to leave comments. Login now