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