##// END OF EJS Templates
What's new 8.20. (#14285)
M Bussonnier -
r28569:ac4dd798 merge
parent child Browse files
Show More
@@ -1,2044 +1,2072 b''
1 1 ============
2 2 8.x Series
3 3 ============
4 4
5
6 .. _version 8.20:
7
8 IPython 8.20
9 ------------
10
11 Quick IPython release in this beginning of 2024, barely 2 weeks after the previous
12 release.
13
14 This is mostly to fix a backward compatibility issue, I would have done a patch
15 release earlier if I could. As a few other cleanup are also part of this
16 release, this will get a minor version bump.
17
18
19 The crux of this release is :ghpull:`14274` (Inspect continuation prompt
20 signature and pass only viable arguments), the rest of the changes are mostly
21 type annotation, and a few compatibility issues with Python 3.13 that are
22 getting addressed.
23
24 Python 3.13 compatibility is still not complete (help welcomed).
25
26 As usual you can find the full list of PRs on GitHub under `the 8.20
27 <https://github.com/ipython/ipython/milestone/127?closed=1>`__ milestone.
28
29 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
30 work on IPython and related libraries.
31
32
5 33 .. _version 8.19:
6 34
7 35 IPython 8.19
8 36 ------------
9 37
10 38 New release of IPython a bit before the end of the month, and end of the year.
11 39
12 40 Mostly cleanup and deprecation, due to upstream deprecation and removal.
13 41
14 42 Remove of Python 3.9 support
15 43 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 44
17 45 A bit later than originally plan, IPython 8.19 does not support Python 3.9
18 46 anymore, as well as the few conditional code that were executing only on Python
19 47 3.9. :ghpull:`14254`
20 48
21 49 We used the opportunity to deprecate ``IPython.utils.tz`` :ghpull:`14256`, due
22 50 to upstream deprecation of some timezone utilities. It will be removed at a later
23 51 date.
24 52
25 53 We now also run CI on Python 3.12 (what I likely should have done before), but
26 54 running on too many Python version uses a lot of CI time.
27 55
28 56 Absolute and relative Line Numbers in Prompts
29 57 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30 58
31 59 Thanks to the contribution of ``cohml``, IPython CLI now support absolute and
32 60 relative line numbers in both vi and emacs prompt, use for example
33 61 ``c.TerminalInteractiveShell.prompt_line_number_format='{line: 4d}/{rel_line:+03d} | '``
34 62 configuration option to display both in a custom format.
35 63
36 64 Miscellaneous
37 65 ~~~~~~~~~~~~~
38 66
39 67 In addition to various bugfixes, I unpinned pytest, let me know if there are any
40 68 issues and we'll re-pin.
41 69
42 70 See you in 2024
43 71 ~~~~~~~~~~~~~~~
44 72
45 73 As usual you can find the full list of PRs on GitHub under `the 8.19
46 74 <https://github.com/ipython/ipython/milestone/126?closed=1>`__ milestone.
47 75
48 76 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
49 77 work on IPython and related libraries.
50 78
51 79 .. _version 8.18:
52 80
53 81 IPython 8.18 and 8.18.1
54 82 -----------------------
55 83
56 84 8.18.1 is identical to 8.18 but pin ``prompt_toolkit`` to greater than ``3.0.41``
57 85
58 86 Small release of IPython that fixes a small number of inconveniences.
59 87
60 88 - :ghpull:`14251` Fix a memory leak in qt event loop integration by setting
61 89 the Loop parent to None.
62 90 - :ghpull:`14252` Pickleshare was made an optional dependency in 8.17, this
63 91 leads to warnings in some installations when using modules completions. The
64 92 warning has been silenced.
65 93 - :ghpull:`14241` Update event loop code for compatibility with more recent
66 94 ``prompt_toolkit`` due to deprecations in Python 3.12.
67 95 - :ghpull:`14245` Fix doc example on Pygments styles
68 96 - :ghpull:`14238` Remove dependency on app_nope, this is actually only a
69 97 dependency of IPykernel.
70 98
71 99 As usual you can find the full list of PRs on GitHub under `the 8.18
72 100 <https://github.com/ipython/ipython/milestone/125?closed=1>`__ milestone.
73 101
74 102 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
75 103 work on IPython and related libraries.
76 104
77 105 .. _version 8.17.1:
78 106 .. _version 8.17:
79 107
80 108 IPython 8.17, 8.17.1
81 109 --------------------
82 110
83 111 Medium-sized release of IPython that includes some cleanup (backcall, python2 leftovers)
84 112 and some refactoring improvements (typing, pathlib) and a fix on completion.
85 113
86 114 - :ghpull:`14216` remove backcall dependency
87 115 - :ghpull:`14217` make pickleshare dependency optional
88 116 - :ghpull:`14185` support completion based on type annotations of calls
89 117
90 118 Reverted in 8.17.1:
91 119
92 120 - :ghpull:`14190` remove support for python 2 in lexers (reverted in 8.17.1 as it is imported by qtconsole/spyder)
93 121
94 122 Mamba and Micromamba magic
95 123 ~~~~~~~~~~~~~~~~~~~~~~~~~~
96 124
97 125 In addition to the conda command to manage conda environment, mamba and
98 126 micromamba can now be used using the corresponding magic in IPython.
99 127 Since these commands are compatible with conda, they are following the
100 128 same logic.
101 129
102 130 These two magic require to have the corresponding commands available
103 131 either in the conda environment or system wide.
104 132
105 133 :ghpull:`14191`
106 134
107 135 ----
108 136
109 137 As usual you can find the full list of PRs on GitHub under `the 8.17
110 138 <https://github.com/ipython/ipython/milestone/123?closed=1>`__ milestone.
111 139
112 140 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
113 141 work on IPython and related libraries.
114 142
115 143 .. _version 8.16:
116 144 .. _version 8.16.1:
117 145
118 146 IPython 8.16, 8.16.1
119 147 --------------------
120 148
121 149 Small double release of IPython (with the 8.12.3 release notes just below).
122 150 Mostly bug fixes and cleanups, and type annotations. Of interest for users:
123 151
124 152 - :ghpull:`14153` Fix a bug of the new iPdb chained traceback where some
125 153 Exception would not have any traceback. (see upstream fix in CPython for more
126 154 details).
127 155 - :ghpull:`14168` Fix case with spurious message about event loops when using
128 156 matplotlib.
129 157
130 158 This PR is in 8.16.0 but reverted in 8.16.1, we'll rework the fix for 8.17
131 159
132 160 - :ghpull:`14163` Fix an error where semicolon would not suppress output.
133 161
134 162 As usual you can find the full list of PRs on GitHub under `the 8.16
135 163 <https://github.com/ipython/ipython/milestone/121?closed=1>`__ and `8.16.1 milestone
136 164 <https://github.com/ipython/ipython/milestone/124?closed=1>`__.
137 165
138 166 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
139 167 work on IPython and related libraries.
140 168
141 169 .. _version 8.12.3:
142 170
143 171 IPython 8.12.3
144 172 --------------
145 173
146 174 Tiny release of 8.12.3 that backport a small number of fixes for users still
147 175 using Python 3.8.
148 176
149 177 - :ghpull:`14080` add passthrough filter shortcuts
150 178 - :ghpull:`14169` Fix `InteractiveShellEmbed`
151 179
152 180 .. _version 8.15:
153 181
154 182 IPython 8.15
155 183 ------------
156 184
157 185 Medium release of IPython after a couple of month hiatus, and a bit
158 186 off-schedule.
159 187
160 188 Among other, IPython 8.15:
161 189
162 190 - Improve compatibility with future version of Python 3.12/3.13
163 191 :ghpull:`14107`, :ghpull:`14139`,
164 192 - Improve support for ``ExceptionGroups``, :ghpull:`14108`
165 193 - Fix hangs in ``%gui osx``, :ghpull:`14125`
166 194 - Fix memory lead with ``%reset``, :ghpull:`14133`
167 195 - Unstable config option to modify traceback highlighting that is sometime hard
168 196 to read :ghpull:`14138`
169 197 - Support ``.`` in ``ipdb`` as an argument to the ``list`` command
170 198 :ghpull:`14121`
171 199 - Workroud ``parso`` showing warning message when the default logger level is
172 200 changed :ghpull:`14119`
173 201 - Fix multiple issues with matplotlib interactive mode, qt5/qt6 :ghpull:`14128`
174 202
175 203 Support for PEP-678 Exception Notes
176 204 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
177 205
178 206 Ultratb now shows :pep:`678` notes, improving your debugging experience on
179 207 Python 3.11+ or with libraries such as Pytest and Hypothesis.
180 208
181 209 Native fallback for displaying ExceptionGroup
182 210 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183 211 ExceptionGroups are now displayed with ``traceback.print_exc``, as a temporary fix until UltraTB properly supports displaying child exceptions.
184 212
185 213
186 214 We have two larger features:
187 215
188 216 AST-based macros
189 217 ~~~~~~~~~~~~~~~~
190 218
191 219 :ghpull:`14100` introduce a new and efficient way to modify each execution block
192 220 (cell) using an template-ast-based transform. Unlike IPython pre and post code
193 221 execution hooks, this actually transform the code that is execute with as
194 222 minimal as possible overhead. While it was already technically possible to
195 223 register ast transformers for IPython this was far from evident.
196 224
197 225 This should make it trivial to hook into IPython to implement custom hooks, that
198 226 for example time or profile your code, catch exceptions to provide error
199 227 messages for students or do any other kind of transformations.
200 228
201 229 In addition to programmatic API there is also a magic to quickly register
202 230 hooks::
203 231
204 232 In [1]: %%code_wrap before_after
205 233 ...: print('before')
206 234 ...: __code__
207 235 ...: print('after')
208 236 ...: __ret__
209 237
210 238 This mean that for any subsequent execution code will be executed.
211 239 You can modify the above to print the date, compute the execution time,
212 240 retry the code in a for loop....
213 241
214 242
215 243 Allow IPdb/Pdb to move between chained exceptions
216 244 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
217 245
218 246 The main change is the addition of the ability to move between chained
219 247 exceptions when using IPdb, this feature was also contributed to upstream Pdb
220 248 and is thus native to CPython in Python 3.13+ Though ipdb should support this
221 249 feature in older version of Python. I invite you to look at the `CPython changes
222 250 and docs <https://github.com/python/cpython/pull/106676>`__ for more details.
223 251
224 252 In short, once in post-mortem debugger (``%debug``), you can use the ipdb
225 253 ``exceptions`` command to switch exceptions, for example:
226 254
227 255 .. code-block:: ipython
228 256
229 257 In [1]: def foo(x):
230 258 ...: try:
231 259 ...: bar(x)
232 260 ...: except Exception as e:
233 261 ...: raise ValueError("foo (): bar failed") from e
234 262 ...:
235 263 ...: def bar(x):
236 264 ...: 1 / X
237 265 ...:
238 266
239 267 In [2]: foo(0)
240 268 ---------------------------------------------------------------------------
241 269 NameError Traceback (most recent call last)
242 270 Cell In[1], line 3, in foo(x)
243 271 2 try:
244 272 ----> 3 bar(x)
245 273 4 except Exception as e:
246 274
247 275 Cell In[1], line 9, in bar(x)
248 276 8 def bar(x):
249 277 ----> 9 1 / X
250 278
251 279 NameError: name 'X' is not defined
252 280
253 281 The above exception was the direct cause of the following exception:
254 282
255 283 ValueError Traceback (most recent call last)
256 284 Cell In[2], line 1
257 285 ----> 1 foo(0)
258 286
259 287 Cell In[1], line 5, in foo(x)
260 288 3 bar(x)
261 289 4 except Exception as e:
262 290 ----> 5 raise ValueError("foo (): bar failed") from e
263 291
264 292 ValueError: foo (): bar failed
265 293
266 294 In [3]: %debug
267 295 > <ipython-input-1-b0bbdc271ffb>(5)foo()
268 296 3 bar(x)
269 297 4 except Exception as e:
270 298 ----> 5 raise ValueError("foo (): bar failed") from e
271 299
272 300 In previous ipdb you could not go into the bar error, now from within pdb you
273 301 can use ``exceptions``:
274 302
275 303 .. code-block:: ipython
276 304
277 305 ipdb> exceptions
278 306 0 NameError("name 'X' is not defined")
279 307 > 1 ValueError('foo (): bar failed')
280 308
281 309 ipdb> exceptions 0
282 310 > <ipython-input-1-b0bbdc271ffb>(9)bar()
283 311 6
284 312 7
285 313 8 def bar(x):
286 314 ----> 9 1 / X
287 315 10
288 316
289 317 ipdb>
290 318
291 319 In particular I want to thank the `D.E. Shaw group <https://www.deshaw.com/>`__
292 320 for suggesting and funding the two largest feature as well as many bug fixes of
293 321 this release.
294 322
295 323 As usual you can find the full list of PRs on GitHub under `the 8.15 milestone
296 324 <https://github.com/ipython/ipython/milestone/120?closed=1>`__.
297 325
298 326
299 327
300 328 .. _version 8.14:
301 329
302 330 IPython 8.14
303 331 ------------
304 332
305 333 Small release of IPython.
306 334
307 335 - :ghpull:`14080` fixes some shortcuts issues.
308 336 - :ghpull:`14056` Add option to ``%autoreload`` to hide errors when reloading code. This will be the default for spyder
309 337 user is my understanding.
310 338 - :ghpull:`14039` (and :ghpull:`14040`) to show exception notes in tracebacks.
311 339
312 340 - :ghpull:`14076` Add option to EventManager to prevent printing
313 341
314 342
315 343 SPEC 0 and SPEC 4
316 344 ~~~~~~~~~~~~~~~~~
317 345
318 346 You've heard about the NEPs, (NumPy enhancement Proposal), having a NEP for something non-numpy specific was sometime confusing.
319 347 Long live the `SPECs <https://scientific-python.org/specs/>`_.
320 348
321 349 We are now trying to follow SPEC 0 (aka old NEP 29) for of support of upstream libraries.
322 350
323 351 We also now try to follow SPEC 4 (test and publish nightly on a centralized nightly repository).
324 352 We encourage you to do so as well in order to report breakage, and contribute to the SPEC process !
325 353
326 354
327 355 Python 3.12 compatibility ?
328 356 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
329 357
330 358 Python 3.12 changed its tokenizer to have better support for f-strings and allow arbitrary expression.
331 359 This is a great new feature and performance improvement in python 3.12.
332 360
333 361 Unfortunately this means the new tokenizer does not support incomplete or invalid Python which will
334 362 break many features of IPython. Thus compatibility of IPython with Python 3.12 is not guarantied.
335 363 It is unclear to which extent IPython is affected, and whether we can/should try to still support magics, shell
336 364 escape (``! ....``), ..., as well as how to do it if we can.
337 365
338 366 In addition even if we there is technical feasibility to do so, it is no clear we have the resources to do it.
339 367 We are thus looking for your help if you can _test_ on Python 3.12 to see to which extent this affects users and which
340 368 features are critical.
341 369
342 370 We are not going to pin IPython to Python ``<3.12`` as otherwise on install pip would downgrade/resolve to IPython 8.13,
343 371 so if you plan to update to Python 3.12 after its release, we encourage for extra care.
344 372
345 373
346 374 .. _version 8.13.1:
347 375 .. _version 8.13.2:
348 376 .. _version 8.12.2:
349 377
350 378 IPython 8.13.1, 8.13.2 and 8.12.2
351 379 ---------------------------------
352 380
353 381 3 quick in succession patch release of IPython in addition to IPython 8.13.0
354 382 having been yanked.
355 383
356 384 IPython 8.13.0 was improperly tagged as still compatible with Python 3.8, and
357 385 still had some mention of compatibility with 3.8. IPython 8.13.1 is identical to
358 386 8.13 but with the exception of being correctly tagged. This release and yank was
359 387 mostly done to fix CI.
360 388
361 389 IPython 8.12.2 and 8.13.2 contain UI fixes, with respect to right arrow not
362 390 working in some case in the terminal, and 8.12.2 contain also a requested
363 391 backport of :ghpull:`14029` (Allow safe access to the ``__getattribute__``
364 392 method of modules) for tab completion.
365 393
366 394 .. _version 8.13:
367 395
368 396 IPython 8.13
369 397 ------------
370 398
371 399 As usual for the end of the month, minor release of IPython. This release is
372 400 significant in that it not only has a number of bugfixes, but also drop support
373 401 for Python 3.8 as per NEP 29 (:ghpull:`14023`).
374 402
375 403 All the critical bugfixes have been backported onto the 8.12.1 release (see
376 404 below). In addition to that went into 8.12.1 you'll find:
377 405
378 406 - Pretty representation for ``Counter`` has been fixed to match the Python one
379 407 and be in decreasing order. :ghpull:`14032`
380 408 - Module completion is better when jedi is disabled :ghpull:`14029`.
381 409 - Improvement of ``%%bash`` magic that would get stuck :ghpull:`14019`
382 410
383 411
384 412 We hope you enjoy this release an will maybe see you at JupyterCon in less than
385 413 two weeks.
386 414
387 415 As usual you can find the full list of PRs on GitHub under `the 8.13 milestone
388 416 <https://github.com/ipython/ipython/milestone/115?closed=1>`__.
389 417
390 418 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
391 419 work on IPython and related libraries.
392 420
393 421
394 422 .. _version 8.12.1:
395 423
396 424 IPython 8.12.1
397 425 --------------
398 426
399 427 This is the twin release of IPython 8.13 that contain only critical UI and bug
400 428 fixes. The next minor version of IPython has dropped support for Python 3.8 – as
401 429 per Nep 29 and this IPython 8.12.x will now only receive bugfixes.
402 430
403 431
404 432 - :ghpull:`14004` Fix a bug introduced in IPython 8.12 that crash when
405 433 inspecting some docstrings.
406 434 - :ghpull:`14010` Fix fast traceback code that was not working in some case.
407 435 - :ghpull:`14014` Fix ``%page`` magic broken in some case.
408 436 - :ghpull:`14026`, :ghpull:`14027` Tweak default shortcut with respect to
409 437 autosuggestions.
410 438 - :ghpull:`14033` add back the ability to use ``.get()`` on OInfo object for
411 439 backward compatibility with h5py (this will be re-deprecated later, and h5py
412 440 will also get a fix).
413 441
414 442 As usual you can find the full list of PRs on GitHub under `the 8.12.1 milestone
415 443 <https://github.com/ipython/ipython/milestone/116?closed=1>`__.
416 444
417 445 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
418 446 work on IPython and related libraries.
419 447
420 448 .. _version 8.12.0:
421 449
422 450 IPython 8.12
423 451 ------------
424 452
425 453 Hopefully slightly early release for IPython 8.12. Last Thursday of the month,
426 454 even if I guess it's likely already Friday somewhere in the pacific ocean.
427 455
428 456 A number of PRs and bug fixes this month with close to 20 PRs merged !
429 457
430 458
431 459 The IPython repo reached :ghpull:`14000` !! Actually the PR that create those exact release
432 460 note is :ghpull:`14000`. Ok, more issues and PR is not always better, and I'd
433 461 love to have more time to close issues and Pull Requests.
434 462
435 463 Let's note that in less than 2 month JupyterCon is back, in Paris please visit
436 464 `jupytercon.com <https://jupytercon.com>`__, and looking forward to see you
437 465 there.
438 466
439 467 Packagers should take note that ``typing_extension`` is now a mandatory dependency
440 468 for Python versions ``<3.10``.
441 469
442 470
443 471
444 472 Let's note also that according to `NEP29
445 473 <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__, It is soon time to
446 474 stop support for Python 3.8 that will be release more than 3 and 1/2 years ago::
447 475
448 476 On Apr 14, 2023 drop support for Python 3.8 (initially released on Oct 14, 2019)
449 477
450 478 Thus I am likely to stop advertising support for Python 3.8 in the next
451 479 release at the end of April.
452 480
453 481
454 482 Here are some miscellaneous updates of interest:
455 483
456 484 - :ghpull:`13957` brings updates to the Qt integration, particularly for Qt6.
457 485 - :ghpull:`13960` fixes the %debug magic command to give access to the local
458 486 scope.
459 487 - :ghpull:`13964` fixes some crashes with the new fast traceback code. Note that
460 488 there are still some issues with the fast traceback code, and I a, likely
461 489 to fix and tweak behavior.
462 490 - :ghpull:`13973` We are slowly migrating IPython internals to use proper type
463 491 objects/dataclasses instead of dictionaries to allow static typing checks.
464 492 These are technically public API and could lead to breakage, so please let us
465 493 know if that's the case and I'll mitigate.
466 494 - :ghpull:`13990`, :ghpull:`13991`, :ghpull:`13994` all improve keybinding and
467 495 shortcut configurability.
468 496
469 497 As usual you can find the full list of PRs on GitHub under `the 8.12 milestone
470 498 <https://github.com/ipython/ipython/milestone/114?closed=1>`__.
471 499
472 500 We want to thank the D.E. Shaw group for requesting and sponsoring the work on
473 501 the following big feature. We had productive discussions on how to best expose
474 502 this feature
475 503
476 504 Dynamic documentation dispatch
477 505 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
478 506
479 507 We are experimenting with dynamic documentation dispatch for object attribute.
480 508 See :ghissue:`13860`. The goal is to allow object to define documentation for
481 509 their attributes, properties, even when those are dynamically defined with
482 510 `__getattr__`.
483 511
484 512 In particular when those objects are base types it can be useful to show the
485 513 documentation
486 514
487 515
488 516 .. code-block:: ipython
489 517
490 518
491 519 In [1]: class User:
492 520 ...:
493 521 ...: __custom_documentations__ = {
494 522 ...: "first": "The first name of the user.",
495 523 ...: "last": "The last name of the user.",
496 524 ...: }
497 525 ...:
498 526 ...: first:str
499 527 ...: last:str
500 528 ...:
501 529 ...: def __init__(self, first, last):
502 530 ...: self.first = first
503 531 ...: self.last = last
504 532 ...:
505 533 ...: @property
506 534 ...: def full(self):
507 535 ...: """`self.first` and `self.last` joined by a space."""
508 536 ...: return self.first + " " + self.last
509 537 ...:
510 538 ...:
511 539 ...: user = Person('Jane', 'Doe')
512 540
513 541 In [2]: user.first?
514 542 Type: str
515 543 String form: Jane
516 544 Length: 4
517 545 Docstring: the first name of a the person object, a str
518 546 Class docstring:
519 547 ....
520 548
521 549 In [3]: user.last?
522 550 Type: str
523 551 String form: Doe
524 552 Length: 3
525 553 Docstring: the last name, also a str
526 554 ...
527 555
528 556
529 557 We can see here the symmetry with IPython looking for the docstring on the
530 558 properties:
531 559
532 560 .. code-block:: ipython
533 561
534 562
535 563 In [4]: user.full?
536 564 HERE
537 565 Type: property
538 566 String form: <property object at 0x102bb15d0>
539 567 Docstring: first and last join by a space
540 568
541 569
542 570 Note that while in the above example we use a static dictionary, libraries may
543 571 decide to use a custom object that define ``__getitem__``, we caution against
544 572 using objects that would trigger computation to show documentation, but it is
545 573 sometime preferable for highly dynamic code that for example export ans API as
546 574 object.
547 575
548 576
549 577
550 578 .. _version 8.11.0:
551 579
552 580 IPython 8.11
553 581 ------------
554 582
555 583 Back on almost regular monthly schedule for IPython with end-of-month
556 584 really-late-Friday release to make sure some bugs are properly fixed.
557 585 Small addition of with a few new features, bugfix and UX improvements.
558 586
559 587 This is a non-exhaustive list, but among other you will find:
560 588
561 589 Faster Traceback Highlighting
562 590 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
563 591
564 592 Resurrection of pre-IPython-8 traceback highlighting code.
565 593
566 594 Really long and complicated files were slow to highlight in traceback with
567 595 IPython 8 despite upstream improvement that make many case better. Therefore
568 596 starting with IPython 8.11 when one of the highlighted file is more than 10 000
569 597 line long by default, we'll fallback to a faster path that does not have all the
570 598 features of highlighting failing AST nodes.
571 599
572 600 This can be configures by setting the value of
573 601 ``IPython.code.ultratb.FAST_THRESHOLD`` to an arbitrary low or large value.
574 602
575 603
576 604 Autoreload verbosity
577 605 ~~~~~~~~~~~~~~~~~~~~
578 606
579 607 We introduce more descriptive names for the ``%autoreload`` parameter:
580 608
581 609 - ``%autoreload now`` (also ``%autoreload``) - perform autoreload immediately.
582 610 - ``%autoreload off`` (also ``%autoreload 0``) - turn off autoreload.
583 611 - ``%autoreload explicit`` (also ``%autoreload 1``) - turn on autoreload only for modules
584 612 whitelisted by ``%aimport`` statements.
585 613 - ``%autoreload all`` (also ``%autoreload 2``) - turn on autoreload for all modules except those
586 614 blacklisted by ``%aimport`` statements.
587 615 - ``%autoreload complete`` (also ``%autoreload 3``) - all the fatures of ``all`` but also adding new
588 616 objects from the imported modules (see
589 617 IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects).
590 618
591 619 The original designations (e.g. "2") still work, and these new ones are case-insensitive.
592 620
593 621 Additionally, the option ``--print`` or ``-p`` can be added to the line to print the names of
594 622 modules being reloaded. Similarly, ``--log`` or ``-l`` will output the names to the logger at INFO
595 623 level. Both can be used simultaneously.
596 624
597 625 The parsing logic for ``%aimport`` is now improved such that modules can be whitelisted and
598 626 blacklisted in the same line, e.g. it's now possible to call ``%aimport os, -math`` to include
599 627 ``os`` for ``%autoreload explicit`` and exclude ``math`` for modes ``all`` and ``complete``.
600 628
601 629 Terminal shortcuts customization
602 630 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
603 631
604 632 Previously modifying shortcuts was only possible by hooking into startup files
605 633 and practically limited to adding new shortcuts or removing all shortcuts bound
606 634 to a specific key. This release enables users to override existing terminal
607 635 shortcuts, disable them or add new keybindings.
608 636
609 637 For example, to set the :kbd:`right` to accept a single character of auto-suggestion
610 638 you could use::
611 639
612 640 my_shortcuts = [
613 641 {
614 642 "command": "IPython:auto_suggest.accept_character",
615 643 "new_keys": ["right"]
616 644 }
617 645 ]
618 646 %config TerminalInteractiveShell.shortcuts = my_shortcuts
619 647
620 648 You can learn more in :std:configtrait:`TerminalInteractiveShell.shortcuts`
621 649 configuration reference.
622 650
623 651 Miscellaneous
624 652 ~~~~~~~~~~~~~
625 653
626 654 - ``%gui`` should now support PySide6. :ghpull:`13864`
627 655 - Cli shortcuts can now be configured :ghpull:`13928`, see above.
628 656 (note that there might be an issue with prompt_toolkit 3.0.37 and shortcut configuration).
629 657
630 658 - Capture output should now respect ``;`` semicolon to suppress output.
631 659 :ghpull:`13940`
632 660 - Base64 encoded images (in jupyter frontend), will not have trailing newlines.
633 661 :ghpull:`13941`
634 662
635 663 As usual you can find the full list of PRs on GitHub under `the 8.11 milestone
636 664 <https://github.com/ipython/ipython/milestone/113?closed=1>`__.
637 665
638 666 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
639 667 work on IPython and related libraries.
640 668
641 669 .. _version 8.10.0:
642 670
643 671 IPython 8.10
644 672 ------------
645 673
646 674 Out of schedule release of IPython with minor fixes to patch a potential CVE-2023-24816.
647 675 This is a really low severity CVE that you most likely are not affected by unless:
648 676
649 677 - You are on windows.
650 678 - You have a custom build of Python without ``_ctypes``
651 679 - You cd or start IPython or Jupyter in untrusted directory which names may be
652 680 valid shell commands.
653 681
654 682 You can read more on `the advisory
655 683 <https://github.com/ipython/ipython/security/advisories/GHSA-29gw-9793-fvw7>`__.
656 684
657 685 In addition to fixing this CVE we also fix a couple of outstanding bugs and issues.
658 686
659 687 As usual you can find the full list of PRs on GitHub under `the 8.10 milestone
660 688 <https://github.com/ipython/ipython/milestone/112?closed=1>`__.
661 689
662 690 In Particular:
663 691
664 692 - bump minimum numpy to `>=1.21` version following NEP29. :ghpull:`13930`
665 693 - fix for compatibility with MyPy 1.0. :ghpull:`13933`
666 694 - fix nbgrader stalling when IPython's ``showtraceback`` function is
667 695 monkeypatched. :ghpull:`13934`
668 696
669 697
670 698
671 699 As this release also contains those minimal changes in addition to fixing the
672 700 CVE I decided to bump the minor version anyway.
673 701
674 702 This will not affect the normal release schedule, so IPython 8.11 is due in
675 703 about 2 weeks.
676 704
677 705 .. _version 8.9.0:
678 706
679 707 IPython 8.9.0
680 708 -------------
681 709
682 710 Second release of IPython in 2023, last Friday of the month, we are back on
683 711 track. This is a small release with a few bug-fixes, and improvements, mostly
684 712 with respect to terminal shortcuts.
685 713
686 714
687 715 The biggest improvement for 8.9 is a drastic amelioration of the
688 716 auto-suggestions sponsored by D.E. Shaw and implemented by the more and more
689 717 active contributor `@krassowski <https://github.com/krassowski>`.
690 718
691 719 - ``right`` accepts a single character from suggestion
692 720 - ``ctrl+right`` accepts a semantic token (macos default shortcuts take
693 721 precedence and need to be disabled to make this work)
694 722 - ``backspace`` deletes a character and resumes hinting autosuggestions
695 723 - ``ctrl-left`` accepts suggestion and moves cursor left one character.
696 724 - ``backspace`` deletes a character and resumes hinting autosuggestions
697 725 - ``down`` moves to suggestion to later in history when no lines are present below the cursors.
698 726 - ``up`` moves to suggestion from earlier in history when no lines are present above the cursor.
699 727
700 728 This is best described by the Gif posted by `@krassowski
701 729 <https://github.com/krassowski>`, and in the PR itself :ghpull:`13888`.
702 730
703 731 .. image:: ../_images/autosuggest.gif
704 732
705 733 Please report any feedback in order for us to improve the user experience.
706 734 In particular we are also working on making the shortcuts configurable.
707 735
708 736 If you are interested in better terminal shortcuts, I also invite you to
709 737 participate in issue `13879
710 738 <https://github.com/ipython/ipython/issues/13879>`__.
711 739
712 740
713 741 As we follow `NEP29
714 742 <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__, next version of
715 743 IPython will officially stop supporting numpy 1.20, and will stop supporting
716 744 Python 3.8 after April release.
717 745
718 746 As usual you can find the full list of PRs on GitHub under `the 8.9 milestone
719 747 <https://github.com/ipython/ipython/milestone/111?closed=1>`__.
720 748
721 749
722 750 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
723 751 work on IPython and related libraries.
724 752
725 753 .. _version 8.8.0:
726 754
727 755 IPython 8.8.0
728 756 -------------
729 757
730 758 First release of IPython in 2023 as there was no release at the end of
731 759 December.
732 760
733 761 This is an unusually big release (relatively speaking) with more than 15 Pull
734 762 Requests merged.
735 763
736 764 Of particular interest are:
737 765
738 766 - :ghpull:`13852` that replaces the greedy completer and improves
739 767 completion, in particular for dictionary keys.
740 768 - :ghpull:`13858` that adds ``py.typed`` to ``setup.cfg`` to make sure it is
741 769 bundled in wheels.
742 770 - :ghpull:`13869` that implements tab completions for IPython options in the
743 771 shell when using `argcomplete <https://github.com/kislyuk/argcomplete>`. I
744 772 believe this also needs a recent version of Traitlets.
745 773 - :ghpull:`13865` makes the ``inspector`` class of `InteractiveShell`
746 774 configurable.
747 775 - :ghpull:`13880` that removes minor-version entrypoints as the minor version
748 776 entry points that would be included in the wheel would be the one of the
749 777 Python version that was used to build the ``whl`` file.
750 778
751 779 In no particular order, the rest of the changes update the test suite to be
752 780 compatible with Pygments 2.14, various docfixes, testing on more recent python
753 781 versions and various updates.
754 782
755 783 As usual you can find the full list of PRs on GitHub under `the 8.8 milestone
756 784 <https://github.com/ipython/ipython/milestone/110>`__.
757 785
758 786 Many thanks to @krassowski for the many PRs and @jasongrout for reviewing and
759 787 merging contributions.
760 788
761 789 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
762 790 work on IPython and related libraries.
763 791
764 792 .. _version 8.7.0:
765 793
766 794 IPython 8.7.0
767 795 -------------
768 796
769 797
770 798 Small release of IPython with a couple of bug fixes and new features for this
771 799 month. Next month is the end of year, it is unclear if there will be a release
772 800 close to the new year's eve, or if the next release will be at the end of January.
773 801
774 802 Here are a few of the relevant fixes,
775 803 as usual you can find the full list of PRs on GitHub under `the 8.7 milestone
776 804 <https://github.com/ipython/ipython/pulls?q=milestone%3A8.7>`__.
777 805
778 806
779 807 - :ghpull:`13834` bump the minimum prompt toolkit to 3.0.11.
780 808 - IPython shipped with the ``py.typed`` marker now, and we are progressively
781 809 adding more types. :ghpull:`13831`
782 810 - :ghpull:`13817` add configuration of code blacks formatting.
783 811
784 812
785 813 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
786 814 work on IPython and related libraries.
787 815
788 816
789 817 .. _version 8.6.0:
790 818
791 819 IPython 8.6.0
792 820 -------------
793 821
794 822 Back to a more regular release schedule (at least I try), as Friday is
795 823 already over by more than 24h hours. This is a slightly bigger release with a
796 824 few new features that contain no less than 25 PRs.
797 825
798 826 We'll notably found a couple of non negligible changes:
799 827
800 828 The ``install_ext`` and related functions have been removed after being
801 829 deprecated for years. You can use pip to install extensions. ``pip`` did not
802 830 exist when ``install_ext`` was introduced. You can still load local extensions
803 831 without installing them. Just set your ``sys.path`` for example. :ghpull:`13744`
804 832
805 833 IPython now has extra entry points that use the major *and minor* version of
806 834 python. For some of you this means that you can do a quick ``ipython3.10`` to
807 835 launch IPython from the Python 3.10 interpreter, while still using Python 3.11
808 836 as your main Python. :ghpull:`13743`
809 837
810 838 The completer matcher API has been improved. See :ghpull:`13745`. This should
811 839 improve the type inference and improve dict keys completions in many use case.
812 840 Thanks ``@krassowski`` for all the work, and the D.E. Shaw group for sponsoring
813 841 it.
814 842
815 843 The color of error nodes in tracebacks can now be customized. See
816 844 :ghpull:`13756`. This is a private attribute until someone finds the time to
817 845 properly add a configuration option. Note that with Python 3.11 that also shows
818 846 the relevant nodes in traceback, it would be good to leverage this information
819 847 (plus the "did you mean" info added on attribute errors). But that's likely work
820 848 I won't have time to do before long, so contributions welcome.
821 849
822 850 As we follow NEP 29, we removed support for numpy 1.19 :ghpull:`13760`.
823 851
824 852
825 853 The ``open()`` function present in the user namespace by default will now refuse
826 854 to open the file descriptors 0,1,2 (stdin, out, err), to avoid crashing IPython.
827 855 This mostly occurs in teaching context when incorrect values get passed around.
828 856
829 857
830 858 The ``?``, ``??``, and corresponding ``pinfo``, ``pinfo2`` magics can now find
831 859 objects inside arrays. That is to say, the following now works::
832 860
833 861
834 862 >>> def my_func(*arg, **kwargs):pass
835 863 >>> container = [my_func]
836 864 >>> container[0]?
837 865
838 866
839 867 If ``container`` define a custom ``getitem``, this __will__ trigger the custom
840 868 method. So don't put side effects in your ``getitems``. Thanks to the D.E. Shaw
841 869 group for the request and sponsoring the work.
842 870
843 871
844 872 As usual you can find the full list of PRs on GitHub under `the 8.6 milestone
845 873 <https://github.com/ipython/ipython/pulls?q=milestone%3A8.6>`__.
846 874
847 875 Thanks to all hacktoberfest contributors, please contribute to
848 876 `closember.org <https://closember.org/>`__.
849 877
850 878 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
851 879 work on IPython and related libraries.
852 880
853 881 .. _version 8.5.0:
854 882
855 883 IPython 8.5.0
856 884 -------------
857 885
858 886 First release since a couple of month due to various reasons and timing preventing
859 887 me for sticking to the usual monthly release the last Friday of each month. This
860 888 is of non negligible size as it has more than two dozen PRs with various fixes
861 889 an bug fixes.
862 890
863 891 Many thanks to everybody who contributed PRs for your patience in review and
864 892 merges.
865 893
866 894 Here is a non-exhaustive list of changes that have been implemented for IPython
867 895 8.5.0. As usual you can find the full list of issues and PRs tagged with `the
868 896 8.5 milestone
869 897 <https://github.com/ipython/ipython/pulls?q=is%3Aclosed+milestone%3A8.5+>`__.
870 898
871 899 - Added a shortcut for accepting auto suggestion. The End key shortcut for
872 900 accepting auto-suggestion This binding works in Vi mode too, provided
873 901 ``TerminalInteractiveShell.emacs_bindings_in_vi_insert_mode`` is set to be
874 902 ``True`` :ghpull:`13566`.
875 903
876 904 - No popup in window for latex generation when generating latex (e.g. via
877 905 `_latex_repr_`) no popup window is shows under Windows. :ghpull:`13679`
878 906
879 907 - Fixed error raised when attempting to tab-complete an input string with
880 908 consecutive periods or forward slashes (such as "file:///var/log/...").
881 909 :ghpull:`13675`
882 910
883 911 - Relative filenames in Latex rendering :
884 912 The `latex_to_png_dvipng` command internally generates input and output file
885 913 arguments to `latex` and `dvipis`. These arguments are now generated as
886 914 relative files to the current working directory instead of absolute file
887 915 paths. This solves a problem where the current working directory contains
888 916 characters that are not handled properly by `latex` and `dvips`. There are
889 917 no changes to the user API. :ghpull:`13680`
890 918
891 919 - Stripping decorators bug: Fixed bug which meant that ipython code blocks in
892 920 restructured text documents executed with the ipython-sphinx extension
893 921 skipped any lines of code containing python decorators. :ghpull:`13612`
894 922
895 923 - Allow some modules with frozen dataclasses to be reloaded. :ghpull:`13732`
896 924 - Fix paste magic on wayland. :ghpull:`13671`
897 925 - show maxlen in deque's repr. :ghpull:`13648`
898 926
899 927 Restore line numbers for Input
900 928 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
901 929
902 930 Line number information in tracebacks from input are restored.
903 931 Line numbers from input were removed during the transition to v8 enhanced traceback reporting.
904 932
905 933 So, instead of::
906 934
907 935 ---------------------------------------------------------------------------
908 936 ZeroDivisionError Traceback (most recent call last)
909 937 Input In [3], in <cell line: 1>()
910 938 ----> 1 myfunc(2)
911 939
912 940 Input In [2], in myfunc(z)
913 941 1 def myfunc(z):
914 942 ----> 2 foo.boo(z-1)
915 943
916 944 File ~/code/python/ipython/foo.py:3, in boo(x)
917 945 2 def boo(x):
918 946 ----> 3 return 1/(1-x)
919 947
920 948 ZeroDivisionError: division by zero
921 949
922 950 The error traceback now looks like::
923 951
924 952 ---------------------------------------------------------------------------
925 953 ZeroDivisionError Traceback (most recent call last)
926 954 Cell In [3], line 1
927 955 ----> 1 myfunc(2)
928 956
929 957 Cell In [2], line 2, in myfunc(z)
930 958 1 def myfunc(z):
931 959 ----> 2 foo.boo(z-1)
932 960
933 961 File ~/code/python/ipython/foo.py:3, in boo(x)
934 962 2 def boo(x):
935 963 ----> 3 return 1/(1-x)
936 964
937 965 ZeroDivisionError: division by zero
938 966
939 967 or, with xmode=Plain::
940 968
941 969 Traceback (most recent call last):
942 970 Cell In [12], line 1
943 971 myfunc(2)
944 972 Cell In [6], line 2 in myfunc
945 973 foo.boo(z-1)
946 974 File ~/code/python/ipython/foo.py:3 in boo
947 975 return 1/(1-x)
948 976 ZeroDivisionError: division by zero
949 977
950 978 :ghpull:`13560`
951 979
952 980 New setting to silence warning if working inside a virtual environment
953 981 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
954 982
955 983 Previously, when starting IPython in a virtual environment without IPython installed (so IPython from the global environment is used), the following warning was printed:
956 984
957 985 Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
958 986
959 987 This warning can be permanently silenced by setting ``c.InteractiveShell.warn_venv`` to ``False`` (the default is ``True``).
960 988
961 989 :ghpull:`13706`
962 990
963 991 -------
964 992
965 993 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
966 994 work on IPython and related libraries.
967 995
968 996
969 997 .. _version 8.4.0:
970 998
971 999 IPython 8.4.0
972 1000 -------------
973 1001
974 1002 As for 7.34, this version contains a single fix: fix uncaught BdbQuit exceptions on ipdb
975 1003 exit :ghpull:`13668`, and a single typo fix in documentation: :ghpull:`13682`
976 1004
977 1005 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
978 1006 work on IPython and related libraries.
979 1007
980 1008
981 1009 .. _version 8.3.0:
982 1010
983 1011 IPython 8.3.0
984 1012 -------------
985 1013
986 1014 - :ghpull:`13625`, using ``?``, ``??``, ``*?`` will not call
987 1015 ``set_next_input`` as most frontend allow proper multiline editing and it was
988 1016 causing issues for many users of multi-cell frontends. This has been backported to 7.33
989 1017
990 1018
991 1019 - :ghpull:`13600`, ``pre_run_*``-hooks will now have a ``cell_id`` attribute on
992 1020 the info object when frontend provides it. This has been backported to 7.33
993 1021
994 1022 - :ghpull:`13624`, fixed :kbd:`End` key being broken after accepting an
995 1023 auto-suggestion.
996 1024
997 1025 - :ghpull:`13657` fixed an issue where history from different sessions would be mixed.
998 1026
999 1027 .. _version 8.2.0:
1000 1028
1001 1029 IPython 8.2.0
1002 1030 -------------
1003 1031
1004 1032 IPython 8.2 mostly bring bugfixes to IPython.
1005 1033
1006 1034 - Auto-suggestion can now be elected with the ``end`` key. :ghpull:`13566`
1007 1035 - Some traceback issues with ``assert etb is not None`` have been fixed. :ghpull:`13588`
1008 1036 - History is now pulled from the sqitel database and not from in-memory.
1009 1037 In particular when using the ``%paste`` magic, the content of the pasted text will
1010 1038 be part of the history and not the verbatim text ``%paste`` anymore. :ghpull:`13592`
1011 1039 - Fix ``Ctrl-\\`` exit cleanup :ghpull:`13603`
1012 1040 - Fixes to ``ultratb`` ipdb support when used outside of IPython. :ghpull:`13498`
1013 1041
1014 1042
1015 1043 I am still trying to fix and investigate :ghissue:`13598`, which seems to be
1016 1044 random, and would appreciate help if you find a reproducible minimal case. I've
1017 1045 tried to make various changes to the codebase to mitigate it, but a proper fix
1018 1046 will be difficult without understanding the cause.
1019 1047
1020 1048
1021 1049 All the issues on pull-requests for this release can be found in the `8.2
1022 1050 milestone. <https://github.com/ipython/ipython/milestone/100>`__ . And some
1023 1051 documentation only PR can be found as part of the `7.33 milestone
1024 1052 <https://github.com/ipython/ipython/milestone/101>`__ (currently not released).
1025 1053
1026 1054 Thanks to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
1027 1055 work on IPython and related libraries.
1028 1056
1029 1057 .. _version 8.1.1:
1030 1058
1031 1059 IPython 8.1.1
1032 1060 -------------
1033 1061
1034 1062 Fix an issue with virtualenv and Python 3.8 introduced in 8.1
1035 1063
1036 1064 Revert :ghpull:`13537` (fix an issue with symlinks in virtualenv) that raises an
1037 1065 error in Python 3.8, and fixed in a different way in :ghpull:`13559`.
1038 1066
1039 1067 .. _version 8.1:
1040 1068
1041 1069 IPython 8.1.0
1042 1070 -------------
1043 1071
1044 1072 IPython 8.1 is the first minor release after 8.0 and fixes a number of bugs and
1045 1073 updates a few behaviors that were problematic with the 8.0 as with many new major
1046 1074 release.
1047 1075
1048 1076 Note that beyond the changes listed here, IPython 8.1.0 also contains all the
1049 1077 features listed in :ref:`version 7.32`.
1050 1078
1051 1079 - Misc and multiple fixes around quotation auto-closing. It is now disabled by
1052 1080 default. Run with ``TerminalInteractiveShell.auto_match=True`` to re-enabled
1053 1081 - Require pygments>=2.4.0 :ghpull:`13459`, this was implicit in the code, but
1054 1082 is now explicit in ``setup.cfg``/``setup.py``
1055 1083 - Docs improvement of ``core.magic_arguments`` examples. :ghpull:`13433`
1056 1084 - Multi-line edit executes too early with await. :ghpull:`13424`
1057 1085
1058 1086 - ``black`` is back as an optional dependency, and autoformatting disabled by
1059 1087 default until some fixes are implemented (black improperly reformat magics).
1060 1088 :ghpull:`13471` Additionally the ability to use ``yapf`` as a code
1061 1089 reformatter has been added :ghpull:`13528` . You can use
1062 1090 ``TerminalInteractiveShell.autoformatter="black"``,
1063 1091 ``TerminalInteractiveShell.autoformatter="yapf"`` to re-enable auto formatting
1064 1092 with black, or switch to yapf.
1065 1093
1066 1094 - Fix and issue where ``display`` was not defined.
1067 1095
1068 1096 - Auto suggestions are now configurable. Currently only
1069 1097 ``AutoSuggestFromHistory`` (default) and ``None``. new provider contribution
1070 1098 welcomed. :ghpull:`13475`
1071 1099
1072 1100 - multiple packaging/testing improvement to simplify downstream packaging
1073 1101 (xfail with reasons, try to not access network...).
1074 1102
1075 1103 - Update deprecation. ``InteractiveShell.magic`` internal method has been
1076 1104 deprecated for many years but did not emit a warning until now.
1077 1105
1078 1106 - internal ``appended_to_syspath`` context manager has been deprecated.
1079 1107
1080 1108 - fix an issue with symlinks in virtualenv :ghpull:`13537` (Reverted in 8.1.1)
1081 1109
1082 1110 - Fix an issue with vim mode, where cursor would not be reset on exit :ghpull:`13472`
1083 1111
1084 1112 - ipython directive now remove only known pseudo-decorators :ghpull:`13532`
1085 1113
1086 1114 - ``IPython/lib/security`` which used to be used for jupyter notebook has been
1087 1115 removed.
1088 1116
1089 1117 - Fix an issue where ``async with`` would execute on new lines. :ghpull:`13436`
1090 1118
1091 1119
1092 1120 We want to remind users that IPython is part of the Jupyter organisations, and
1093 1121 thus governed by a Code of Conduct. Some of the behavior we have seen on GitHub is not acceptable.
1094 1122 Abuse and non-respectful comments on discussion will not be tolerated.
1095 1123
1096 1124 Many thanks to all the contributors to this release, many of the above fixed issues and
1097 1125 new features were done by first time contributors, showing there is still
1098 1126 plenty of easy contribution possible in IPython
1099 1127 . You can find all individual contributions
1100 1128 to this milestone `on github <https://github.com/ipython/ipython/milestone/91>`__.
1101 1129
1102 1130 Thanks as well to the `D. E. Shaw group <https://deshaw.com/>`__ for sponsoring
1103 1131 work on IPython and related libraries. In particular the Lazy autoloading of
1104 1132 magics that you will find described in the 7.32 release notes.
1105 1133
1106 1134
1107 1135 .. _version 8.0.1:
1108 1136
1109 1137 IPython 8.0.1 (CVE-2022-21699)
1110 1138 ------------------------------
1111 1139
1112 1140 IPython 8.0.1, 7.31.1 and 5.11 are security releases that change some default
1113 1141 values in order to prevent potential Execution with Unnecessary Privileges.
1114 1142
1115 1143 Almost all version of IPython looks for configuration and profiles in current
1116 1144 working directory. Since IPython was developed before pip and environments
1117 1145 existed it was used a convenient way to load code/packages in a project
1118 1146 dependant way.
1119 1147
1120 1148 In 2022, it is not necessary anymore, and can lead to confusing behavior where
1121 1149 for example cloning a repository and starting IPython or loading a notebook from
1122 1150 any Jupyter-Compatible interface that has ipython set as a kernel can lead to
1123 1151 code execution.
1124 1152
1125 1153
1126 1154 I did not find any standard way for packaged to advertise CVEs they fix, I'm
1127 1155 thus trying to add a ``__patched_cves__`` attribute to the IPython module that
1128 1156 list the CVEs that should have been fixed. This attribute is informational only
1129 1157 as if a executable has a flaw, this value can always be changed by an attacker.
1130 1158
1131 1159 .. code::
1132 1160
1133 1161 In [1]: import IPython
1134 1162
1135 1163 In [2]: IPython.__patched_cves__
1136 1164 Out[2]: {'CVE-2022-21699'}
1137 1165
1138 1166 In [3]: 'CVE-2022-21699' in IPython.__patched_cves__
1139 1167 Out[3]: True
1140 1168
1141 1169 Thus starting with this version:
1142 1170
1143 1171 - The current working directory is not searched anymore for profiles or
1144 1172 configurations files.
1145 1173 - Added a ``__patched_cves__`` attribute (set of strings) to IPython module that contain
1146 1174 the list of fixed CVE. This is informational only.
1147 1175
1148 1176 Further details can be read on the `GitHub Advisory <https://github.com/ipython/ipython/security/advisories/GHSA-pq7m-3gw7-gq5x>`__
1149 1177
1150 1178
1151 1179 .. _version 8.0:
1152 1180
1153 1181 IPython 8.0
1154 1182 -----------
1155 1183
1156 1184 IPython 8.0 is bringing a large number of new features and improvements to both the
1157 1185 user of the terminal and of the kernel via Jupyter. The removal of compatibility
1158 1186 with an older version of Python is also the opportunity to do a couple of
1159 1187 performance improvements in particular with respect to startup time.
1160 1188 The 8.x branch started diverging from its predecessor around IPython 7.12
1161 1189 (January 2020).
1162 1190
1163 1191 This release contains 250+ pull requests, in addition to many of the features
1164 1192 and backports that have made it to the 7.x branch. Please see the
1165 1193 `8.0 milestone <https://github.com/ipython/ipython/milestone/73?closed=1>`__ for the full list of pull requests.
1166 1194
1167 1195 Please feel free to send pull requests to update those notes after release,
1168 1196 I have likely forgotten a few things reviewing 250+ PRs.
1169 1197
1170 1198 Dependencies changes/downstream packaging
1171 1199 -----------------------------------------
1172 1200
1173 1201 Most of our building steps have been changed to be (mostly) declarative
1174 1202 and follow PEP 517. We are trying to completely remove ``setup.py`` (:ghpull:`13238`) and are
1175 1203 looking for help to do so.
1176 1204
1177 1205 - minimum supported ``traitlets`` version is now 5+
1178 1206 - we now require ``stack_data``
1179 1207 - minimal Python is now 3.8
1180 1208 - ``nose`` is not a testing requirement anymore
1181 1209 - ``pytest`` replaces nose.
1182 1210 - ``iptest``/``iptest3`` cli entrypoints do not exist anymore.
1183 1211 - the minimum officially ​supported ``numpy`` version has been bumped, but this should
1184 1212 not have much effect on packaging.
1185 1213
1186 1214
1187 1215 Deprecation and removal
1188 1216 -----------------------
1189 1217
1190 1218 We removed almost all features, arguments, functions, and modules that were
1191 1219 marked as deprecated between IPython 1.0 and 5.0. As a reminder, 5.0 was released
1192 1220 in 2016, and 1.0 in 2013. Last release of the 5 branch was 5.10.0, in May 2020.
1193 1221 The few remaining deprecated features we left have better deprecation warnings
1194 1222 or have been turned into explicit errors for better error messages.
1195 1223
1196 1224 I will use this occasion to add the following requests to anyone emitting a
1197 1225 deprecation warning:
1198 1226
1199 1227 - Please add at least ``stacklevel=2`` so that the warning is emitted into the
1200 1228 caller context, and not the callee one.
1201 1229 - Please add **since which version** something is deprecated.
1202 1230
1203 1231 As a side note, it is much easier to conditionally compare version
1204 1232 numbers rather than using ``try/except`` when functionality changes with a version.
1205 1233
1206 1234 I won't list all the removed features here, but modules like ``IPython.kernel``,
1207 1235 which was just a shim module around ``ipykernel`` for the past 8 years, have been
1208 1236 removed, and so many other similar things that pre-date the name **Jupyter**
1209 1237 itself.
1210 1238
1211 1239 We no longer need to add ``IPython.extensions`` to the PYTHONPATH because that is being
1212 1240 handled by ``load_extension``.
1213 1241
1214 1242 We are also removing ``Cythonmagic``, ``sympyprinting`` and ``rmagic`` as they are now in
1215 1243 other packages and no longer need to be inside IPython.
1216 1244
1217 1245
1218 1246 Documentation
1219 1247 -------------
1220 1248
1221 1249 The majority of our docstrings have now been reformatted and automatically fixed by
1222 1250 the experimental `VΓ©lin <https://pypi.org/project/velin/>`_ project to conform
1223 1251 to numpydoc.
1224 1252
1225 1253 Type annotations
1226 1254 ----------------
1227 1255
1228 1256 While IPython itself is highly dynamic and can't be completely typed, many of
1229 1257 the functions now have type annotations, and part of the codebase is now checked
1230 1258 by mypy.
1231 1259
1232 1260
1233 1261 Featured changes
1234 1262 ----------------
1235 1263
1236 1264 Here is a features list of changes in IPython 8.0. This is of course non-exhaustive.
1237 1265 Please note as well that many features have been added in the 7.x branch as well
1238 1266 (and hence why you want to read the 7.x what's new notes), in particular
1239 1267 features contributed by QuantStack (with respect to debugger protocol and Xeus
1240 1268 Python), as well as many debugger features that I was pleased to implement as
1241 1269 part of my work at QuanSight and sponsored by DE Shaw.
1242 1270
1243 1271 Traceback improvements
1244 1272 ~~~~~~~~~~~~~~~~~~~~~~
1245 1273
1246 1274 Previously, error tracebacks for errors happening in code cells were showing a
1247 1275 hash, the one used for compiling the Python AST::
1248 1276
1249 1277 In [1]: def foo():
1250 1278 ...: return 3 / 0
1251 1279 ...:
1252 1280
1253 1281 In [2]: foo()
1254 1282 ---------------------------------------------------------------------------
1255 1283 ZeroDivisionError Traceback (most recent call last)
1256 1284 <ipython-input-2-c19b6d9633cf> in <module>
1257 1285 ----> 1 foo()
1258 1286
1259 1287 <ipython-input-1-1595a74c32d5> in foo()
1260 1288 1 def foo():
1261 1289 ----> 2 return 3 / 0
1262 1290 3
1263 1291
1264 1292 ZeroDivisionError: division by zero
1265 1293
1266 1294 The error traceback is now correctly formatted, showing the cell number in which the error happened::
1267 1295
1268 1296 In [1]: def foo():
1269 1297 ...: return 3 / 0
1270 1298 ...:
1271 1299
1272 1300 Input In [2]: foo()
1273 1301 ---------------------------------------------------------------------------
1274 1302 ZeroDivisionError Traceback (most recent call last)
1275 1303 input In [2], in <module>
1276 1304 ----> 1 foo()
1277 1305
1278 1306 Input In [1], in foo()
1279 1307 1 def foo():
1280 1308 ----> 2 return 3 / 0
1281 1309
1282 1310 ZeroDivisionError: division by zero
1283 1311
1284 1312 The ``stack_data`` package has been integrated, which provides smarter information in the traceback;
1285 1313 in particular it will highlight the AST node where an error occurs which can help to quickly narrow down errors.
1286 1314
1287 1315 For example in the following snippet::
1288 1316
1289 1317 def foo(i):
1290 1318 x = [[[0]]]
1291 1319 return x[0][i][0]
1292 1320
1293 1321
1294 1322 def bar():
1295 1323 return foo(0) + foo(
1296 1324 1
1297 1325 ) + foo(2)
1298 1326
1299 1327
1300 1328 calling ``bar()`` would raise an ``IndexError`` on the return line of ``foo``,
1301 1329 and IPython 8.0 is capable of telling you where the index error occurs::
1302 1330
1303 1331
1304 1332 IndexError
1305 1333 Input In [2], in <module>
1306 1334 ----> 1 bar()
1307 1335 ^^^^^
1308 1336
1309 1337 Input In [1], in bar()
1310 1338 6 def bar():
1311 1339 ----> 7 return foo(0) + foo(
1312 1340 ^^^^
1313 1341 8 1
1314 1342 ^^^^^^^^
1315 1343 9 ) + foo(2)
1316 1344 ^^^^
1317 1345
1318 1346 Input In [1], in foo(i)
1319 1347 1 def foo(i):
1320 1348 2 x = [[[0]]]
1321 1349 ----> 3 return x[0][i][0]
1322 1350 ^^^^^^^
1323 1351
1324 1352 The corresponding locations marked here with ``^`` will show up highlighted in
1325 1353 the terminal and notebooks.
1326 1354
1327 1355 Finally, a colon ``::`` and line number is appended after a filename in
1328 1356 traceback::
1329 1357
1330 1358
1331 1359 ZeroDivisionError Traceback (most recent call last)
1332 1360 File ~/error.py:4, in <module>
1333 1361 1 def f():
1334 1362 2 1/0
1335 1363 ----> 4 f()
1336 1364
1337 1365 File ~/error.py:2, in f()
1338 1366 1 def f():
1339 1367 ----> 2 1/0
1340 1368
1341 1369 Many terminals and editors have integrations enabling you to directly jump to the
1342 1370 relevant file/line when this syntax is used, so this small addition may have a high
1343 1371 impact on productivity.
1344 1372
1345 1373
1346 1374 Autosuggestions
1347 1375 ~~~~~~~~~~~~~~~
1348 1376
1349 1377 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>`__.
1350 1378
1351 1379 `Ptpython <https://github.com/prompt-toolkit/ptpython#ptpython>`__ allows users to enable this feature in
1352 1380 `ptpython/config.py <https://github.com/prompt-toolkit/ptpython/blob/master/examples/ptpython_config/config.py#L90>`__.
1353 1381
1354 1382 This feature allows users to accept autosuggestions with ctrl e, ctrl f,
1355 1383 or right arrow as described below.
1356 1384
1357 1385 1. Start ipython
1358 1386
1359 1387 .. image:: ../_images/8.0/auto_suggest_1_prompt_no_text.png
1360 1388
1361 1389 2. Run ``print("hello")``
1362 1390
1363 1391 .. image:: ../_images/8.0/auto_suggest_2_print_hello_suggest.png
1364 1392
1365 1393 3. start typing ``print`` again to see the autosuggestion
1366 1394
1367 1395 .. image:: ../_images/8.0/auto_suggest_3_print_hello_suggest.png
1368 1396
1369 1397 4. Press ``ctrl-f``, or ``ctrl-e``, or ``right-arrow`` to accept the suggestion
1370 1398
1371 1399 .. image:: ../_images/8.0/auto_suggest_4_print_hello.png
1372 1400
1373 1401 You can also complete word by word:
1374 1402
1375 1403 1. Run ``def say_hello(): print("hello")``
1376 1404
1377 1405 .. image:: ../_images/8.0/auto_suggest_second_prompt.png
1378 1406
1379 1407 2. Start typing the first letter if ``def`` to see the autosuggestion
1380 1408
1381 1409 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
1382 1410
1383 1411 3. Press ``alt-f`` (or ``escape`` followed by ``f``), to accept the first word of the suggestion
1384 1412
1385 1413 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
1386 1414
1387 1415 Importantly, this feature does not interfere with tab completion:
1388 1416
1389 1417 1. After running ``def say_hello(): print("hello")``, press d
1390 1418
1391 1419 .. image:: ../_images/8.0/auto_suggest_d_phantom.png
1392 1420
1393 1421 2. Press Tab to start tab completion
1394 1422
1395 1423 .. image:: ../_images/8.0/auto_suggest_d_completions.png
1396 1424
1397 1425 3A. Press Tab again to select the first option
1398 1426
1399 1427 .. image:: ../_images/8.0/auto_suggest_def_completions.png
1400 1428
1401 1429 3B. Press ``alt f`` (``escape``, ``f``) to accept to accept the first word of the suggestion
1402 1430
1403 1431 .. image:: ../_images/8.0/auto_suggest_def_phantom.png
1404 1432
1405 1433 3C. Press ``ctrl-f`` or ``ctrl-e`` to accept the entire suggestion
1406 1434
1407 1435 .. image:: ../_images/8.0/auto_suggest_match_parens.png
1408 1436
1409 1437
1410 1438 Currently, autosuggestions are only shown in the emacs or vi insert editing modes:
1411 1439
1412 1440 - The ctrl e, ctrl f, and alt f shortcuts work by default in emacs mode.
1413 1441 - 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/>`__.
1414 1442
1415 1443
1416 1444 Show pinfo information in ipdb using "?" and "??"
1417 1445 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1418 1446
1419 1447 In IPDB, it is now possible to show the information about an object using "?"
1420 1448 and "??", in much the same way that it can be done when using the IPython prompt::
1421 1449
1422 1450 ipdb> partial?
1423 1451 Init signature: partial(self, /, *args, **kwargs)
1424 1452 Docstring:
1425 1453 partial(func, *args, **keywords) - new function with partial application
1426 1454 of the given arguments and keywords.
1427 1455 File: ~/.pyenv/versions/3.8.6/lib/python3.8/functools.py
1428 1456 Type: type
1429 1457 Subclasses:
1430 1458
1431 1459 Previously, ``pinfo`` or ``pinfo2`` command had to be used for this purpose.
1432 1460
1433 1461
1434 1462 Autoreload 3 feature
1435 1463 ~~~~~~~~~~~~~~~~~~~~
1436 1464
1437 1465 Example: When an IPython session is run with the 'autoreload' extension loaded,
1438 1466 you will now have the option '3' to select, which means the following:
1439 1467
1440 1468 1. replicate all functionality from option 2
1441 1469 2. autoload all new funcs/classes/enums/globals from the module when they are added
1442 1470 3. autoload all newly imported funcs/classes/enums/globals from external modules
1443 1471
1444 1472 Try ``%autoreload 3`` in an IPython session after running ``%load_ext autoreload``.
1445 1473
1446 1474 For more information please see the following unit test : ``extensions/tests/test_autoreload.py:test_autoload_newly_added_objects``
1447 1475
1448 1476 Auto formatting with black in the CLI
1449 1477 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1450 1478
1451 1479 This feature was present in 7.x, but disabled by default.
1452 1480
1453 1481 In 8.0, input was automatically reformatted with Black when black was installed.
1454 1482 This feature has been reverted for the time being.
1455 1483 You can re-enable it by setting ``TerminalInteractiveShell.autoformatter`` to ``"black"``
1456 1484
1457 1485 History Range Glob feature
1458 1486 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1459 1487
1460 1488 Previously, when using ``%history``, users could specify either
1461 1489 a range of sessions and lines, for example:
1462 1490
1463 1491 .. code-block:: python
1464 1492
1465 1493 ~8/1-~6/5 # see history from the first line of 8 sessions ago,
1466 1494 # to the fifth line of 6 sessions ago.``
1467 1495
1468 1496 Or users could specify a glob pattern:
1469 1497
1470 1498 .. code-block:: python
1471 1499
1472 1500 -g <pattern> # glob ALL history for the specified pattern.
1473 1501
1474 1502 However users could *not* specify both.
1475 1503
1476 1504 If a user *did* specify both a range and a glob pattern,
1477 1505 then the glob pattern would be used (globbing *all* history) *and the range would be ignored*.
1478 1506
1479 1507 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.
1480 1508
1481 1509 Don't start a multi-line cell with sunken parenthesis
1482 1510 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1483 1511
1484 1512 From now on, IPython will not ask for the next line of input when given a single
1485 1513 line with more closing than opening brackets. For example, this means that if
1486 1514 you (mis)type ``]]`` instead of ``[]``, a ``SyntaxError`` will show up, instead of
1487 1515 the ``...:`` prompt continuation.
1488 1516
1489 1517 IPython shell for ipdb interact
1490 1518 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1491 1519
1492 1520 The ipdb ``interact`` starts an IPython shell instead of Python's built-in ``code.interact()``.
1493 1521
1494 1522 Automatic Vi prompt stripping
1495 1523 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1496 1524
1497 1525 When pasting code into IPython, it will strip the leading prompt characters if
1498 1526 there are any. For example, you can paste the following code into the console -
1499 1527 it will still work, even though each line is prefixed with prompts (``In``,
1500 1528 ``Out``)::
1501 1529
1502 1530 In [1]: 2 * 2 == 4
1503 1531 Out[1]: True
1504 1532
1505 1533 In [2]: print("This still works as pasted")
1506 1534
1507 1535
1508 1536 Previously, this was not the case for the Vi-mode prompts::
1509 1537
1510 1538 In [1]: [ins] In [13]: 2 * 2 == 4
1511 1539 ...: Out[13]: True
1512 1540 ...:
1513 1541 File "<ipython-input-1-727bb88eaf33>", line 1
1514 1542 [ins] In [13]: 2 * 2 == 4
1515 1543 ^
1516 1544 SyntaxError: invalid syntax
1517 1545
1518 1546 This is now fixed, and Vi prompt prefixes - ``[ins]`` and ``[nav]`` - are
1519 1547 skipped just as the normal ``In`` would be.
1520 1548
1521 1549 IPython shell can be started in the Vi mode using ``ipython --TerminalInteractiveShell.editing_mode=vi``,
1522 1550 You should be able to change mode dynamically with ``%config TerminalInteractiveShell.editing_mode='vi'``
1523 1551
1524 1552 Empty History Ranges
1525 1553 ~~~~~~~~~~~~~~~~~~~~
1526 1554
1527 1555 A number of magics that take history ranges can now be used with an empty
1528 1556 range. These magics are:
1529 1557
1530 1558 * ``%save``
1531 1559 * ``%load``
1532 1560 * ``%pastebin``
1533 1561 * ``%pycat``
1534 1562
1535 1563 Using them this way will make them take the history of the current session up
1536 1564 to the point of the magic call (such that the magic itself will not be
1537 1565 included).
1538 1566
1539 1567 Therefore it is now possible to save the whole history to a file using
1540 1568 ``%save <filename>``, load and edit it using ``%load`` (makes for a nice usage
1541 1569 when followed with :kbd:`F2`), send it to `dpaste.org <http://dpast.org>`_ using
1542 1570 ``%pastebin``, or view the whole thing syntax-highlighted with a single
1543 1571 ``%pycat``.
1544 1572
1545 1573
1546 1574 Windows timing implementation: Switch to process_time
1547 1575 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1548 1576 Timing on Windows, for example with ``%%time``, was changed from being based on ``time.perf_counter``
1549 1577 (which counted time even when the process was sleeping) to being based on ``time.process_time`` instead
1550 1578 (which only counts CPU time). This brings it closer to the behavior on Linux. See :ghpull:`12984`.
1551 1579
1552 1580 Miscellaneous
1553 1581 ~~~~~~~~~~~~~
1554 1582 - Non-text formatters are not disabled in the terminal, which should simplify
1555 1583 writing extensions displaying images or other mimetypes in supporting terminals.
1556 1584 :ghpull:`12315`
1557 1585 - It is now possible to automatically insert matching brackets in Terminal IPython using the
1558 1586 ``TerminalInteractiveShell.auto_match=True`` option. :ghpull:`12586`
1559 1587 - We are thinking of deprecating the current ``%%javascript`` magic in favor of a better replacement. See :ghpull:`13376`.
1560 1588 - ``~`` is now expanded when part of a path in most magics :ghpull:`13385`
1561 1589 - ``%/%%timeit`` magic now adds a comma every thousands to make reading a long number easier :ghpull:`13379`
1562 1590 - ``"info"`` messages can now be customised to hide some fields :ghpull:`13343`
1563 1591 - ``collections.UserList`` now pretty-prints :ghpull:`13320`
1564 1592 - The debugger now has a persistent history, which should make it less
1565 1593 annoying to retype commands :ghpull:`13246`
1566 1594 - ``!pip`` ``!conda`` ``!cd`` or ``!ls`` are likely doing the wrong thing. We
1567 1595 now warn users if they use one of those commands. :ghpull:`12954`
1568 1596 - Make ``%precision`` work for ``numpy.float64`` type :ghpull:`12902`
1569 1597
1570 1598 Re-added support for XDG config directories
1571 1599 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1572 1600
1573 1601 XDG support through the years comes and goes. There is a tension between having
1574 1602 an identical location for configuration in all platforms versus having simple instructions.
1575 1603 After initial failures a couple of years ago, IPython was modified to automatically migrate XDG
1576 1604 config files back into ``~/.ipython``. That migration code has now been removed.
1577 1605 IPython now checks the XDG locations, so if you _manually_ move your config
1578 1606 files to your preferred location, IPython will not move them back.
1579 1607
1580 1608
1581 1609 Preparing for Python 3.10
1582 1610 -------------------------
1583 1611
1584 1612 To prepare for Python 3.10, we have started working on removing reliance and
1585 1613 any dependency that is not compatible with Python 3.10. This includes migrating our
1586 1614 test suite to pytest and starting to remove nose. This also means that the
1587 1615 ``iptest`` command is now gone and all testing is via pytest.
1588 1616
1589 1617 This was in large part thanks to the NumFOCUS Small Developer grant, which enabled us to
1590 1618 allocate \$4000 to hire `Nikita Kniazev (@Kojoley) <https://github.com/Kojoley>`_,
1591 1619 who did a fantastic job at updating our code base, migrating to pytest, pushing
1592 1620 our coverage, and fixing a large number of bugs. I highly recommend contacting
1593 1621 them if you need help with C++ and Python projects.
1594 1622
1595 1623 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+>`__
1596 1624
1597 1625 Removing support for older Python versions
1598 1626 ------------------------------------------
1599 1627
1600 1628
1601 1629 We are removing support for Python up through 3.7, allowing internal code to use the more
1602 1630 efficient ``pathlib`` and to make better use of type annotations.
1603 1631
1604 1632 .. image:: ../_images/8.0/pathlib_pathlib_everywhere.jpg
1605 1633 :alt: "Meme image of Toy Story with Woody and Buzz, with the text 'pathlib, pathlib everywhere'"
1606 1634
1607 1635
1608 1636 We had about 34 PRs only to update some logic to update some functions from managing strings to
1609 1637 using Pathlib.
1610 1638
1611 1639 The completer has also seen significant updates and now makes use of newer Jedi APIs,
1612 1640 offering faster and more reliable tab completion.
1613 1641
1614 1642 Misc Statistics
1615 1643 ---------------
1616 1644
1617 1645 Here are some numbers::
1618 1646
1619 1647 7.x: 296 files, 12561 blank lines, 20282 comments, 35142 line of code.
1620 1648 8.0: 252 files, 12053 blank lines, 19232 comments, 34505 line of code.
1621 1649
1622 1650 $ git diff --stat 7.x...master | tail -1
1623 1651 340 files changed, 13399 insertions(+), 12421 deletions(-)
1624 1652
1625 1653 We have commits from 162 authors, who contributed 1916 commits in 23 month, excluding merges (to not bias toward
1626 1654 maintainers pushing buttons).::
1627 1655
1628 1656 $ git shortlog -s --no-merges 7.x...master | sort -nr
1629 1657 535 Matthias Bussonnier
1630 1658 86 Nikita Kniazev
1631 1659 69 Blazej Michalik
1632 1660 49 Samuel Gaist
1633 1661 27 Itamar Turner-Trauring
1634 1662 18 Spas Kalaydzhisyki
1635 1663 17 Thomas Kluyver
1636 1664 17 Quentin Peter
1637 1665 17 James Morris
1638 1666 17 Artur Svistunov
1639 1667 15 Bart Skowron
1640 1668 14 Alex Hall
1641 1669 13 rushabh-v
1642 1670 13 Terry Davis
1643 1671 13 Benjamin Ragan-Kelley
1644 1672 8 martinRenou
1645 1673 8 farisachugthai
1646 1674 7 dswij
1647 1675 7 Gal B
1648 1676 7 Corentin Cadiou
1649 1677 6 yuji96
1650 1678 6 Martin Skarzynski
1651 1679 6 Justin Palmer
1652 1680 6 Daniel Goldfarb
1653 1681 6 Ben Greiner
1654 1682 5 Sammy Al Hashemi
1655 1683 5 Paul Ivanov
1656 1684 5 Inception95
1657 1685 5 Eyenpi
1658 1686 5 Douglas Blank
1659 1687 5 Coco Mishra
1660 1688 5 Bibo Hao
1661 1689 5 AndrΓ© A. Gomes
1662 1690 5 Ahmed Fasih
1663 1691 4 takuya fujiwara
1664 1692 4 palewire
1665 1693 4 Thomas A Caswell
1666 1694 4 Talley Lambert
1667 1695 4 Scott Sanderson
1668 1696 4 Ram Rachum
1669 1697 4 Nick Muoh
1670 1698 4 Nathan Goldbaum
1671 1699 4 Mithil Poojary
1672 1700 4 Michael T
1673 1701 4 Jakub Klus
1674 1702 4 Ian Castleden
1675 1703 4 Eli Rykoff
1676 1704 4 Ashwin Vishnu
1677 1705 3 谭九鼎
1678 1706 3 sleeping
1679 1707 3 Sylvain Corlay
1680 1708 3 Peter Corke
1681 1709 3 Paul Bissex
1682 1710 3 Matthew Feickert
1683 1711 3 Fernando Perez
1684 1712 3 Eric Wieser
1685 1713 3 Daniel Mietchen
1686 1714 3 Aditya Sathe
1687 1715 3 007vedant
1688 1716 2 rchiodo
1689 1717 2 nicolaslazo
1690 1718 2 luttik
1691 1719 2 gorogoroumaru
1692 1720 2 foobarbyte
1693 1721 2 bar-hen
1694 1722 2 Theo Ouzhinski
1695 1723 2 Strawkage
1696 1724 2 Samreen Zarroug
1697 1725 2 Pete Blois
1698 1726 2 Meysam Azad
1699 1727 2 Matthieu Ancellin
1700 1728 2 Mark Schmitz
1701 1729 2 Maor Kleinberger
1702 1730 2 MRCWirtz
1703 1731 2 Lumir Balhar
1704 1732 2 Julien Rabinow
1705 1733 2 Juan Luis Cano RodrΓ­guez
1706 1734 2 Joyce Er
1707 1735 2 Jakub
1708 1736 2 Faris A Chugthai
1709 1737 2 Ethan Madden
1710 1738 2 Dimitri Papadopoulos
1711 1739 2 Diego Fernandez
1712 1740 2 Daniel Shimon
1713 1741 2 Coco Bennett
1714 1742 2 Carlos Cordoba
1715 1743 2 Boyuan Liu
1716 1744 2 BaoGiang HoangVu
1717 1745 2 Augusto
1718 1746 2 Arthur Svistunov
1719 1747 2 Arthur Moreira
1720 1748 2 Ali Nabipour
1721 1749 2 Adam Hackbarth
1722 1750 1 richard
1723 1751 1 linar-jether
1724 1752 1 lbennett
1725 1753 1 juacrumar
1726 1754 1 gpotter2
1727 1755 1 digitalvirtuoso
1728 1756 1 dalthviz
1729 1757 1 Yonatan Goldschmidt
1730 1758 1 Tomasz KΕ‚oczko
1731 1759 1 Tobias Bengfort
1732 1760 1 Timur Kushukov
1733 1761 1 Thomas
1734 1762 1 Snir Broshi
1735 1763 1 Shao Yang Hong
1736 1764 1 Sanjana-03
1737 1765 1 Romulo Filho
1738 1766 1 Rodolfo Carvalho
1739 1767 1 Richard Shadrach
1740 1768 1 Reilly Tucker Siemens
1741 1769 1 Rakessh Roshan
1742 1770 1 Piers Titus van der Torren
1743 1771 1 PhanatosZou
1744 1772 1 Pavel Safronov
1745 1773 1 Paulo S. Costa
1746 1774 1 Paul McCarthy
1747 1775 1 NotWearingPants
1748 1776 1 Naelson Douglas
1749 1777 1 Michael Tiemann
1750 1778 1 Matt Wozniski
1751 1779 1 Markus Wageringel
1752 1780 1 Marcus Wirtz
1753 1781 1 Marcio Mazza
1754 1782 1 LumΓ­r 'Frenzy' Balhar
1755 1783 1 Lightyagami1
1756 1784 1 Leon Anavi
1757 1785 1 LeafyLi
1758 1786 1 L0uisJ0shua
1759 1787 1 Kyle Cutler
1760 1788 1 Krzysztof Cybulski
1761 1789 1 Kevin Kirsche
1762 1790 1 KIU Shueng Chuan
1763 1791 1 Jonathan Slenders
1764 1792 1 Jay Qi
1765 1793 1 Jake VanderPlas
1766 1794 1 Iwan Briquemont
1767 1795 1 Hussaina Begum Nandyala
1768 1796 1 Gordon Ball
1769 1797 1 Gabriel Simonetto
1770 1798 1 Frank Tobia
1771 1799 1 Erik
1772 1800 1 Elliott Sales de Andrade
1773 1801 1 Daniel Hahler
1774 1802 1 Dan Green-Leipciger
1775 1803 1 Dan Green
1776 1804 1 Damian Yurzola
1777 1805 1 Coon, Ethan T
1778 1806 1 Carol Willing
1779 1807 1 Brian Lee
1780 1808 1 Brendan Gerrity
1781 1809 1 Blake Griffin
1782 1810 1 Bastian Ebeling
1783 1811 1 Bartosz Telenczuk
1784 1812 1 Ankitsingh6299
1785 1813 1 Andrew Port
1786 1814 1 Andrew J. Hesford
1787 1815 1 Albert Zhang
1788 1816 1 Adam Johnson
1789 1817
1790 1818 This does not, of course, represent non-code contributions, for which we are also grateful.
1791 1819
1792 1820
1793 1821 API Changes using Frappuccino
1794 1822 -----------------------------
1795 1823
1796 1824 This is an experimental exhaustive API difference using `Frappuccino <https://pypi.org/project/frappuccino/>`_
1797 1825
1798 1826
1799 1827 The following items are new in IPython 8.0 ::
1800 1828
1801 1829 + IPython.core.async_helpers.get_asyncio_loop()
1802 1830 + IPython.core.completer.Dict
1803 1831 + IPython.core.completer.Pattern
1804 1832 + IPython.core.completer.Sequence
1805 1833 + IPython.core.completer.__skip_doctest__
1806 1834 + IPython.core.debugger.Pdb.precmd(self, line)
1807 1835 + IPython.core.debugger.__skip_doctest__
1808 1836 + IPython.core.display.__getattr__(name)
1809 1837 + IPython.core.display.warn
1810 1838 + IPython.core.display_functions
1811 1839 + IPython.core.display_functions.DisplayHandle
1812 1840 + IPython.core.display_functions.DisplayHandle.display(self, obj, **kwargs)
1813 1841 + IPython.core.display_functions.DisplayHandle.update(self, obj, **kwargs)
1814 1842 + IPython.core.display_functions.__all__
1815 1843 + IPython.core.display_functions.__builtins__
1816 1844 + IPython.core.display_functions.__cached__
1817 1845 + IPython.core.display_functions.__doc__
1818 1846 + IPython.core.display_functions.__file__
1819 1847 + IPython.core.display_functions.__loader__
1820 1848 + IPython.core.display_functions.__name__
1821 1849 + IPython.core.display_functions.__package__
1822 1850 + IPython.core.display_functions.__spec__
1823 1851 + IPython.core.display_functions.b2a_hex
1824 1852 + IPython.core.display_functions.clear_output(wait=False)
1825 1853 + IPython.core.display_functions.display(*objs, include='None', exclude='None', metadata='None', transient='None', display_id='None', raw=False, clear=False, **kwargs)
1826 1854 + IPython.core.display_functions.publish_display_data(data, metadata='None', source='<deprecated>', *, transient='None', **kwargs)
1827 1855 + IPython.core.display_functions.update_display(obj, *, display_id, **kwargs)
1828 1856 + IPython.core.extensions.BUILTINS_EXTS
1829 1857 + IPython.core.inputtransformer2.has_sunken_brackets(tokens)
1830 1858 + IPython.core.interactiveshell.Callable
1831 1859 + IPython.core.interactiveshell.__annotations__
1832 1860 + IPython.core.ultratb.List
1833 1861 + IPython.core.ultratb.Tuple
1834 1862 + IPython.lib.pretty.CallExpression
1835 1863 + IPython.lib.pretty.CallExpression.factory(name)
1836 1864 + IPython.lib.pretty.RawStringLiteral
1837 1865 + IPython.lib.pretty.RawText
1838 1866 + IPython.terminal.debugger.TerminalPdb.do_interact(self, arg)
1839 1867 + IPython.terminal.embed.Set
1840 1868
1841 1869 The following items have been removed (or moved to superclass)::
1842 1870
1843 1871 - IPython.core.application.BaseIPythonApplication.initialize_subcommand
1844 1872 - IPython.core.completer.Sentinel
1845 1873 - IPython.core.completer.skip_doctest
1846 1874 - IPython.core.debugger.Tracer
1847 1875 - IPython.core.display.DisplayHandle
1848 1876 - IPython.core.display.DisplayHandle.display
1849 1877 - IPython.core.display.DisplayHandle.update
1850 1878 - IPython.core.display.b2a_hex
1851 1879 - IPython.core.display.clear_output
1852 1880 - IPython.core.display.display
1853 1881 - IPython.core.display.publish_display_data
1854 1882 - IPython.core.display.update_display
1855 1883 - IPython.core.excolors.Deprec
1856 1884 - IPython.core.excolors.ExceptionColors
1857 1885 - IPython.core.history.warn
1858 1886 - IPython.core.hooks.late_startup_hook
1859 1887 - IPython.core.hooks.pre_run_code_hook
1860 1888 - IPython.core.hooks.shutdown_hook
1861 1889 - IPython.core.interactiveshell.InteractiveShell.init_deprecation_warnings
1862 1890 - IPython.core.interactiveshell.InteractiveShell.init_readline
1863 1891 - IPython.core.interactiveshell.InteractiveShell.write
1864 1892 - IPython.core.interactiveshell.InteractiveShell.write_err
1865 1893 - IPython.core.interactiveshell.get_default_colors
1866 1894 - IPython.core.interactiveshell.removed_co_newlocals
1867 1895 - IPython.core.magics.execution.ExecutionMagics.profile_missing_notice
1868 1896 - IPython.core.magics.script.PIPE
1869 1897 - IPython.core.prefilter.PrefilterManager.init_transformers
1870 1898 - IPython.core.release.classifiers
1871 1899 - IPython.core.release.description
1872 1900 - IPython.core.release.keywords
1873 1901 - IPython.core.release.long_description
1874 1902 - IPython.core.release.name
1875 1903 - IPython.core.release.platforms
1876 1904 - IPython.core.release.url
1877 1905 - IPython.core.ultratb.VerboseTB.format_records
1878 1906 - IPython.core.ultratb.find_recursion
1879 1907 - IPython.core.ultratb.findsource
1880 1908 - IPython.core.ultratb.fix_frame_records_filenames
1881 1909 - IPython.core.ultratb.inspect_error
1882 1910 - IPython.core.ultratb.is_recursion_error
1883 1911 - IPython.core.ultratb.with_patch_inspect
1884 1912 - IPython.external.__all__
1885 1913 - IPython.external.__builtins__
1886 1914 - IPython.external.__cached__
1887 1915 - IPython.external.__doc__
1888 1916 - IPython.external.__file__
1889 1917 - IPython.external.__loader__
1890 1918 - IPython.external.__name__
1891 1919 - IPython.external.__package__
1892 1920 - IPython.external.__path__
1893 1921 - IPython.external.__spec__
1894 1922 - IPython.kernel.KernelConnectionInfo
1895 1923 - IPython.kernel.__builtins__
1896 1924 - IPython.kernel.__cached__
1897 1925 - IPython.kernel.__warningregistry__
1898 1926 - IPython.kernel.pkg
1899 1927 - IPython.kernel.protocol_version
1900 1928 - IPython.kernel.protocol_version_info
1901 1929 - IPython.kernel.src
1902 1930 - IPython.kernel.version_info
1903 1931 - IPython.kernel.warn
1904 1932 - IPython.lib.backgroundjobs
1905 1933 - IPython.lib.backgroundjobs.BackgroundJobBase
1906 1934 - IPython.lib.backgroundjobs.BackgroundJobBase.run
1907 1935 - IPython.lib.backgroundjobs.BackgroundJobBase.traceback
1908 1936 - IPython.lib.backgroundjobs.BackgroundJobExpr
1909 1937 - IPython.lib.backgroundjobs.BackgroundJobExpr.call
1910 1938 - IPython.lib.backgroundjobs.BackgroundJobFunc
1911 1939 - IPython.lib.backgroundjobs.BackgroundJobFunc.call
1912 1940 - IPython.lib.backgroundjobs.BackgroundJobManager
1913 1941 - IPython.lib.backgroundjobs.BackgroundJobManager.flush
1914 1942 - IPython.lib.backgroundjobs.BackgroundJobManager.new
1915 1943 - IPython.lib.backgroundjobs.BackgroundJobManager.remove
1916 1944 - IPython.lib.backgroundjobs.BackgroundJobManager.result
1917 1945 - IPython.lib.backgroundjobs.BackgroundJobManager.status
1918 1946 - IPython.lib.backgroundjobs.BackgroundJobManager.traceback
1919 1947 - IPython.lib.backgroundjobs.__builtins__
1920 1948 - IPython.lib.backgroundjobs.__cached__
1921 1949 - IPython.lib.backgroundjobs.__doc__
1922 1950 - IPython.lib.backgroundjobs.__file__
1923 1951 - IPython.lib.backgroundjobs.__loader__
1924 1952 - IPython.lib.backgroundjobs.__name__
1925 1953 - IPython.lib.backgroundjobs.__package__
1926 1954 - IPython.lib.backgroundjobs.__spec__
1927 1955 - IPython.lib.kernel.__builtins__
1928 1956 - IPython.lib.kernel.__cached__
1929 1957 - IPython.lib.kernel.__doc__
1930 1958 - IPython.lib.kernel.__file__
1931 1959 - IPython.lib.kernel.__loader__
1932 1960 - IPython.lib.kernel.__name__
1933 1961 - IPython.lib.kernel.__package__
1934 1962 - IPython.lib.kernel.__spec__
1935 1963 - IPython.lib.kernel.__warningregistry__
1936 1964 - IPython.paths.fs_encoding
1937 1965 - IPython.terminal.debugger.DEFAULT_BUFFER
1938 1966 - IPython.terminal.debugger.cursor_in_leading_ws
1939 1967 - IPython.terminal.debugger.emacs_insert_mode
1940 1968 - IPython.terminal.debugger.has_selection
1941 1969 - IPython.terminal.debugger.vi_insert_mode
1942 1970 - IPython.terminal.interactiveshell.DISPLAY_BANNER_DEPRECATED
1943 1971 - IPython.terminal.ipapp.TerminalIPythonApp.parse_command_line
1944 1972 - IPython.testing.test
1945 1973 - IPython.utils.contexts.NoOpContext
1946 1974 - IPython.utils.io.IOStream
1947 1975 - IPython.utils.io.IOStream.close
1948 1976 - IPython.utils.io.IOStream.write
1949 1977 - IPython.utils.io.IOStream.writelines
1950 1978 - IPython.utils.io.__warningregistry__
1951 1979 - IPython.utils.io.atomic_writing
1952 1980 - IPython.utils.io.stderr
1953 1981 - IPython.utils.io.stdin
1954 1982 - IPython.utils.io.stdout
1955 1983 - IPython.utils.io.unicode_std_stream
1956 1984 - IPython.utils.path.get_ipython_cache_dir
1957 1985 - IPython.utils.path.get_ipython_dir
1958 1986 - IPython.utils.path.get_ipython_module_path
1959 1987 - IPython.utils.path.get_ipython_package_dir
1960 1988 - IPython.utils.path.locate_profile
1961 1989 - IPython.utils.path.unquote_filename
1962 1990 - IPython.utils.py3compat.PY2
1963 1991 - IPython.utils.py3compat.PY3
1964 1992 - IPython.utils.py3compat.buffer_to_bytes
1965 1993 - IPython.utils.py3compat.builtin_mod_name
1966 1994 - IPython.utils.py3compat.cast_bytes
1967 1995 - IPython.utils.py3compat.getcwd
1968 1996 - IPython.utils.py3compat.isidentifier
1969 1997 - IPython.utils.py3compat.u_format
1970 1998
1971 1999 The following signatures differ between 7.x and 8.0::
1972 2000
1973 2001 - IPython.core.completer.IPCompleter.unicode_name_matches(self, text)
1974 2002 + IPython.core.completer.IPCompleter.unicode_name_matches(text)
1975 2003
1976 2004 - IPython.core.completer.match_dict_keys(keys, prefix, delims)
1977 2005 + IPython.core.completer.match_dict_keys(keys, prefix, delims, extra_prefix='None')
1978 2006
1979 2007 - IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0)
1980 2008 + IPython.core.interactiveshell.InteractiveShell.object_inspect_mime(self, oname, detail_level=0, omit_sections='()')
1981 2009
1982 2010 - IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None', _warn_deprecated=True)
1983 2011 + IPython.core.interactiveshell.InteractiveShell.set_hook(self, name, hook, priority=50, str_key='None', re_key='None')
1984 2012
1985 2013 - IPython.core.oinspect.Inspector.info(self, obj, oname='', formatter='None', info='None', detail_level=0)
1986 2014 + IPython.core.oinspect.Inspector.info(self, obj, oname='', info='None', detail_level=0)
1987 2015
1988 2016 - IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True)
1989 2017 + IPython.core.oinspect.Inspector.pinfo(self, obj, oname='', formatter='None', info='None', detail_level=0, enable_html_pager=True, omit_sections='()')
1990 2018
1991 2019 - IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path='None', overwrite=False)
1992 2020 + IPython.core.profiledir.ProfileDir.copy_config_file(self, config_file, path, overwrite=False)
1993 2021
1994 2022 - IPython.core.ultratb.VerboseTB.format_record(self, frame, file, lnum, func, lines, index)
1995 2023 + IPython.core.ultratb.VerboseTB.format_record(self, frame_info)
1996 2024
1997 2025 - IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, display_banner='None', global_ns='None', compile_flags='None')
1998 2026 + IPython.terminal.embed.InteractiveShellEmbed.mainloop(self, local_ns='None', module='None', stack_depth=0, compile_flags='None')
1999 2027
2000 2028 - IPython.terminal.embed.embed(**kwargs)
2001 2029 + IPython.terminal.embed.embed(*, header='', compile_flags='None', **kwargs)
2002 2030
2003 2031 - IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self, display_banner='<object object at 0xffffff>')
2004 2032 + IPython.terminal.interactiveshell.TerminalInteractiveShell.interact(self)
2005 2033
2006 2034 - IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self, display_banner='<object object at 0xffffff>')
2007 2035 + IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop(self)
2008 2036
2009 2037 - IPython.utils.path.get_py_filename(name, force_win32='None')
2010 2038 + IPython.utils.path.get_py_filename(name)
2011 2039
2012 2040 The following are new attributes (that might be inherited)::
2013 2041
2014 2042 + IPython.core.completer.IPCompleter.unicode_names
2015 2043 + IPython.core.debugger.InterruptiblePdb.precmd
2016 2044 + IPython.core.debugger.Pdb.precmd
2017 2045 + IPython.core.ultratb.AutoFormattedTB.has_colors
2018 2046 + IPython.core.ultratb.ColorTB.has_colors
2019 2047 + IPython.core.ultratb.FormattedTB.has_colors
2020 2048 + IPython.core.ultratb.ListTB.has_colors
2021 2049 + IPython.core.ultratb.SyntaxTB.has_colors
2022 2050 + IPython.core.ultratb.TBTools.has_colors
2023 2051 + IPython.core.ultratb.VerboseTB.has_colors
2024 2052 + IPython.terminal.debugger.TerminalPdb.do_interact
2025 2053 + IPython.terminal.debugger.TerminalPdb.precmd
2026 2054
2027 2055 The following attribute/methods have been removed::
2028 2056
2029 2057 - IPython.core.application.BaseIPythonApplication.deprecated_subcommands
2030 2058 - IPython.core.ultratb.AutoFormattedTB.format_records
2031 2059 - IPython.core.ultratb.ColorTB.format_records
2032 2060 - IPython.core.ultratb.FormattedTB.format_records
2033 2061 - IPython.terminal.embed.InteractiveShellEmbed.init_deprecation_warnings
2034 2062 - IPython.terminal.embed.InteractiveShellEmbed.init_readline
2035 2063 - IPython.terminal.embed.InteractiveShellEmbed.write
2036 2064 - IPython.terminal.embed.InteractiveShellEmbed.write_err
2037 2065 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_deprecation_warnings
2038 2066 - IPython.terminal.interactiveshell.TerminalInteractiveShell.init_readline
2039 2067 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write
2040 2068 - IPython.terminal.interactiveshell.TerminalInteractiveShell.write_err
2041 2069 - IPython.terminal.ipapp.LocateIPythonApp.deprecated_subcommands
2042 2070 - IPython.terminal.ipapp.LocateIPythonApp.initialize_subcommand
2043 2071 - IPython.terminal.ipapp.TerminalIPythonApp.deprecated_subcommands
2044 2072 - IPython.terminal.ipapp.TerminalIPythonApp.initialize_subcommand
General Comments 0
You need to be logged in to leave comments. Login now