##// END OF EJS Templates
Merge pull request #13626 from MrMino/changenote-pr-13624...
Blazej Michalik -
r27622:7ad0dca1 merge
parent child Browse files
Show More
@@ -1,1064 +1,1067 b''
1 1 ============
2 2 8.x Series
3 3 ============
4 4
5 5
6 6 .. _version 8.3.0:
7 7
8 8 IPython 8.3.0
9 9 -------------
10 10
11 11 - :ghpull:`13625`, using ``?``, ``??``, ``*?`` will not call
12 12 ``set_next_input`` as most frontend allow proper multiline editing and it was
13 13 causing issues for many users of multi-cell frontends.
14 14
15 15
16 16 - :ghpull:`13600`, ``pre_run_*``-hooks will now have a ``cell_id`` attribute on
17 17 the info object when frontend provide it.
18 18
19 - :ghpull:`13624`, fixed :kbd:`End` key being broken after accepting an
20 autosuggestion.
21
19 22 .. _version 8.2.0:
20 23
21 24 IPython 8.2.0
22 25 -------------
23 26
24 27 IPython 8.2 mostly bring bugfixes to IPython.
25 28
26 29 - Auto-suggestion can now be elected with the ``end`` key. :ghpull:`13566`
27 30 - Some traceback issues with ``assert etb is not None`` have been fixed. :ghpull:`13588`
28 31 - History is now pulled from the sqitel database and not from in-memory.
29 32 In particular when using the ``%paste`` magic, the content of the pasted text will
30 33 be part of the history and not the verbatim text ``%paste`` anymore. :ghpull:`13592`
31 34 - Fix ``Ctrl-\\`` exit cleanup :ghpull:`13603`
32 35 - Fixes to ``ultratb`` ipdb support when used outside of IPython. :ghpull:`13498`
33 36
34 37
35 38 I am still trying to fix and investigate :ghissue:`13598`, which seem to be
36 39 random, and would appreciate help if you find reproducible minimal case. I've
37 40 tried to make various changes to the codebase to mitigate it, but a proper fix
38 41 will be difficult without understanding the cause.
39 42
40 43
41 44 All the issues on pull-requests for this release can be found in the `8.2
42 45 milestone. <https://github.com/ipython/ipython/milestone/100>`__ . And some
43 46 documentation only PR can be found as part of the `7.33 milestone
44 47 <https://github.com/ipython/ipython/milestone/101>`__ (currently not released).
45 48
46 49 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
47 50 work on IPython and related libraries.
48 51
49 52 .. _version 8.1.1:
50 53
51 54 IPython 8.1.1
52 55 -------------
53 56
54 57 Fix an issue with virtualenv and Python 3.8 introduced in 8.1
55 58
56 59 Revert :ghpull:`13537` (fix an issue with symlinks in virtualenv) that raises an
57 60 error in Python 3.8, and fixed in a different way in :ghpull:`13559`.
58 61
59 62 .. _version 8.1:
60 63
61 64 IPython 8.1.0
62 65 -------------
63 66
64 67 IPython 8.1 is the first minor release after 8.0 and fixes a number of bugs and
65 68 Update a few behavior that were problematic with the 8.0 as with many new major
66 69 release.
67 70
68 71 Note that beyond the changes listed here, IPython 8.1.0 also contains all the
69 72 features listed in :ref:`version 7.32`.
70 73
71 74 - Misc and multiple fixes around quotation auto-closing. It is now disabled by
72 75 default. Run with ``TerminalInteractiveShell.auto_match=True`` to re-enabled
73 76 - Require pygments>=2.4.0 :ghpull:`13459`, this was implicit in the code, but
74 77 is now explicit in ``setup.cfg``/``setup.py``
75 78 - Docs improvement of ``core.magic_arguments`` examples. :ghpull:`13433`
76 79 - Multi-line edit executes too early with await. :ghpull:`13424`
77 80
78 81 - ``black`` is back as an optional dependency, and autoformatting disabled by
79 82 default until some fixes are implemented (black improperly reformat magics).
80 83 :ghpull:`13471` Additionally the ability to use ``yapf`` as a code
81 84 reformatter has been added :ghpull:`13528` . You can use
82 85 ``TerminalInteractiveShell.autoformatter="black"``,
83 86 ``TerminalInteractiveShell.autoformatter="yapf"`` to re-enable auto formating
84 87 with black, or switch to yapf.
85 88
86 89 - Fix and issue where ``display`` was not defined.
87 90
88 91 - Auto suggestions are now configurable. Currently only
89 92 ``AutoSuggestFromHistory`` (default) and ``None``. new provider contribution
90 93 welcomed. :ghpull:`13475`
91 94
92 95 - multiple packaging/testing improvement to simplify downstream packaging
93 96 (xfail with reasons, try to not access network...).
94 97
95 98 - Update deprecation. ``InteractiveShell.magic`` internal method has been
96 99 deprecated for many years but did not emit a warning until now.
97 100
98 101 - internal ``appended_to_syspath`` context manager has been deprecated.
99 102
100 103 - fix an issue with symlinks in virtualenv :ghpull:`13537` (Reverted in 8.1.1)
101 104
102 105 - Fix an issue with vim mode, where cursor would not be reset on exit :ghpull:`13472`
103 106
104 107 - ipython directive now remove only known pseudo-decorators :ghpull:`13532`
105 108
106 109 - ``IPython/lib/security`` which used to be used for jupyter notebook has been
107 110 removed.
108 111
109 112 - Fix an issue where ``async with`` would execute on new lines. :ghpull:`13436`
110 113
111 114
112 115 We want to remind users that IPython is part of the Jupyter organisations, and
113 116 thus governed by a Code of Conduct. Some of the behavior we have seen on GitHub is not acceptable.
114 117 Abuse and non-respectful comments on discussion will not be tolerated.
115 118
116 119 Many thanks to all the contributors to this release, many of the above fixed issue and
117 120 new features where done by first time contributors, showing there is still
118 121 plenty of easy contribution possible in IPython
119 122 . You can find all individual contributions
120 123 to this milestone `on github <https://github.com/ipython/ipython/milestone/91>`__.
121 124
122 125 Thanks as well to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
123 126 work on IPython and related libraries. In particular the Lazy autoloading of
124 127 magics that you will find described in the 7.32 release notes.
125 128
126 129
127 130 .. _version 8.0.1:
128 131
129 132 IPython 8.0.1 (CVE-2022-21699)
130 133 ------------------------------
131 134
132 135 IPython 8.0.1, 7.31.1 and 5.11 are security releases that change some default
133 136 values in order to prevent potential Execution with Unnecessary Privileges.
134 137
135 138 Almost all version of IPython looks for configuration and profiles in current
136 139 working directory. Since IPython was developed before pip and environments
137 140 existed it was used a convenient way to load code/packages in a project
138 141 dependant way.
139 142
140 143 In 2022, it is not necessary anymore, and can lead to confusing behavior where
141 144 for example cloning a repository and starting IPython or loading a notebook from
142 145 any Jupyter-Compatible interface that has ipython set as a kernel can lead to
143 146 code execution.
144 147
145 148
146 149 I did not find any standard way for packaged to advertise CVEs they fix, I'm
147 150 thus trying to add a ``__patched_cves__`` attribute to the IPython module that
148 151 list the CVEs that should have been fixed. This attribute is informational only
149 152 as if a executable has a flaw, this value can always be changed by an attacker.
150 153
151 154 .. code::
152 155
153 156 In [1]: import IPython
154 157
155 158 In [2]: IPython.__patched_cves__
156 159 Out[2]: {'CVE-2022-21699'}
157 160
158 161 In [3]: 'CVE-2022-21699' in IPython.__patched_cves__
159 162 Out[3]: True
160 163
161 164 Thus starting with this version:
162 165
163 166 - The current working directory is not searched anymore for profiles or
164 167 configurations files.
165 168 - Added a ``__patched_cves__`` attribute (set of strings) to IPython module that contain
166 169 the list of fixed CVE. This is informational only.
167 170
168 171 Further details can be read on the `GitHub Advisory <https://github.com/ipython/ipython/security/advisories/GHSA-pq7m-3gw7-gq5x>`__
169 172
170 173
171 174 .. _version 8.0:
172 175
173 176 IPython 8.0
174 177 -----------
175 178
176 179 IPython 8.0 is bringing a large number of new features and improvements to both the
177 180 user of the terminal and of the kernel via Jupyter. The removal of compatibility
178 181 with older version of Python is also the opportunity to do a couple of
179 182 performance improvements in particular with respect to startup time.
180 183 The 8.x branch started diverging from its predecessor around IPython 7.12
181 184 (January 2020).
182 185
183 186 This release contains 250+ pull requests, in addition to many of the features
184 187 and backports that have made it to the 7.x branch. Please see the
185 188 `8.0 milestone <https://github.com/ipython/ipython/milestone/73?closed=1>`__ for the full list of pull requests.
186 189
187 190 Please feel free to send pull requests to updates those notes after release,
188 191 I have likely forgotten a few things reviewing 250+ PRs.
189 192
190 193 Dependencies changes/downstream packaging
191 194 -----------------------------------------
192 195
193 196 Most of our building steps have been changed to be (mostly) declarative
194 197 and follow PEP 517. We are trying to completely remove ``setup.py`` (:ghpull:`13238`) and are
195 198 looking for help to do so.
196 199
197 200 - minimum supported ``traitlets`` version is now 5+
198 201 - we now require ``stack_data``
199 202 - minimal Python is now 3.8
200 203 - ``nose`` is not a testing requirement anymore
201 204 - ``pytest`` replaces nose.
202 205 - ``iptest``/``iptest3`` cli entrypoints do not exists anymore.
203 206 - minimum officially support ``numpy`` version has been bumped, but this should
204 207 not have much effect on packaging.
205 208
206 209
207 210 Deprecation and removal
208 211 -----------------------
209 212
210 213 We removed almost all features, arguments, functions, and modules that were
211 214 marked as deprecated between IPython 1.0 and 5.0. As a reminder, 5.0 was released
212 215 in 2016, and 1.0 in 2013. Last release of the 5 branch was 5.10.0, in May 2020.
213 216 The few remaining deprecated features we left have better deprecation warnings
214 217 or have been turned into explicit errors for better error messages.
215 218
216 219 I will use this occasion to add the following requests to anyone emitting a
217 220 deprecation warning:
218 221
219 222 - Please add at least ``stacklevel=2`` so that the warning is emitted into the
220 223 caller context, and not the callee one.
221 224 - Please add **since which version** something is deprecated.
222 225
223 226 As a side note, it is much easier to conditionally compare version
224 227 numbers rather than using ``try/except`` when functionality changes with a version.
225 228
226 229 I won't list all the removed features here, but modules like ``IPython.kernel``,
227 230 which was just a shim module around ``ipykernel`` for the past 8 years, have been
228 231 removed, and so many other similar things that pre-date the name **Jupyter**
229 232 itself.
230 233
231 234 We no longer need to add ``IPython.extensions`` to the PYTHONPATH because that is being
232 235 handled by ``load_extension``.
233 236
234 237 We are also removing ``Cythonmagic``, ``sympyprinting`` and ``rmagic`` as they are now in
235 238 other packages and no longer need to be inside IPython.
236 239
237 240
238 241 Documentation
239 242 -------------
240 243
241 244 The majority of our docstrings have now been reformatted and automatically fixed by
242 245 the experimental `VΓ©lin <https://pypi.org/project/velin/>`_ project to conform
243 246 to numpydoc.
244 247
245 248 Type annotations
246 249 ----------------
247 250
248 251 While IPython itself is highly dynamic and can't be completely typed, many of
249 252 the functions now have type annotations, and part of the codebase is now checked
250 253 by mypy.
251 254
252 255
253 256 Featured changes
254 257 ----------------
255 258
256 259 Here is a features list of changes in IPython 8.0. This is of course non-exhaustive.
257 260 Please note as well that many features have been added in the 7.x branch as well
258 261 (and hence why you want to read the 7.x what's new notes), in particular
259 262 features contributed by QuantStack (with respect to debugger protocol and Xeus
260 263 Python), as well as many debugger features that I was pleased to implement as
261 264 part of my work at QuanSight and sponsored by DE Shaw.
262 265
263 266 Traceback improvements
264 267 ~~~~~~~~~~~~~~~~~~~~~~
265 268
266 269 Previously, error tracebacks for errors happening in code cells were showing a
267 270 hash, the one used for compiling the Python AST::
268 271
269 272 In [1]: def foo():
270 273 ...: return 3 / 0
271 274 ...:
272 275
273 276 In [2]: foo()
274 277 ---------------------------------------------------------------------------
275 278 ZeroDivisionError Traceback (most recent call last)
276 279 <ipython-input-2-c19b6d9633cf> in <module>
277 280 ----> 1 foo()
278 281
279 282 <ipython-input-1-1595a74c32d5> in foo()
280 283 1 def foo():
281 284 ----> 2 return 3 / 0
282 285 3
283 286
284 287 ZeroDivisionError: division by zero
285 288
286 289 The error traceback is now correctly formatted, showing the cell number in which the error happened::
287 290
288 291 In [1]: def foo():
289 292 ...: return 3 / 0
290 293 ...:
291 294
292 295 Input In [2]: foo()
293 296 ---------------------------------------------------------------------------
294 297 ZeroDivisionError Traceback (most recent call last)
295 298 input In [2], in <module>
296 299 ----> 1 foo()
297 300
298 301 Input In [1], in foo()
299 302 1 def foo():
300 303 ----> 2 return 3 / 0
301 304
302 305 ZeroDivisionError: division by zero
303 306
304 307 The ``stack_data`` package has been integrated, which provides smarter information in the traceback;
305 308 in particular it will highlight the AST node where an error occurs which can help to quickly narrow down errors.
306 309
307 310 For example in the following snippet::
308 311
309 312 def foo(i):
310 313 x = [[[0]]]
311 314 return x[0][i][0]
312 315
313 316
314 317 def bar():
315 318 return foo(0) + foo(
316 319 1
317 320 ) + foo(2)
318 321
319 322
320 323 calling ``bar()`` would raise an ``IndexError`` on the return line of ``foo``,
321 324 and IPython 8.0 is capable of telling you where the index error occurs::
322 325
323 326
324 327 IndexError
325 328 Input In [2], in <module>
326 329 ----> 1 bar()
327 330 ^^^^^
328 331
329 332 Input In [1], in bar()
330 333 6 def bar():
331 334 ----> 7 return foo(0) + foo(
332 335 ^^^^
333 336 8 1
334 337 ^^^^^^^^
335 338 9 ) + foo(2)
336 339 ^^^^
337 340
338 341 Input In [1], in foo(i)
339 342 1 def foo(i):
340 343 2 x = [[[0]]]
341 344 ----> 3 return x[0][i][0]
342 345 ^^^^^^^
343 346
344 347 The corresponding locations marked here with ``^`` will show up highlighted in
345 348 the terminal and notebooks.
346 349
347 350 Finally, a colon ``::`` and line number is appended after a filename in
348 351 traceback::
349 352
350 353
351 354 ZeroDivisionError Traceback (most recent call last)
352 355 File ~/error.py:4, in <module>
353 356 1 def f():
354 357 2 1/0
355 358 ----> 4 f()
356 359
357 360 File ~/error.py:2, in f()
358 361 1 def f():
359 362 ----> 2 1/0
360 363
361 364 Many terminals and editors have integrations enabling you to directly jump to the
362 365 relevant file/line when this syntax is used, so this small addition may have a high
363 366 impact on productivity.
364 367
365 368
366 369 Autosuggestions
367 370 ~~~~~~~~~~~~~~~
368 371
369 372 Autosuggestion is a very useful feature available in `fish <https://fishshell.com/>`__, `zsh <https://en.wikipedia.org/wiki/Z_shell>`__, and `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io/en/master/pages/asking_for_input.html#auto-suggestion>`__.
370 373
371 374 `Ptpython <https://github.com/prompt-toolkit/ptpython#ptpython>`__ allows users to enable this feature in
372 375 `ptpython/config.py <https://github.com/prompt-toolkit/ptpython/blob/master/examples/ptpython_config/config.py#L90>`__.
373 376
374 377 This feature allows users to accept autosuggestions with ctrl e, ctrl f,
375 378 or right arrow as described below.
376 379
377 380 1. Start ipython
378 381
379 382 .. image:: ../_images/8.0/auto_suggest_1_prompt_no_text.png
380 383
381 384 2. Run ``print("hello")``
382 385
383 386 .. image:: ../_images/8.0/auto_suggest_2_print_hello_suggest.png
384 387
385 388 3. start typing ``print`` again to see the autosuggestion
386 389
387 390 .. image:: ../_images/8.0/auto_suggest_3_print_hello_suggest.png
388 391
389 392 4. Press ``ctrl-f``, or ``ctrl-e``, or ``right-arrow`` to accept the suggestion
390 393
391 394 .. image:: ../_images/8.0/auto_suggest_4_print_hello.png
392 395
393 396 You can also complete word by word:
394 397
395 398 1. Run ``def say_hello(): print("hello")``
396 399
397 400 .. image:: ../_images/8.0/auto_suggest_second_prompt.png
398 401
399 402 2. Start typing the first letter if ``def`` to see the autosuggestion
400 403
401 404 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
402 405
403 406 3. Press ``alt-f`` (or ``escape`` followed by ``f``), to accept the first word of the suggestion
404 407
405 408 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
406 409
407 410 Importantly, this feature does not interfere with tab completion:
408 411
409 412 1. After running ``def say_hello(): print("hello")``, press d
410 413
411 414 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
412 415
413 416 2. Press Tab to start tab completion
414 417
415 418 .. image:: ../_images/8.0/auto_suggest_d_completions.png
416 419
417 420 3A. Press Tab again to select the first option
418 421
419 422 .. image:: ../_images/8.0/auto_suggest_def_completions.png
420 423
421 424 3B. Press ``alt f`` (``escape``, ``f``) to accept to accept the first word of the suggestion
422 425
423 426 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
424 427
425 428 3C. Press ``ctrl-f`` or ``ctrl-e`` to accept the entire suggestion
426 429
427 430 .. image:: ../_images/8.0/auto_suggest_match_parens.png
428 431
429 432
430 433 Currently, autosuggestions are only shown in the emacs or vi insert editing modes:
431 434
432 435 - The ctrl e, ctrl f, and alt f shortcuts work by default in emacs mode.
433 436 - To use these shortcuts in vi insert mode, you will have to create `custom keybindings in your config.py <https://github.com/mskar/setup/commit/2892fcee46f9f80ef7788f0749edc99daccc52f4/>`__.
434 437
435 438
436 439 Show pinfo information in ipdb using "?" and "??"
437 440 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
438 441
439 442 In IPDB, it is now possible to show the information about an object using "?"
440 443 and "??", in much the same way that it can be done when using the IPython prompt::
441 444
442 445 ipdb> partial?
443 446 Init signature: partial(self, /, *args, **kwargs)
444 447 Docstring:
445 448 partial(func, *args, **keywords) - new function with partial application
446 449 of the given arguments and keywords.
447 450 File: ~/.pyenv/versions/3.8.6/lib/python3.8/functools.py
448 451 Type: type
449 452 Subclasses:
450 453
451 454 Previously, ``pinfo`` or ``pinfo2`` command had to be used for this purpose.
452 455
453 456
454 457 Autoreload 3 feature
455 458 ~~~~~~~~~~~~~~~~~~~~
456 459
457 460 Example: When an IPython session is run with the 'autoreload' extension loaded,
458 461 you will now have the option '3' to select, which means the following:
459 462
460 463 1. replicate all functionality from option 2
461 464 2. autoload all new funcs/classes/enums/globals from the module when they are added
462 465 3. autoload all newly imported funcs/classes/enums/globals from external modules
463 466
464 467 Try ``%autoreload 3`` in an IPython session after running ``%load_ext autoreload``.
465 468
466 469 For more information please see the following unit test : ``extensions/tests/test_autoreload.py:test_autoload_newly_added_objects``
467 470
468 471 Auto formatting with black in the CLI
469 472 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
470 473
471 474 This feature was present in 7.x, but disabled by default.
472 475
473 476 In 8.0, input was automatically reformatted with Black when black was installed.
474 477 This feature has been reverted for the time being.
475 478 You can re-enable it by setting ``TerminalInteractiveShell.autoformatter`` to ``"black"``
476 479
477 480 History Range Glob feature
478 481 ~~~~~~~~~~~~~~~~~~~~~~~~~~
479 482
480 483 Previously, when using ``%history``, users could specify either
481 484 a range of sessions and lines, for example:
482 485
483 486 .. code-block:: python
484 487
485 488 ~8/1-~6/5 # see history from the first line of 8 sessions ago,
486 489 # to the fifth line of 6 sessions ago.``
487 490
488 491 Or users could specify a glob pattern:
489 492
490 493 .. code-block:: python
491 494
492 495 -g <pattern> # glob ALL history for the specified pattern.
493 496
494 497 However users could *not* specify both.
495 498
496 499 If a user *did* specify both a range and a glob pattern,
497 500 then the glob pattern would be used (globbing *all* history) *and the range would be ignored*.
498 501
499 502 With this enhancement, if a user specifies both a range and a glob pattern, then the glob pattern will be applied to the specified range of history.
500 503
501 504 Don't start a multi-line cell with sunken parenthesis
502 505 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
503 506
504 507 From now on, IPython will not ask for the next line of input when given a single
505 508 line with more closing than opening brackets. For example, this means that if
506 509 you (mis)type ``]]`` instead of ``[]``, a ``SyntaxError`` will show up, instead of
507 510 the ``...:`` prompt continuation.
508 511
509 512 IPython shell for ipdb interact
510 513 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
511 514
512 515 The ipdb ``interact`` starts an IPython shell instead of Python's built-in ``code.interact()``.
513 516
514 517 Automatic Vi prompt stripping
515 518 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
516 519
517 520 When pasting code into IPython, it will strip the leading prompt characters if
518 521 there are any. For example, you can paste the following code into the console -
519 522 it will still work, even though each line is prefixed with prompts (`In`,
520 523 `Out`)::
521 524
522 525 In [1]: 2 * 2 == 4
523 526 Out[1]: True
524 527
525 528 In [2]: print("This still works as pasted")
526 529
527 530
528 531 Previously, this was not the case for the Vi-mode prompts::
529 532
530 533 In [1]: [ins] In [13]: 2 * 2 == 4
531 534 ...: Out[13]: True
532 535 ...:
533 536 File "<ipython-input-1-727bb88eaf33>", line 1
534 537 [ins] In [13]: 2 * 2 == 4
535 538 ^
536 539 SyntaxError: invalid syntax
537 540
538 541 This is now fixed, and Vi prompt prefixes - ``[ins]`` and ``[nav]`` - are
539 542 skipped just as the normal ``In`` would be.
540 543
541 544 IPython shell can be started in the Vi mode using ``ipython --TerminalInteractiveShell.editing_mode=vi``,
542 545 You should be able to change mode dynamically with ``%config TerminalInteractiveShell.editing_mode='vi'``
543 546
544 547 Empty History Ranges
545 548 ~~~~~~~~~~~~~~~~~~~~
546 549
547 550 A number of magics that take history ranges can now be used with an empty
548 551 range. These magics are:
549 552
550 553 * ``%save``
551 554 * ``%load``
552 555 * ``%pastebin``
553 556 * ``%pycat``
554 557
555 558 Using them this way will make them take the history of the current session up
556 559 to the point of the magic call (such that the magic itself will not be
557 560 included).
558 561
559 562 Therefore it is now possible to save the whole history to a file using
560 563 ``%save <filename>``, load and edit it using ``%load`` (makes for a nice usage
561 564 when followed with :kbd:`F2`), send it to `dpaste.org <http://dpast.org>`_ using
562 565 ``%pastebin``, or view the whole thing syntax-highlighted with a single
563 566 ``%pycat``.
564 567
565 568
566 569 Windows timing implementation: Switch to process_time
567 570 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
568 571 Timing on Windows, for example with ``%%time``, was changed from being based on ``time.perf_counter``
569 572 (which counted time even when the process was sleeping) to being based on ``time.process_time`` instead
570 573 (which only counts CPU time). This brings it closer to the behavior on Linux. See :ghpull:`12984`.
571 574
572 575 Miscellaneous
573 576 ~~~~~~~~~~~~~
574 577 - Non-text formatters are not disabled in the terminal, which should simplify
575 578 writing extensions displaying images or other mimetypes in supporting terminals.
576 579 :ghpull:`12315`
577 580 - It is now possible to automatically insert matching brackets in Terminal IPython using the
578 581 ``TerminalInteractiveShell.auto_match=True`` option. :ghpull:`12586`
579 582 - We are thinking of deprecating the current ``%%javascript`` magic in favor of a better replacement. See :ghpull:`13376`.
580 583 - ``~`` is now expanded when part of a path in most magics :ghpull:`13385`
581 584 - ``%/%%timeit`` magic now adds a comma every thousands to make reading a long number easier :ghpull:`13379`
582 585 - ``"info"`` messages can now be customised to hide some fields :ghpull:`13343`
583 586 - ``collections.UserList`` now pretty-prints :ghpull:`13320`
584 587 - The debugger now has a persistent history, which should make it less
585 588 annoying to retype commands :ghpull:`13246`
586 589 - ``!pip`` ``!conda`` ``!cd`` or ``!ls`` are likely doing the wrong thing. We
587 590 now warn users if they use one of those commands. :ghpull:`12954`
588 591 - Make ``%precision`` work for ``numpy.float64`` type :ghpull:`12902`
589 592
590 593 Re-added support for XDG config directories
591 594 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
592 595
593 596 XDG support through the years comes and goes. There is a tension between having
594 597 an identical location for configuration in all platforms versus having simple instructions.
595 598 After initial failures a couple of years ago, IPython was modified to automatically migrate XDG
596 599 config files back into ``~/.ipython``. That migration code has now been removed.
597 600 IPython now checks the XDG locations, so if you _manually_ move your config
598 601 files to your preferred location, IPython will not move them back.
599 602
600 603
601 604 Preparing for Python 3.10
602 605 -------------------------
603 606
604 607 To prepare for Python 3.10, we have started working on removing reliance and
605 608 any dependency that is not compatible with Python 3.10. This includes migrating our
606 609 test suite to pytest and starting to remove nose. This also means that the
607 610 ``iptest`` command is now gone and all testing is via pytest.
608 611
609 612 This was in large part thanks to the NumFOCUS Small Developer grant, which enabled us to
610 613 allocate \$4000 to hire `Nikita Kniazev (@Kojoley) <https://github.com/Kojoley>`_,
611 614 who did a fantastic job at updating our code base, migrating to pytest, pushing
612 615 our coverage, and fixing a large number of bugs. I highly recommend contacting
613 616 them if you need help with C++ and Python projects.
614 617
615 618 You can find all relevant issues and PRs with the SDG 2021 tag `<https://github.com/ipython/ipython/issues?q=label%3A%22Numfocus+SDG+2021%22+>`__
616 619
617 620 Removing support for older Python versions
618 621 ------------------------------------------
619 622
620 623
621 624 We are removing support for Python up through 3.7, allowing internal code to use the more
622 625 efficient ``pathlib`` and to make better use of type annotations.
623 626
624 627 .. image:: ../_images/8.0/pathlib_pathlib_everywhere.jpg
625 628 :alt: "Meme image of Toy Story with Woody and Buzz, with the text 'pathlib, pathlib everywhere'"
626 629
627 630
628 631 We had about 34 PRs only to update some logic to update some functions from managing strings to
629 632 using Pathlib.
630 633
631 634 The completer has also seen significant updates and now makes use of newer Jedi APIs,
632 635 offering faster and more reliable tab completion.
633 636
634 637 Misc Statistics
635 638 ---------------
636 639
637 640 Here are some numbers::
638 641
639 642 7.x: 296 files, 12561 blank lines, 20282 comments, 35142 line of code.
640 643 8.0: 252 files, 12053 blank lines, 19232 comments, 34505 line of code.
641 644
642 645 $ git diff --stat 7.x...master | tail -1
643 646 340 files changed, 13399 insertions(+), 12421 deletions(-)
644 647
645 648 We have commits from 162 authors, who contributed 1916 commits in 23 month, excluding merges (to not bias toward
646 649 maintainers pushing buttons).::
647 650
648 651 $ git shortlog -s --no-merges 7.x...master | sort -nr
649 652 535 Matthias Bussonnier
650 653 86 Nikita Kniazev
651 654 69 Blazej Michalik
652 655 49 Samuel Gaist
653 656 27 Itamar Turner-Trauring
654 657 18 Spas Kalaydzhisyki
655 658 17 Thomas Kluyver
656 659 17 Quentin Peter
657 660 17 James Morris
658 661 17 Artur Svistunov
659 662 15 Bart Skowron
660 663 14 Alex Hall
661 664 13 rushabh-v
662 665 13 Terry Davis
663 666 13 Benjamin Ragan-Kelley
664 667 8 martinRenou
665 668 8 farisachugthai
666 669 7 dswij
667 670 7 Gal B
668 671 7 Corentin Cadiou
669 672 6 yuji96
670 673 6 Martin Skarzynski
671 674 6 Justin Palmer
672 675 6 Daniel Goldfarb
673 676 6 Ben Greiner
674 677 5 Sammy Al Hashemi
675 678 5 Paul Ivanov
676 679 5 Inception95
677 680 5 Eyenpi
678 681 5 Douglas Blank
679 682 5 Coco Mishra
680 683 5 Bibo Hao
681 684 5 AndrΓ© A. Gomes
682 685 5 Ahmed Fasih
683 686 4 takuya fujiwara
684 687 4 palewire
685 688 4 Thomas A Caswell
686 689 4 Talley Lambert
687 690 4 Scott Sanderson
688 691 4 Ram Rachum
689 692 4 Nick Muoh
690 693 4 Nathan Goldbaum
691 694 4 Mithil Poojary
692 695 4 Michael T
693 696 4 Jakub Klus
694 697 4 Ian Castleden
695 698 4 Eli Rykoff
696 699 4 Ashwin Vishnu
697 700 3 谭九鼎
698 701 3 sleeping
699 702 3 Sylvain Corlay
700 703 3 Peter Corke
701 704 3 Paul Bissex
702 705 3 Matthew Feickert
703 706 3 Fernando Perez
704 707 3 Eric Wieser
705 708 3 Daniel Mietchen
706 709 3 Aditya Sathe
707 710 3 007vedant
708 711 2 rchiodo
709 712 2 nicolaslazo
710 713 2 luttik
711 714 2 gorogoroumaru
712 715 2 foobarbyte
713 716 2 bar-hen
714 717 2 Theo Ouzhinski
715 718 2 Strawkage
716 719 2 Samreen Zarroug
717 720 2 Pete Blois
718 721 2 Meysam Azad
719 722 2 Matthieu Ancellin
720 723 2 Mark Schmitz
721 724 2 Maor Kleinberger
722 725 2 MRCWirtz
723 726 2 Lumir Balhar
724 727 2 Julien Rabinow
725 728 2 Juan Luis Cano RodrΓ­guez
726 729 2 Joyce Er
727 730 2 Jakub
728 731 2 Faris A Chugthai
729 732 2 Ethan Madden
730 733 2 Dimitri Papadopoulos
731 734 2 Diego Fernandez
732 735 2 Daniel Shimon
733 736 2 Coco Bennett
734 737 2 Carlos Cordoba
735 738 2 Boyuan Liu
736 739 2 BaoGiang HoangVu
737 740 2 Augusto
738 741 2 Arthur Svistunov
739 742 2 Arthur Moreira
740 743 2 Ali Nabipour
741 744 2 Adam Hackbarth
742 745 1 richard
743 746 1 linar-jether
744 747 1 lbennett
745 748 1 juacrumar
746 749 1 gpotter2
747 750 1 digitalvirtuoso
748 751 1 dalthviz
749 752 1 Yonatan Goldschmidt
750 753 1 Tomasz KΕ‚oczko
751 754 1 Tobias Bengfort
752 755 1 Timur Kushukov
753 756 1 Thomas
754 757 1 Snir Broshi
755 758 1 Shao Yang Hong
756 759 1 Sanjana-03
757 760 1 Romulo Filho
758 761 1 Rodolfo Carvalho
759 762 1 Richard Shadrach
760 763 1 Reilly Tucker Siemens
761 764 1 Rakessh Roshan
762 765 1 Piers Titus van der Torren
763 766 1 PhanatosZou
764 767 1 Pavel Safronov
765 768 1 Paulo S. Costa
766 769 1 Paul McCarthy
767 770 1 NotWearingPants
768 771 1 Naelson Douglas
769 772 1 Michael Tiemann
770 773 1 Matt Wozniski
771 774 1 Markus Wageringel
772 775 1 Marcus Wirtz
773 776 1 Marcio Mazza
774 777 1 LumΓ­r 'Frenzy' Balhar
775 778 1 Lightyagami1
776 779 1 Leon Anavi
777 780 1 LeafyLi
778 781 1 L0uisJ0shua
779 782 1 Kyle Cutler
780 783 1 Krzysztof Cybulski
781 784 1 Kevin Kirsche
782 785 1 KIU Shueng Chuan
783 786 1 Jonathan Slenders
784 787 1 Jay Qi
785 788 1 Jake VanderPlas
786 789 1 Iwan Briquemont
787 790 1 Hussaina Begum Nandyala
788 791 1 Gordon Ball
789 792 1 Gabriel Simonetto
790 793 1 Frank Tobia
791 794 1 Erik
792 795 1 Elliott Sales de Andrade
793 796 1 Daniel Hahler
794 797 1 Dan Green-Leipciger
795 798 1 Dan Green
796 799 1 Damian Yurzola
797 800 1 Coon, Ethan T
798 801 1 Carol Willing
799 802 1 Brian Lee
800 803 1 Brendan Gerrity
801 804 1 Blake Griffin
802 805 1 Bastian Ebeling
803 806 1 Bartosz Telenczuk
804 807 1 Ankitsingh6299
805 808 1 Andrew Port
806 809 1 Andrew J. Hesford
807 810 1 Albert Zhang
808 811 1 Adam Johnson
809 812
810 813 This does not, of course, represent non-code contributions, for which we are also grateful.
811 814
812 815
813 816 API Changes using Frappuccino
814 817 -----------------------------
815 818
816 819 This is an experimental exhaustive API difference using `Frappuccino <https://pypi.org/project/frappuccino/>`_
817 820
818 821
819 822 The following items are new in IPython 8.0 ::
820 823
821 824 + IPython.core.async_helpers.get_asyncio_loop()
822 825 + IPython.core.completer.Dict
823 826 + IPython.core.completer.Pattern
824 827 + IPython.core.completer.Sequence
825 828 + IPython.core.completer.__skip_doctest__
826 829 + IPython.core.debugger.Pdb.precmd(self, line)
827 830 + IPython.core.debugger.__skip_doctest__
828 831 + IPython.core.display.__getattr__(name)
829 832 + IPython.core.display.warn
830 833 + IPython.core.display_functions
831 834 + IPython.core.display_functions.DisplayHandle
832 835 + IPython.core.display_functions.DisplayHandle.display(self, obj, **kwargs)
833 836 + IPython.core.display_functions.DisplayHandle.update(self, obj, **kwargs)
834 837 + IPython.core.display_functions.__all__
835 838 + IPython.core.display_functions.__builtins__
836 839 + IPython.core.display_functions.__cached__
837 840 + IPython.core.display_functions.__doc__
838 841 + IPython.core.display_functions.__file__
839 842 + IPython.core.display_functions.__loader__
840 843 + IPython.core.display_functions.__name__
841 844 + IPython.core.display_functions.__package__
842 845 + IPython.core.display_functions.__spec__
843 846 + IPython.core.display_functions.b2a_hex
844 847 + IPython.core.display_functions.clear_output(wait=False)
845 848 + IPython.core.display_functions.display(*objs, include='None', exclude='None', metadata='None', transient='None', display_id='None', raw=False, clear=False, **kwargs)
846 849 + IPython.core.display_functions.publish_display_data(data, metadata='None', source='<deprecated>', *, transient='None', **kwargs)
847 850 + IPython.core.display_functions.update_display(obj, *, display_id, **kwargs)
848 851 + IPython.core.extensions.BUILTINS_EXTS
849 852 + IPython.core.inputtransformer2.has_sunken_brackets(tokens)
850 853 + IPython.core.interactiveshell.Callable
851 854 + IPython.core.interactiveshell.__annotations__
852 855 + IPython.core.ultratb.List
853 856 + IPython.core.ultratb.Tuple
854 857 + IPython.lib.pretty.CallExpression
855 858 + IPython.lib.pretty.CallExpression.factory(name)
856 859 + IPython.lib.pretty.RawStringLiteral
857 860 + IPython.lib.pretty.RawText
858 861 + IPython.terminal.debugger.TerminalPdb.do_interact(self, arg)
859 862 + IPython.terminal.embed.Set
860 863
861 864 The following items have been removed (or moved to superclass)::
862 865
863 866 - IPython.core.application.BaseIPythonApplication.initialize_subcommand
864 867 - IPython.core.completer.Sentinel
865 868 - IPython.core.completer.skip_doctest
866 869 - IPython.core.debugger.Tracer
867 870 - IPython.core.display.DisplayHandle
868 871 - IPython.core.display.DisplayHandle.display
869 872 - IPython.core.display.DisplayHandle.update
870 873 - IPython.core.display.b2a_hex
871 874 - IPython.core.display.clear_output
872 875 - IPython.core.display.display
873 876 - IPython.core.display.publish_display_data
874 877 - IPython.core.display.update_display
875 878 - IPython.core.excolors.Deprec
876 879 - IPython.core.excolors.ExceptionColors
877 880 - IPython.core.history.warn
878 881 - IPython.core.hooks.late_startup_hook
879 882 - IPython.core.hooks.pre_run_code_hook
880 883 - IPython.core.hooks.shutdown_hook
881 884 - IPython.core.interactiveshell.InteractiveShell.init_deprecation_warnings
882 885 - IPython.core.interactiveshell.InteractiveShell.init_readline
883 886 - IPython.core.interactiveshell.InteractiveShell.write
884 887 - IPython.core.interactiveshell.InteractiveShell.write_err
885 888 - IPython.core.interactiveshell.get_default_colors
886 889 - IPython.core.interactiveshell.removed_co_newlocals
887 890 - IPython.core.magics.execution.ExecutionMagics.profile_missing_notice
888 891 - IPython.core.magics.script.PIPE
889 892 - IPython.core.prefilter.PrefilterManager.init_transformers
890 893 - IPython.core.release.classifiers
891 894 - IPython.core.release.description
892 895 - IPython.core.release.keywords
893 896 - IPython.core.release.long_description
894 897 - IPython.core.release.name
895 898 - IPython.core.release.platforms
896 899 - IPython.core.release.url
897 900 - IPython.core.ultratb.VerboseTB.format_records
898 901 - IPython.core.ultratb.find_recursion
899 902 - IPython.core.ultratb.findsource
900 903 - IPython.core.ultratb.fix_frame_records_filenames
901 904 - IPython.core.ultratb.inspect_error
902 905 - IPython.core.ultratb.is_recursion_error
903 906 - IPython.core.ultratb.with_patch_inspect
904 907 - IPython.external.__all__
905 908 - IPython.external.__builtins__
906 909 - IPython.external.__cached__
907 910 - IPython.external.__doc__
908 911 - IPython.external.__file__
909 912 - IPython.external.__loader__
910 913 - IPython.external.__name__
911 914 - IPython.external.__package__
912 915 - IPython.external.__path__
913 916 - IPython.external.__spec__
914 917 - IPython.kernel.KernelConnectionInfo
915 918 - IPython.kernel.__builtins__
916 919 - IPython.kernel.__cached__
917 920 - IPython.kernel.__warningregistry__
918 921 - IPython.kernel.pkg
919 922 - IPython.kernel.protocol_version
920 923 - IPython.kernel.protocol_version_info
921 924 - IPython.kernel.src
922 925 - IPython.kernel.version_info
923 926 - IPython.kernel.warn
924 927 - IPython.lib.backgroundjobs
925 928 - IPython.lib.backgroundjobs.BackgroundJobBase
926 929 - IPython.lib.backgroundjobs.BackgroundJobBase.run
927 930 - IPython.lib.backgroundjobs.BackgroundJobBase.traceback
928 931 - IPython.lib.backgroundjobs.BackgroundJobExpr
929 932 - IPython.lib.backgroundjobs.BackgroundJobExpr.call
930 933 - IPython.lib.backgroundjobs.BackgroundJobFunc
931 934 - IPython.lib.backgroundjobs.BackgroundJobFunc.call
932 935 - IPython.lib.backgroundjobs.BackgroundJobManager
933 936 - IPython.lib.backgroundjobs.BackgroundJobManager.flush
934 937 - IPython.lib.backgroundjobs.BackgroundJobManager.new
935 938 - IPython.lib.backgroundjobs.BackgroundJobManager.remove
936 939 - IPython.lib.backgroundjobs.BackgroundJobManager.result
937 940 - IPython.lib.backgroundjobs.BackgroundJobManager.status
938 941 - IPython.lib.backgroundjobs.BackgroundJobManager.traceback
939 942 - IPython.lib.backgroundjobs.__builtins__
940 943 - IPython.lib.backgroundjobs.__cached__
941 944 - IPython.lib.backgroundjobs.__doc__
942 945 - IPython.lib.backgroundjobs.__file__
943 946 - IPython.lib.backgroundjobs.__loader__
944 947 - IPython.lib.backgroundjobs.__name__
945 948 - IPython.lib.backgroundjobs.__package__
946 949 - IPython.lib.backgroundjobs.__spec__
947 950 - IPython.lib.kernel.__builtins__
948 951 - IPython.lib.kernel.__cached__
949 952 - IPython.lib.kernel.__doc__
950 953 - IPython.lib.kernel.__file__
951 954 - IPython.lib.kernel.__loader__
952 955 - IPython.lib.kernel.__name__
953 956 - IPython.lib.kernel.__package__
954 957 - IPython.lib.kernel.__spec__
955 958 - IPython.lib.kernel.__warningregistry__
956 959 - IPython.paths.fs_encoding
957 960 - IPython.terminal.debugger.DEFAULT_BUFFER
958 961 - IPython.terminal.debugger.cursor_in_leading_ws
959 962 - IPython.terminal.debugger.emacs_insert_mode
960 963 - IPython.terminal.debugger.has_selection
961 964 - IPython.terminal.debugger.vi_insert_mode
962 965 - IPython.terminal.interactiveshell.DISPLAY_BANNER_DEPRECATED
963 966 - IPython.terminal.ipapp.TerminalIPythonApp.parse_command_line
964 967 - IPython.testing.test
965 968 - IPython.utils.contexts.NoOpContext
966 969 - IPython.utils.io.IOStream
967 970 - IPython.utils.io.IOStream.close
968 971 - IPython.utils.io.IOStream.write
969 972 - IPython.utils.io.IOStream.writelines
970 973 - IPython.utils.io.__warningregistry__
971 974 - IPython.utils.io.atomic_writing
972 975 - IPython.utils.io.stderr
973 976 - IPython.utils.io.stdin
974 977 - IPython.utils.io.stdout
975 978 - IPython.utils.io.unicode_std_stream
976 979 - IPython.utils.path.get_ipython_cache_dir
977 980 - IPython.utils.path.get_ipython_dir
978 981 - IPython.utils.path.get_ipython_module_path
979 982 - IPython.utils.path.get_ipython_package_dir
980 983 - IPython.utils.path.locate_profile
981 984 - IPython.utils.path.unquote_filename
982 985 - IPython.utils.py3compat.PY2
983 986 - IPython.utils.py3compat.PY3
984 987 - IPython.utils.py3compat.buffer_to_bytes
985 988 - IPython.utils.py3compat.builtin_mod_name
986 989 - IPython.utils.py3compat.cast_bytes
987 990 - IPython.utils.py3compat.getcwd
988 991 - IPython.utils.py3compat.isidentifier
989 992 - IPython.utils.py3compat.u_format
990 993
991 994 The following signatures differ between 7.x and 8.0::
992 995
993 996 - IPython.core.completer.IPCompleter.unicode_name_matches(self, text)
994 997 + IPython.core.completer.IPCompleter.unicode_name_matches(text)
995 998
996 999 - IPython.core.completer.match_dict_keys(keys, prefix, delims)
997 1000 + IPython.core.completer.match_dict_keys(keys, prefix, delims, extra_prefix='None')
998 1001
999 1002 - IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0)
1000 1003 + IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0, omit_sections='()')
1001 1004
1002 1005 - IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None', _warn_deprecated=True)
1003 1006 + IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None')
1004 1007
1005 1008 - IPython.core.oinspect.Inspector.info(self, obj, oname='', formatter='None', info='None', detail_level=0)
1006 1009 + IPython.core.oinspect.Inspector.info(self, obj, oname='', info='None', detail_level=0)
1007 1010
1008 1011 - IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True)
1009 1012 + IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True, omit_sections='()')
1010 1013
1011 1014 - IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path='None', overwrite=False)
1012 1015 + IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path, overwrite=False)
1013 1016
1014 1017 - IPython.core.ultratb.VerboseTB.format_record(self, frame, file, lnum, func, lines, index)
1015 1018 + IPython.core.ultratb.VerboseTB.format_record(self, frame_info)
1016 1019
1017 1020 - IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, display_banner='None', global_ns='None', compile_flags='None')
1018 1021 + IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, compile_flags='None')
1019 1022
1020 1023 - IPython.terminal.embed.embed(**kwargs)
1021 1024 + IPython.terminal.embed.embed(*, header='', compile_flags='None', **kwargs)
1022 1025
1023 1026 - IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self, display_banner='<object object at 0xffffff>')
1024 1027 + IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self)
1025 1028
1026 1029 - IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self, display_banner='<object object at 0xffffff>')
1027 1030 + IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self)
1028 1031
1029 1032 - IPython.utils.path.get_py_filename(name, force_win32='None')
1030 1033 + IPython.utils.path.get_py_filename(name)
1031 1034
1032 1035 The following are new attributes (that might be inherited)::
1033 1036
1034 1037 + IPython.core.completer.IPCompleter.unicode_names
1035 1038 + IPython.core.debugger.InterruptiblePdb.precmd
1036 1039 + IPython.core.debugger.Pdb.precmd
1037 1040 + IPython.core.ultratb.AutoFormattedTB.has_colors
1038 1041 + IPython.core.ultratb.ColorTB.has_colors
1039 1042 + IPython.core.ultratb.FormattedTB.has_colors
1040 1043 + IPython.core.ultratb.ListTB.has_colors
1041 1044 + IPython.core.ultratb.SyntaxTB.has_colors
1042 1045 + IPython.core.ultratb.TBTools.has_colors
1043 1046 + IPython.core.ultratb.VerboseTB.has_colors
1044 1047 + IPython.terminal.debugger.TerminalPdb.do_interact
1045 1048 + IPython.terminal.debugger.TerminalPdb.precmd
1046 1049
1047 1050 The following attribute/methods have been removed::
1048 1051
1049 1052 - IPython.core.application.BaseIPythonApplication.deprecated_subcommands
1050 1053 - IPython.core.ultratb.AutoFormattedTB.format_records
1051 1054 - IPython.core.ultratb.ColorTB.format_records
1052 1055 - IPython.core.ultratb.FormattedTB.format_records
1053 1056 - IPython.terminal.embed.InteractiveShellEmbed.init_deprecation_warnings
1054 1057 - IPython.terminal.embed.InteractiveShellEmbed.init_readline
1055 1058 - IPython.terminal.embed.InteractiveShellEmbed.write
1056 1059 - IPython.terminal.embed.InteractiveShellEmbed.write_err
1057 1060 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_deprecation_warnings
1058 1061 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_readline
1059 1062 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write
1060 1063 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write_err
1061 1064 - IPython.terminal.ipapp.LocateIPythonApp.deprecated_subcommands
1062 1065 - IPython.terminal.ipapp.LocateIPythonApp.initialize_subcommand
1063 1066 - IPython.terminal.ipapp.TerminalIPythonApp.deprecated_subcommands
1064 1067 - IPython.terminal.ipapp.TerminalIPythonApp.initialize_subcommand
General Comments 0
You need to be logged in to leave comments. Login now