1**************************** 2 What's New In Python 3.8 3**************************** 4 5.. Rules for maintenance: 6 7 * Anyone can add text to this document. Do not spend very much time 8 on the wording of your changes, because your text will probably 9 get rewritten to some degree. 10 11 * The maintainer will go through Misc/NEWS periodically and add 12 changes; it's therefore more important to add your changes to 13 Misc/NEWS than to this file. 14 15 * This is not a complete list of every single change; completeness 16 is the purpose of Misc/NEWS. Some changes I consider too small 17 or esoteric to include. If such a change is added to the text, 18 I'll just remove it. (This is another reason you shouldn't spend 19 too much time on writing your addition.) 20 21 * If you want to draw your new text to the attention of the 22 maintainer, add 'XXX' to the beginning of the paragraph or 23 section. 24 25 * It's OK to just add a fragmentary note about a change. For 26 example: "XXX Describe the transmogrify() function added to the 27 socket module." The maintainer will research the change and 28 write the necessary text. 29 30 * You can comment out your additions if you like, but it's not 31 necessary (especially when a final release is some months away). 32 33 * Credit the author of a patch or bugfix. Just the name is 34 sufficient; the e-mail address isn't necessary. 35 36 * It's helpful to add the bug/patch number as a comment: 37 38 XXX Describe the transmogrify() function added to the socket 39 module. 40 (Contributed by P.Y. Developer in :issue:`12345`.) 41 42 This saves the maintainer the effort of going through the Git log 43 when researching a change. 44 45:Editor: Raymond Hettinger 46 47This article explains the new features in Python 3.8, compared to 3.7. 48For full details, see the :ref:`changelog <changelog>`. 49 50.. testsetup:: 51 52 from datetime import date 53 from math import cos, radians 54 from unicodedata import normalize 55 import re 56 import math 57 58 59Summary -- Release highlights 60============================= 61 62.. This section singles out the most important changes in Python 3.8. 63 Brevity is key. 64 65 66.. PEP-sized items next. 67 68 69 70New Features 71============ 72 73Assignment expressions 74---------------------- 75 76There is new syntax ``:=`` that assigns values to variables as part of a larger 77expression. It is affectionately known as "the walrus operator" due to 78its resemblance to `the eyes and tusks of a walrus 79<https://en.wikipedia.org/wiki/Walrus#/media/File:Pacific_Walrus_-_Bull_(8247646168).jpg>`_. 80 81In this example, the assignment expression helps avoid calling 82:func:`len` twice:: 83 84 if (n := len(a)) > 10: 85 print(f"List is too long ({n} elements, expected <= 10)") 86 87A similar benefit arises during regular expression matching where 88match objects are needed twice, once to test whether a match 89occurred and another to extract a subgroup:: 90 91 discount = 0.0 92 if (mo := re.search(r'(\d+)% discount', advertisement)): 93 discount = float(mo.group(1)) / 100.0 94 95The operator is also useful with while-loops that compute 96a value to test loop termination and then need that same 97value again in the body of the loop:: 98 99 # Loop over fixed length blocks 100 while (block := f.read(256)) != '': 101 process(block) 102 103Another motivating use case arises in list comprehensions where 104a value computed in a filtering condition is also needed in 105the expression body:: 106 107 [clean_name.title() for name in names 108 if (clean_name := normalize('NFC', name)) in allowed_names] 109 110Try to limit use of the walrus operator to clean cases that reduce 111complexity and improve readability. 112 113See :pep:`572` for a full description. 114 115(Contributed by Emily Morehouse in :issue:`35224`.) 116 117 118Positional-only parameters 119-------------------------- 120 121There is a new function parameter syntax ``/`` to indicate that some 122function parameters must be specified positionally and cannot be used as 123keyword arguments. This is the same notation shown by ``help()`` for C 124functions annotated with Larry Hastings' `Argument Clinic 125<https://docs.python.org/3/howto/clinic.html>`_ tool. 126 127In the following example, parameters *a* and *b* are positional-only, 128while *c* or *d* can be positional or keyword, and *e* or *f* are 129required to be keywords:: 130 131 def f(a, b, /, c, d, *, e, f): 132 print(a, b, c, d, e, f) 133 134The following is a valid call:: 135 136 f(10, 20, 30, d=40, e=50, f=60) 137 138However, these are invalid calls:: 139 140 f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument 141 f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument 142 143One use case for this notation is that it allows pure Python functions 144to fully emulate behaviors of existing C coded functions. For example, 145the built-in :func:`divmod` function does not accept keyword arguments:: 146 147 def divmod(a, b, /): 148 "Emulate the built in divmod() function" 149 return (a // b, a % b) 150 151Another use case is to preclude keyword arguments when the parameter 152name is not helpful. For example, the builtin :func:`len` function has 153the signature ``len(obj, /)``. This precludes awkward calls such as:: 154 155 len(obj='hello') # The "obj" keyword argument impairs readability 156 157A further benefit of marking a parameter as positional-only is that it 158allows the parameter name to be changed in the future without risk of 159breaking client code. For example, in the :mod:`statistics` module, the 160parameter name *dist* may be changed in the future. This was made 161possible with the following function specification:: 162 163 def quantiles(dist, /, *, n=4, method='exclusive') 164 ... 165 166Since the parameters to the left of ``/`` are not exposed as possible 167keywords, the parameters names remain available for use in ``**kwargs``:: 168 169 >>> def f(a, b, /, **kwargs): 170 ... print(a, b, kwargs) 171 ... 172 >>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways 173 10 20 {'a': 1, 'b': 2, 'c': 3} 174 175This greatly simplifies the implementation of functions and methods 176that need to accept arbitrary keyword arguments. For example, here 177is an excerpt from code in the :mod:`collections` module:: 178 179 class Counter(dict): 180 181 def __init__(self, iterable=None, /, **kwds): 182 # Note "iterable" is a possible keyword argument 183 184See :pep:`570` for a full description. 185 186(Contributed by Pablo Galindo in :issue:`36540`.) 187 188.. TODO: Pablo will sprint on docs at PyCon US 2019. 189 190 191Parallel filesystem cache for compiled bytecode files 192----------------------------------------------------- 193 194The new :envvar:`PYTHONPYCACHEPREFIX` setting (also available as 195:option:`-X` ``pycache_prefix``) configures the implicit bytecode 196cache to use a separate parallel filesystem tree, rather than 197the default ``__pycache__`` subdirectories within each source 198directory. 199 200The location of the cache is reported in :data:`sys.pycache_prefix` 201(:const:`None` indicates the default location in ``__pycache__`` 202subdirectories). 203 204(Contributed by Carl Meyer in :issue:`33499`.) 205 206 207Debug build uses the same ABI as release build 208----------------------------------------------- 209 210Python now uses the same ABI whether it's built in release or debug mode. On 211Unix, when Python is built in debug mode, it is now possible to load C 212extensions built in release mode and C extensions built using the stable ABI. 213 214Release builds and :ref:`debug builds <debug-build>` are now ABI compatible: defining the 215``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro, which 216introduces the only ABI incompatibility. The ``Py_TRACE_REFS`` macro, which 217adds the :func:`sys.getobjects` function and the :envvar:`PYTHONDUMPREFS` 218environment variable, can be set using the new :option:`./configure 219--with-trace-refs <--with-trace-refs>` build option. 220(Contributed by Victor Stinner in :issue:`36465`.) 221 222On Unix, C extensions are no longer linked to libpython except on Android 223and Cygwin. 224It is now possible 225for a statically linked Python to load a C extension built using a shared 226library Python. 227(Contributed by Victor Stinner in :issue:`21536`.) 228 229On Unix, when Python is built in debug mode, import now also looks for C 230extensions compiled in release mode and for C extensions compiled with the 231stable ABI. 232(Contributed by Victor Stinner in :issue:`36722`.) 233 234To embed Python into an application, a new ``--embed`` option must be passed to 235``python3-config --libs --embed`` to get ``-lpython3.8`` (link the application 236to libpython). To support both 3.8 and older, try ``python3-config --libs 237--embed`` first and fallback to ``python3-config --libs`` (without ``--embed``) 238if the previous command fails. 239 240Add a pkg-config ``python-3.8-embed`` module to embed Python into an 241application: ``pkg-config python-3.8-embed --libs`` includes ``-lpython3.8``. 242To support both 3.8 and older, try ``pkg-config python-X.Y-embed --libs`` first 243and fallback to ``pkg-config python-X.Y --libs`` (without ``--embed``) if the 244previous command fails (replace ``X.Y`` with the Python version). 245 246On the other hand, ``pkg-config python3.8 --libs`` no longer contains 247``-lpython3.8``. C extensions must not be linked to libpython (except on 248Android and Cygwin, whose cases are handled by the script); 249this change is backward incompatible on purpose. 250(Contributed by Victor Stinner in :issue:`36721`.) 251 252 253f-strings support ``=`` for self-documenting expressions and debugging 254---------------------------------------------------------------------- 255 256Added an ``=`` specifier to :term:`f-string`\s. An f-string such as 257``f'{expr=}'`` will expand to the text of the expression, an equal sign, 258then the representation of the evaluated expression. For example: 259 260 >>> user = 'eric_idle' 261 >>> member_since = date(1975, 7, 31) 262 >>> f'{user=} {member_since=}' 263 "user='eric_idle' member_since=datetime.date(1975, 7, 31)" 264 265The usual :ref:`f-string format specifiers <f-strings>` allow more 266control over how the result of the expression is displayed:: 267 268 >>> delta = date.today() - member_since 269 >>> f'{user=!s} {delta.days=:,d}' 270 'user=eric_idle delta.days=16,075' 271 272The ``=`` specifier will display the whole expression so that 273calculations can be shown:: 274 275 >>> print(f'{theta=} {cos(radians(theta))=:.3f}') 276 theta=30 cos(radians(theta))=0.866 277 278(Contributed by Eric V. Smith and Larry Hastings in :issue:`36817`.) 279 280 281PEP 578: Python Runtime Audit Hooks 282----------------------------------- 283 284The PEP adds an Audit Hook and Verified Open Hook. Both are available from 285Python and native code, allowing applications and frameworks written in pure 286Python code to take advantage of extra notifications, while also allowing 287embedders or system administrators to deploy builds of Python where auditing is 288always enabled. 289 290See :pep:`578` for full details. 291 292 293PEP 587: Python Initialization Configuration 294-------------------------------------------- 295 296The :pep:`587` adds a new C API to configure the Python Initialization 297providing finer control on the whole configuration and better error reporting. 298 299New structures: 300 301* :c:type:`PyConfig` 302* :c:type:`PyPreConfig` 303* :c:type:`PyStatus` 304* :c:type:`PyWideStringList` 305 306New functions: 307 308* :c:func:`PyConfig_Clear` 309* :c:func:`PyConfig_InitIsolatedConfig` 310* :c:func:`PyConfig_InitPythonConfig` 311* :c:func:`PyConfig_Read` 312* :c:func:`PyConfig_SetArgv` 313* :c:func:`PyConfig_SetBytesArgv` 314* :c:func:`PyConfig_SetBytesString` 315* :c:func:`PyConfig_SetString` 316* :c:func:`PyPreConfig_InitIsolatedConfig` 317* :c:func:`PyPreConfig_InitPythonConfig` 318* :c:func:`PyStatus_Error` 319* :c:func:`PyStatus_Exception` 320* :c:func:`PyStatus_Exit` 321* :c:func:`PyStatus_IsError` 322* :c:func:`PyStatus_IsExit` 323* :c:func:`PyStatus_NoMemory` 324* :c:func:`PyStatus_Ok` 325* :c:func:`PyWideStringList_Append` 326* :c:func:`PyWideStringList_Insert` 327* :c:func:`Py_BytesMain` 328* :c:func:`Py_ExitStatusException` 329* :c:func:`Py_InitializeFromConfig` 330* :c:func:`Py_PreInitialize` 331* :c:func:`Py_PreInitializeFromArgs` 332* :c:func:`Py_PreInitializeFromBytesArgs` 333* :c:func:`Py_RunMain` 334 335This PEP also adds ``_PyRuntimeState.preconfig`` (:c:type:`PyPreConfig` type) 336and ``PyInterpreterState.config`` (:c:type:`PyConfig` type) fields to these 337internal structures. ``PyInterpreterState.config`` becomes the new 338reference configuration, replacing global configuration variables and 339other private variables. 340 341See :ref:`Python Initialization Configuration <init-config>` for the 342documentation. 343 344See :pep:`587` for a full description. 345 346(Contributed by Victor Stinner in :issue:`36763`.) 347 348 349PEP 590: Vectorcall: a fast calling protocol for CPython 350-------------------------------------------------------- 351 352:ref:`vectorcall` is added to the Python/C API. 353It is meant to formalize existing optimizations which were already done 354for various classes. 355Any :ref:`static type <static-types>` implementing a callable can use this 356protocol. 357 358This is currently provisional. 359The aim is to make it fully public in Python 3.9. 360 361See :pep:`590` for a full description. 362 363(Contributed by Jeroen Demeyer, Mark Shannon and Petr Viktorin in :issue:`36974`.) 364 365 366Pickle protocol 5 with out-of-band data buffers 367----------------------------------------------- 368 369When :mod:`pickle` is used to transfer large data between Python processes 370in order to take advantage of multi-core or multi-machine processing, 371it is important to optimize the transfer by reducing memory copies, and 372possibly by applying custom techniques such as data-dependent compression. 373 374The :mod:`pickle` protocol 5 introduces support for out-of-band buffers 375where :pep:`3118`-compatible data can be transmitted separately from the 376main pickle stream, at the discretion of the communication layer. 377 378See :pep:`574` for a full description. 379 380(Contributed by Antoine Pitrou in :issue:`36785`.) 381 382 383Other Language Changes 384====================== 385 386* A :keyword:`continue` statement was illegal in the :keyword:`finally` clause 387 due to a problem with the implementation. In Python 3.8 this restriction 388 was lifted. 389 (Contributed by Serhiy Storchaka in :issue:`32489`.) 390 391* The :class:`bool`, :class:`int`, and :class:`fractions.Fraction` types 392 now have an :meth:`~int.as_integer_ratio` method like that found in 393 :class:`float` and :class:`decimal.Decimal`. This minor API extension 394 makes it possible to write ``numerator, denominator = 395 x.as_integer_ratio()`` and have it work across multiple numeric types. 396 (Contributed by Lisa Roach in :issue:`33073` and Raymond Hettinger in 397 :issue:`37819`.) 398 399* Constructors of :class:`int`, :class:`float` and :class:`complex` will now 400 use the :meth:`~object.__index__` special method, if available and the 401 corresponding method :meth:`~object.__int__`, :meth:`~object.__float__` 402 or :meth:`~object.__complex__` is not available. 403 (Contributed by Serhiy Storchaka in :issue:`20092`.) 404 405* Added support of ``\N{name}`` escapes in :mod:`regular expressions <re>`:: 406 407 >>> notice = 'Copyright © 2019' 408 >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') 409 >>> int(copyright_year_pattern.search(notice).group(1)) 410 2019 411 412 (Contributed by Jonathan Eunice and Serhiy Storchaka in :issue:`30688`.) 413 414* Dict and dictviews are now iterable in reversed insertion order using 415 :func:`reversed`. (Contributed by Rémi Lapeyre in :issue:`33462`.) 416 417* The syntax allowed for keyword names in function calls was further 418 restricted. In particular, ``f((keyword)=arg)`` is no longer allowed. It was 419 never intended to permit more than a bare name on the left-hand side of a 420 keyword argument assignment term. 421 (Contributed by Benjamin Peterson in :issue:`34641`.) 422 423* Generalized iterable unpacking in :keyword:`yield` and 424 :keyword:`return` statements no longer requires enclosing parentheses. 425 This brings the *yield* and *return* syntax into better agreement with 426 normal assignment syntax:: 427 428 >>> def parse(family): 429 lastname, *members = family.split() 430 return lastname.upper(), *members 431 432 >>> parse('simpsons homer marge bart lisa maggie') 433 ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'maggie') 434 435 (Contributed by David Cuthbert and Jordan Chapman in :issue:`32117`.) 436 437* When a comma is missed in code such as ``[(10, 20) (30, 40)]``, the 438 compiler displays a :exc:`SyntaxWarning` with a helpful suggestion. 439 This improves on just having a :exc:`TypeError` indicating that the 440 first tuple was not callable. (Contributed by Serhiy Storchaka in 441 :issue:`15248`.) 442 443* Arithmetic operations between subclasses of :class:`datetime.date` or 444 :class:`datetime.datetime` and :class:`datetime.timedelta` objects now return 445 an instance of the subclass, rather than the base class. This also affects 446 the return type of operations whose implementation (directly or indirectly) 447 uses :class:`datetime.timedelta` arithmetic, such as 448 :meth:`~datetime.datetime.astimezone`. 449 (Contributed by Paul Ganssle in :issue:`32417`.) 450 451* When the Python interpreter is interrupted by Ctrl-C (SIGINT) and the 452 resulting :exc:`KeyboardInterrupt` exception is not caught, the Python process 453 now exits via a SIGINT signal or with the correct exit code such that the 454 calling process can detect that it died due to a Ctrl-C. Shells on POSIX 455 and Windows use this to properly terminate scripts in interactive sessions. 456 (Contributed by Google via Gregory P. Smith in :issue:`1054041`.) 457 458* Some advanced styles of programming require updating the 459 :class:`types.CodeType` object for an existing function. Since code 460 objects are immutable, a new code object needs to be created, one 461 that is modeled on the existing code object. With 19 parameters, 462 this was somewhat tedious. Now, the new ``replace()`` method makes 463 it possible to create a clone with a few altered parameters. 464 465 Here's an example that alters the :func:`statistics.mean` function to 466 prevent the *data* parameter from being used as a keyword argument:: 467 468 >>> from statistics import mean 469 >>> mean(data=[10, 20, 90]) 470 40 471 >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1) 472 >>> mean(data=[10, 20, 90]) 473 Traceback (most recent call last): 474 ... 475 TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data' 476 477 (Contributed by Victor Stinner in :issue:`37032`.) 478 479* For integers, the three-argument form of the :func:`pow` function now 480 permits the exponent to be negative in the case where the base is 481 relatively prime to the modulus. It then computes a modular inverse to 482 the base when the exponent is ``-1``, and a suitable power of that 483 inverse for other negative exponents. For example, to compute the 484 `modular multiplicative inverse 485 <https://en.wikipedia.org/wiki/Modular_multiplicative_inverse>`_ of 38 486 modulo 137, write:: 487 488 >>> pow(38, -1, 137) 489 119 490 >>> 119 * 38 % 137 491 1 492 493 Modular inverses arise in the solution of `linear Diophantine 494 equations <https://en.wikipedia.org/wiki/Diophantine_equation>`_. 495 For example, to find integer solutions for ``4258 + 147 = 369``, 496 first rewrite as ``4258 ≡ 369 (mod 147)`` then solve: 497 498 >>> x = 369 * pow(4258, -1, 147) % 147 499 >>> y = (4258 * x - 369) // -147 500 >>> 4258 * x + 147 * y 501 369 502 503 (Contributed by Mark Dickinson in :issue:`36027`.) 504 505* Dict comprehensions have been synced-up with dict literals so that the 506 key is computed first and the value second:: 507 508 >>> # Dict comprehension 509 >>> cast = {input('role? '): input('actor? ') for i in range(2)} 510 role? King Arthur 511 actor? Chapman 512 role? Black Knight 513 actor? Cleese 514 515 >>> # Dict literal 516 >>> cast = {input('role? '): input('actor? ')} 517 role? Sir Robin 518 actor? Eric Idle 519 520 The guaranteed execution order is helpful with assignment expressions 521 because variables assigned in the key expression will be available in 522 the value expression:: 523 524 >>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald'] 525 >>> {(n := normalize('NFC', name)).casefold() : n for name in names} 526 {'martin von löwis': 'Martin von Löwis', 527 'łukasz langa': 'Łukasz Langa', 528 'walter dörwald': 'Walter Dörwald'} 529 530 (Contributed by Jörn Heissler in :issue:`35224`.) 531 532* The :meth:`object.__reduce__` method can now return a tuple from two to 533 six elements long. Formerly, five was the limit. The new, optional sixth 534 element is a callable with a ``(obj, state)`` signature. This allows the 535 direct control over the state-updating behavior of a specific object. If 536 not *None*, this callable will have priority over the object's 537 :meth:`~__setstate__` method. 538 (Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`.) 539 540New Modules 541=========== 542 543* The new :mod:`importlib.metadata` module provides (provisional) support for 544 reading metadata from third-party packages. For example, it can extract an 545 installed package's version number, list of entry points, and more:: 546 547 >>> # Note following example requires that the popular "requests" 548 >>> # package has been installed. 549 >>> 550 >>> from importlib.metadata import version, requires, files 551 >>> version('requests') 552 '2.22.0' 553 >>> list(requires('requests')) 554 ['chardet (<3.1.0,>=3.0.2)'] 555 >>> list(files('requests'))[:5] 556 [PackagePath('requests-2.22.0.dist-info/INSTALLER'), 557 PackagePath('requests-2.22.0.dist-info/LICENSE'), 558 PackagePath('requests-2.22.0.dist-info/METADATA'), 559 PackagePath('requests-2.22.0.dist-info/RECORD'), 560 PackagePath('requests-2.22.0.dist-info/WHEEL')] 561 562 (Contributed by Barry Warsaw and Jason R. Coombs in :issue:`34632`.) 563 564 565Improved Modules 566================ 567 568ast 569--- 570 571AST nodes now have ``end_lineno`` and ``end_col_offset`` attributes, 572which give the precise location of the end of the node. (This only 573applies to nodes that have ``lineno`` and ``col_offset`` attributes.) 574 575New function :func:`ast.get_source_segment` returns the source code 576for a specific AST node. 577 578(Contributed by Ivan Levkivskyi in :issue:`33416`.) 579 580The :func:`ast.parse` function has some new flags: 581 582* ``type_comments=True`` causes it to return the text of :pep:`484` and 583 :pep:`526` type comments associated with certain AST nodes; 584 585* ``mode='func_type'`` can be used to parse :pep:`484` "signature type 586 comments" (returned for function definition AST nodes); 587 588* ``feature_version=(3, N)`` allows specifying an earlier Python 3 589 version. For example, ``feature_version=(3, 4)`` will treat 590 :keyword:`async` and :keyword:`await` as non-reserved words. 591 592(Contributed by Guido van Rossum in :issue:`35766`.) 593 594 595asyncio 596------- 597 598:func:`asyncio.run` has graduated from the provisional to stable API. This 599function can be used to execute a :term:`coroutine` and return the result while 600automatically managing the event loop. For example:: 601 602 import asyncio 603 604 async def main(): 605 await asyncio.sleep(0) 606 return 42 607 608 asyncio.run(main()) 609 610This is *roughly* equivalent to:: 611 612 import asyncio 613 614 async def main(): 615 await asyncio.sleep(0) 616 return 42 617 618 loop = asyncio.new_event_loop() 619 asyncio.set_event_loop(loop) 620 try: 621 loop.run_until_complete(main()) 622 finally: 623 asyncio.set_event_loop(None) 624 loop.close() 625 626 627The actual implementation is significantly more complex. Thus, 628:func:`asyncio.run` should be the preferred way of running asyncio programs. 629 630(Contributed by Yury Selivanov in :issue:`32314`.) 631 632Running ``python -m asyncio`` launches a natively async REPL. This allows rapid 633experimentation with code that has a top-level :keyword:`await`. There is no 634longer a need to directly call ``asyncio.run()`` which would spawn a new event 635loop on every invocation: 636 637.. code-block:: none 638 639 $ python -m asyncio 640 asyncio REPL 3.8.0 641 Use "await" directly instead of "asyncio.run()". 642 Type "help", "copyright", "credits" or "license" for more information. 643 >>> import asyncio 644 >>> await asyncio.sleep(10, result='hello') 645 hello 646 647(Contributed by Yury Selivanov in :issue:`37028`.) 648 649The exception :class:`asyncio.CancelledError` now inherits from 650:class:`BaseException` rather than :class:`Exception` and no longer inherits 651from :class:`concurrent.futures.CancelledError`. 652(Contributed by Yury Selivanov in :issue:`32528`.) 653 654On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. 655(Contributed by Victor Stinner in :issue:`34687`.) 656 657:class:`~asyncio.ProactorEventLoop` now also supports UDP. 658(Contributed by Adam Meily and Andrew Svetlov in :issue:`29883`.) 659 660:class:`~asyncio.ProactorEventLoop` can now be interrupted by 661:exc:`KeyboardInterrupt` ("CTRL+C"). 662(Contributed by Vladimir Matveev in :issue:`23057`.) 663 664Added :meth:`asyncio.Task.get_coro` for getting the wrapped coroutine 665within an :class:`asyncio.Task`. 666(Contributed by Alex Grönholm in :issue:`36999`.) 667 668Asyncio tasks can now be named, either by passing the ``name`` keyword 669argument to :func:`asyncio.create_task` or 670the :meth:`~asyncio.loop.create_task` event loop method, or by 671calling the :meth:`~asyncio.Task.set_name` method on the task object. The 672task name is visible in the ``repr()`` output of :class:`asyncio.Task` and 673can also be retrieved using the :meth:`~asyncio.Task.get_name` method. 674(Contributed by Alex Grönholm in :issue:`34270`.) 675 676Added support for 677`Happy Eyeballs <https://en.wikipedia.org/wiki/Happy_Eyeballs>`_ to 678:func:`asyncio.loop.create_connection`. To specify the behavior, two new 679parameters have been added: *happy_eyeballs_delay* and *interleave*. The Happy 680Eyeballs algorithm improves responsiveness in applications that support IPv4 681and IPv6 by attempting to simultaneously connect using both. 682(Contributed by twisteroid ambassador in :issue:`33530`.) 683 684 685builtins 686-------- 687 688The :func:`compile` built-in has been improved to accept the 689``ast.PyCF_ALLOW_TOP_LEVEL_AWAIT`` flag. With this new flag passed, 690:func:`compile` will allow top-level ``await``, ``async for`` and ``async with`` 691constructs that are usually considered invalid syntax. Asynchronous code object 692marked with the ``CO_COROUTINE`` flag may then be returned. 693(Contributed by Matthias Bussonnier in :issue:`34616`) 694 695 696collections 697----------- 698 699The :meth:`~collections.somenamedtuple._asdict` method for 700:func:`collections.namedtuple` now returns a :class:`dict` instead of a 701:class:`collections.OrderedDict`. This works because regular dicts have 702guaranteed ordering since Python 3.7. If the extra features of 703:class:`OrderedDict` are required, the suggested remediation is to cast the 704result to the desired type: ``OrderedDict(nt._asdict())``. 705(Contributed by Raymond Hettinger in :issue:`35864`.) 706 707 708cProfile 709-------- 710 711The :class:`cProfile.Profile <profile.Profile>` class can now be used as a context manager. 712Profile a block of code by running:: 713 714 import cProfile 715 716 with cProfile.Profile() as profiler: 717 # code to be profiled 718 ... 719 720(Contributed by Scott Sanderson in :issue:`29235`.) 721 722 723csv 724--- 725 726The :class:`csv.DictReader` now returns instances of :class:`dict` instead of 727a :class:`collections.OrderedDict`. The tool is now faster and uses less 728memory while still preserving the field order. 729(Contributed by Michael Selik in :issue:`34003`.) 730 731 732curses 733------- 734 735Added a new variable holding structured version information for the 736underlying ncurses library: :data:`~curses.ncurses_version`. 737(Contributed by Serhiy Storchaka in :issue:`31680`.) 738 739 740ctypes 741------ 742 743On Windows, :class:`~ctypes.CDLL` and subclasses now accept a *winmode* parameter 744to specify flags for the underlying ``LoadLibraryEx`` call. The default flags are 745set to only load DLL dependencies from trusted locations, including the path 746where the DLL is stored (if a full or partial path is used to load the initial 747DLL) and paths added by :func:`~os.add_dll_directory`. 748(Contributed by Steve Dower in :issue:`36085`.) 749 750 751datetime 752-------- 753 754Added new alternate constructors :meth:`datetime.date.fromisocalendar` and 755:meth:`datetime.datetime.fromisocalendar`, which construct :class:`date` and 756:class:`datetime` objects respectively from ISO year, week number, and weekday; 757these are the inverse of each class's ``isocalendar`` method. 758(Contributed by Paul Ganssle in :issue:`36004`.) 759 760 761functools 762--------- 763 764:func:`functools.lru_cache` can now be used as a straight decorator rather 765than as a function returning a decorator. So both of these are now supported:: 766 767 @lru_cache 768 def f(x): 769 ... 770 771 @lru_cache(maxsize=256) 772 def f(x): 773 ... 774 775(Contributed by Raymond Hettinger in :issue:`36772`.) 776 777Added a new :func:`functools.cached_property` decorator, for computed properties 778cached for the life of the instance. :: 779 780 import functools 781 import statistics 782 783 class Dataset: 784 def __init__(self, sequence_of_numbers): 785 self.data = sequence_of_numbers 786 787 @functools.cached_property 788 def variance(self): 789 return statistics.variance(self.data) 790 791(Contributed by Carl Meyer in :issue:`21145`) 792 793 794Added a new :func:`functools.singledispatchmethod` decorator that converts 795methods into :term:`generic functions <generic function>` using 796:term:`single dispatch`:: 797 798 from functools import singledispatchmethod 799 from contextlib import suppress 800 801 class TaskManager: 802 803 def __init__(self, tasks): 804 self.tasks = list(tasks) 805 806 @singledispatchmethod 807 def discard(self, value): 808 with suppress(ValueError): 809 self.tasks.remove(value) 810 811 @discard.register(list) 812 def _(self, tasks): 813 targets = set(tasks) 814 self.tasks = [x for x in self.tasks if x not in targets] 815 816(Contributed by Ethan Smith in :issue:`32380`) 817 818gc 819-- 820 821:func:`~gc.get_objects` can now receive an optional *generation* parameter 822indicating a generation to get objects from. 823(Contributed by Pablo Galindo in :issue:`36016`.) 824 825 826gettext 827------- 828 829Added :func:`~gettext.pgettext` and its variants. 830(Contributed by Franz Glasner, Éric Araujo, and Cheryl Sabella in :issue:`2504`.) 831 832 833gzip 834---- 835 836Added the *mtime* parameter to :func:`gzip.compress` for reproducible output. 837(Contributed by Guo Ci Teo in :issue:`34898`.) 838 839A :exc:`~gzip.BadGzipFile` exception is now raised instead of :exc:`OSError` 840for certain types of invalid or corrupt gzip files. 841(Contributed by Filip Gruszczyński, Michele Orrù, and Zackery Spytz in 842:issue:`6584`.) 843 844 845IDLE and idlelib 846---------------- 847 848Output over N lines (50 by default) is squeezed down to a button. 849N can be changed in the PyShell section of the General page of the 850Settings dialog. Fewer, but possibly extra long, lines can be squeezed by 851right clicking on the output. Squeezed output can be expanded in place 852by double-clicking the button or into the clipboard or a separate window 853by right-clicking the button. (Contributed by Tal Einat in :issue:`1529353`.) 854 855Add "Run Customized" to the Run menu to run a module with customized 856settings. Any command line arguments entered are added to sys.argv. 857They also re-appear in the box for the next customized run. One can also 858suppress the normal Shell main module restart. (Contributed by Cheryl 859Sabella, Terry Jan Reedy, and others in :issue:`5680` and :issue:`37627`.) 860 861Added optional line numbers for IDLE editor windows. Windows 862open without line numbers unless set otherwise in the General 863tab of the configuration dialog. Line numbers for an existing 864window are shown and hidden in the Options menu. 865(Contributed by Tal Einat and Saimadhav Heblikar in :issue:`17535`.) 866 867OS native encoding is now used for converting between Python strings and Tcl 868objects. This allows IDLE to work with emoji and other non-BMP characters. 869These characters can be displayed or copied and pasted to or from the 870clipboard. Converting strings from Tcl to Python and back now never fails. 871(Many people worked on this for eight years but the problem was finally 872solved by Serhiy Storchaka in :issue:`13153`.) 873 874New in 3.8.1: 875 876Add option to toggle cursor blink off. (Contributed by Zackery Spytz 877in :issue:`4603`.) 878 879Escape key now closes IDLE completion windows. (Contributed by Johnny 880Najera in :issue:`38944`.) 881 882The changes above have been backported to 3.7 maintenance releases. 883 884Add keywords to module name completion list. (Contributed by Terry J. 885Reedy in :issue:`37765`.) 886 887inspect 888------- 889 890The :func:`inspect.getdoc` function can now find docstrings for ``__slots__`` 891if that attribute is a :class:`dict` where the values are docstrings. 892This provides documentation options similar to what we already have 893for :func:`property`, :func:`classmethod`, and :func:`staticmethod`:: 894 895 class AudioClip: 896 __slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place', 897 'duration': 'in seconds, rounded up to an integer'} 898 def __init__(self, bit_rate, duration): 899 self.bit_rate = round(bit_rate / 1000.0, 1) 900 self.duration = ceil(duration) 901 902(Contributed by Raymond Hettinger in :issue:`36326`.) 903 904 905io 906-- 907 908In development mode (:option:`-X` ``env``) and in :ref:`debug build <debug-build>`, the 909:class:`io.IOBase` finalizer now logs the exception if the ``close()`` method 910fails. The exception is ignored silently by default in release build. 911(Contributed by Victor Stinner in :issue:`18748`.) 912 913 914itertools 915--------- 916 917The :func:`itertools.accumulate` function added an option *initial* keyword 918argument to specify an initial value:: 919 920 >>> from itertools import accumulate 921 >>> list(accumulate([10, 5, 30, 15], initial=1000)) 922 [1000, 1010, 1015, 1045, 1060] 923 924(Contributed by Lisa Roach in :issue:`34659`.) 925 926 927json.tool 928--------- 929 930Add option ``--json-lines`` to parse every input line as a separate JSON object. 931(Contributed by Weipeng Hong in :issue:`31553`.) 932 933 934logging 935------- 936 937Added a *force* keyword argument to :func:`logging.basicConfig()` 938When set to true, any existing handlers attached 939to the root logger are removed and closed before carrying out the 940configuration specified by the other arguments. 941 942This solves a long-standing problem. Once a logger or *basicConfig()* had 943been called, subsequent calls to *basicConfig()* were silently ignored. 944This made it difficult to update, experiment with, or teach the various 945logging configuration options using the interactive prompt or a Jupyter 946notebook. 947 948(Suggested by Raymond Hettinger, implemented by Dong-hee Na, and 949reviewed by Vinay Sajip in :issue:`33897`.) 950 951 952math 953---- 954 955Added new function :func:`math.dist` for computing Euclidean distance 956between two points. (Contributed by Raymond Hettinger in :issue:`33089`.) 957 958Expanded the :func:`math.hypot` function to handle multiple dimensions. 959Formerly, it only supported the 2-D case. 960(Contributed by Raymond Hettinger in :issue:`33089`.) 961 962Added new function, :func:`math.prod`, as analogous function to :func:`sum` 963that returns the product of a 'start' value (default: 1) times an iterable of 964numbers:: 965 966 >>> prior = 0.8 967 >>> likelihoods = [0.625, 0.84, 0.30] 968 >>> math.prod(likelihoods, start=prior) 969 0.126 970 971(Contributed by Pablo Galindo in :issue:`35606`.) 972 973Added two new combinatoric functions :func:`math.perm` and :func:`math.comb`:: 974 975 >>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time 976 720 977 >>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time 978 120 979 980(Contributed by Yash Aggarwal, Keller Fuchs, Serhiy Storchaka, and Raymond 981Hettinger in :issue:`37128`, :issue:`37178`, and :issue:`35431`.) 982 983Added a new function :func:`math.isqrt` for computing accurate integer square 984roots without conversion to floating point. The new function supports 985arbitrarily large integers. It is faster than ``floor(sqrt(n))`` but slower 986than :func:`math.sqrt`:: 987 988 >>> r = 650320427 989 >>> s = r ** 2 990 >>> isqrt(s - 1) # correct 991 650320426 992 >>> floor(sqrt(s - 1)) # incorrect 993 650320427 994 995(Contributed by Mark Dickinson in :issue:`36887`.) 996 997The function :func:`math.factorial` no longer accepts arguments that are not 998int-like. (Contributed by Pablo Galindo in :issue:`33083`.) 999 1000 1001mmap 1002---- 1003 1004The :class:`mmap.mmap` class now has an :meth:`~mmap.mmap.madvise` method to 1005access the ``madvise()`` system call. 1006(Contributed by Zackery Spytz in :issue:`32941`.) 1007 1008 1009multiprocessing 1010--------------- 1011 1012Added new :mod:`multiprocessing.shared_memory` module. 1013(Contributed by Davin Potts in :issue:`35813`.) 1014 1015On macOS, the *spawn* start method is now used by default. 1016(Contributed by Victor Stinner in :issue:`33725`.) 1017 1018 1019os 1020-- 1021 1022Added new function :func:`~os.add_dll_directory` on Windows for providing 1023additional search paths for native dependencies when importing extension 1024modules or loading DLLs using :mod:`ctypes`. 1025(Contributed by Steve Dower in :issue:`36085`.) 1026 1027A new :func:`os.memfd_create` function was added to wrap the 1028``memfd_create()`` syscall. 1029(Contributed by Zackery Spytz and Christian Heimes in :issue:`26836`.) 1030 1031On Windows, much of the manual logic for handling reparse points (including 1032symlinks and directory junctions) has been delegated to the operating system. 1033Specifically, :func:`os.stat` will now traverse anything supported by the 1034operating system, while :func:`os.lstat` will only open reparse points that 1035identify as "name surrogates" while others are opened as for :func:`os.stat`. 1036In all cases, :attr:`stat_result.st_mode` will only have ``S_IFLNK`` set for 1037symbolic links and not other kinds of reparse points. To identify other kinds 1038of reparse point, check the new :attr:`stat_result.st_reparse_tag` attribute. 1039 1040On Windows, :func:`os.readlink` is now able to read directory junctions. Note 1041that :func:`~os.path.islink` will return ``False`` for directory junctions, 1042and so code that checks ``islink`` first will continue to treat junctions as 1043directories, while code that handles errors from :func:`os.readlink` may now 1044treat junctions as links. 1045 1046(Contributed by Steve Dower in :issue:`37834`.) 1047 1048 1049os.path 1050------- 1051 1052:mod:`os.path` functions that return a boolean result like 1053:func:`~os.path.exists`, :func:`~os.path.lexists`, :func:`~os.path.isdir`, 1054:func:`~os.path.isfile`, :func:`~os.path.islink`, and :func:`~os.path.ismount` 1055now return ``False`` instead of raising :exc:`ValueError` or its subclasses 1056:exc:`UnicodeEncodeError` and :exc:`UnicodeDecodeError` for paths that contain 1057characters or bytes unrepresentable at the OS level. 1058(Contributed by Serhiy Storchaka in :issue:`33721`.) 1059 1060:func:`~os.path.expanduser` on Windows now prefers the :envvar:`USERPROFILE` 1061environment variable and does not use :envvar:`HOME`, which is not normally set 1062for regular user accounts. 1063(Contributed by Anthony Sottile in :issue:`36264`.) 1064 1065:func:`~os.path.isdir` on Windows no longer returns ``True`` for a link to a 1066non-existent directory. 1067 1068:func:`~os.path.realpath` on Windows now resolves reparse points, including 1069symlinks and directory junctions. 1070 1071(Contributed by Steve Dower in :issue:`37834`.) 1072 1073 1074pathlib 1075------- 1076 1077:mod:`pathlib.Path` methods that return a boolean result like 1078:meth:`~pathlib.Path.exists()`, :meth:`~pathlib.Path.is_dir()`, 1079:meth:`~pathlib.Path.is_file()`, :meth:`~pathlib.Path.is_mount()`, 1080:meth:`~pathlib.Path.is_symlink()`, :meth:`~pathlib.Path.is_block_device()`, 1081:meth:`~pathlib.Path.is_char_device()`, :meth:`~pathlib.Path.is_fifo()`, 1082:meth:`~pathlib.Path.is_socket()` now return ``False`` instead of raising 1083:exc:`ValueError` or its subclass :exc:`UnicodeEncodeError` for paths that 1084contain characters unrepresentable at the OS level. 1085(Contributed by Serhiy Storchaka in :issue:`33721`.) 1086 1087Added :meth:`pathlib.Path.link_to()` which creates a hard link pointing 1088to a path. 1089(Contributed by Joannah Nanjekye in :issue:`26978`) 1090 1091 1092pickle 1093------ 1094 1095:mod:`pickle` extensions subclassing the C-optimized :class:`~pickle.Pickler` 1096can now override the pickling logic of functions and classes by defining the 1097special :meth:`~pickle.Pickler.reducer_override` method. 1098(Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`.) 1099 1100 1101plistlib 1102-------- 1103 1104Added new :class:`plistlib.UID` and enabled support for reading and writing 1105NSKeyedArchiver-encoded binary plists. 1106(Contributed by Jon Janzen in :issue:`26707`.) 1107 1108 1109pprint 1110------ 1111 1112The :mod:`pprint` module added a *sort_dicts* parameter to several functions. 1113By default, those functions continue to sort dictionaries before rendering or 1114printing. However, if *sort_dicts* is set to false, the dictionaries retain 1115the order that keys were inserted. This can be useful for comparison to JSON 1116inputs during debugging. 1117 1118In addition, there is a convenience new function, :func:`pprint.pp` that is 1119like :func:`pprint.pprint` but with *sort_dicts* defaulting to ``False``:: 1120 1121 >>> from pprint import pprint, pp 1122 >>> d = dict(source='input.txt', operation='filter', destination='output.txt') 1123 >>> pp(d, width=40) # Original order 1124 {'source': 'input.txt', 1125 'operation': 'filter', 1126 'destination': 'output.txt'} 1127 >>> pprint(d, width=40) # Keys sorted alphabetically 1128 {'destination': 'output.txt', 1129 'operation': 'filter', 1130 'source': 'input.txt'} 1131 1132(Contributed by Rémi Lapeyre in :issue:`30670`.) 1133 1134 1135py_compile 1136---------- 1137 1138:func:`py_compile.compile` now supports silent mode. 1139(Contributed by Joannah Nanjekye in :issue:`22640`.) 1140 1141 1142shlex 1143----- 1144 1145The new :func:`shlex.join` function acts as the inverse of :func:`shlex.split`. 1146(Contributed by Bo Bayles in :issue:`32102`.) 1147 1148 1149shutil 1150------ 1151 1152:func:`shutil.copytree` now accepts a new ``dirs_exist_ok`` keyword argument. 1153(Contributed by Josh Bronson in :issue:`20849`.) 1154 1155:func:`shutil.make_archive` now defaults to the modern pax (POSIX.1-2001) 1156format for new archives to improve portability and standards conformance, 1157inherited from the corresponding change to the :mod:`tarfile` module. 1158(Contributed by C.A.M. Gerlach in :issue:`30661`.) 1159 1160:func:`shutil.rmtree` on Windows now removes directory junctions without 1161recursively removing their contents first. 1162(Contributed by Steve Dower in :issue:`37834`.) 1163 1164 1165socket 1166------ 1167 1168Added :meth:`~socket.create_server()` and :meth:`~socket.has_dualstack_ipv6()` 1169convenience functions to automate the necessary tasks usually involved when 1170creating a server socket, including accepting both IPv4 and IPv6 connections 1171on the same socket. (Contributed by Giampaolo Rodolà in :issue:`17561`.) 1172 1173The :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and 1174:func:`socket.if_indextoname()` functions have been implemented on Windows. 1175(Contributed by Zackery Spytz in :issue:`37007`.) 1176 1177 1178ssl 1179--- 1180 1181Added :attr:`~ssl.SSLContext.post_handshake_auth` to enable and 1182:meth:`~ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3 1183post-handshake authentication. 1184(Contributed by Christian Heimes in :issue:`34670`.) 1185 1186 1187statistics 1188---------- 1189 1190Added :func:`statistics.fmean` as a faster, floating point variant of 1191:func:`statistics.mean()`. (Contributed by Raymond Hettinger and 1192Steven D'Aprano in :issue:`35904`.) 1193 1194Added :func:`statistics.geometric_mean()` 1195(Contributed by Raymond Hettinger in :issue:`27181`.) 1196 1197Added :func:`statistics.multimode` that returns a list of the most 1198common values. (Contributed by Raymond Hettinger in :issue:`35892`.) 1199 1200Added :func:`statistics.quantiles` that divides data or a distribution 1201in to equiprobable intervals (e.g. quartiles, deciles, or percentiles). 1202(Contributed by Raymond Hettinger in :issue:`36546`.) 1203 1204Added :class:`statistics.NormalDist`, a tool for creating 1205and manipulating normal distributions of a random variable. 1206(Contributed by Raymond Hettinger in :issue:`36018`.) 1207 1208:: 1209 1210 >>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14]) 1211 >>> temperature_feb.mean 1212 6.0 1213 >>> temperature_feb.stdev 1214 6.356099432828281 1215 1216 >>> temperature_feb.cdf(3) # Chance of being under 3 degrees 1217 0.3184678262814532 1218 >>> # Relative chance of being 7 degrees versus 10 degrees 1219 >>> temperature_feb.pdf(7) / temperature_feb.pdf(10) 1220 1.2039930378537762 1221 1222 >>> el_niño = NormalDist(4, 2.5) 1223 >>> temperature_feb += el_niño # Add in a climate effect 1224 >>> temperature_feb 1225 NormalDist(mu=10.0, sigma=6.830080526611674) 1226 1227 >>> temperature_feb * (9/5) + 32 # Convert to Fahrenheit 1228 NormalDist(mu=50.0, sigma=12.294144947901014) 1229 >>> temperature_feb.samples(3) # Generate random samples 1230 [7.672102882379219, 12.000027119750287, 4.647488369766392] 1231 1232 1233sys 1234--- 1235 1236Add new :func:`sys.unraisablehook` function which can be overridden to control 1237how "unraisable exceptions" are handled. It is called when an exception has 1238occurred but there is no way for Python to handle it. For example, when a 1239destructor raises an exception or during garbage collection 1240(:func:`gc.collect`). 1241(Contributed by Victor Stinner in :issue:`36829`.) 1242 1243 1244tarfile 1245------- 1246 1247The :mod:`tarfile` module now defaults to the modern pax (POSIX.1-2001) 1248format for new archives, instead of the previous GNU-specific one. 1249This improves cross-platform portability with a consistent encoding (UTF-8) 1250in a standardized and extensible format, and offers several other benefits. 1251(Contributed by C.A.M. Gerlach in :issue:`36268`.) 1252 1253 1254threading 1255--------- 1256 1257Add a new :func:`threading.excepthook` function which handles uncaught 1258:meth:`threading.Thread.run` exception. It can be overridden to control how 1259uncaught :meth:`threading.Thread.run` exceptions are handled. 1260(Contributed by Victor Stinner in :issue:`1230540`.) 1261 1262Add a new :func:`threading.get_native_id` function and 1263a :data:`~threading.Thread.native_id` 1264attribute to the :class:`threading.Thread` class. These return the native 1265integral Thread ID of the current thread assigned by the kernel. 1266This feature is only available on certain platforms, see 1267:func:`get_native_id <threading.get_native_id>` for more information. 1268(Contributed by Jake Tesler in :issue:`36084`.) 1269 1270 1271tokenize 1272-------- 1273 1274The :mod:`tokenize` module now implicitly emits a ``NEWLINE`` token when 1275provided with input that does not have a trailing new line. This behavior 1276now matches what the C tokenizer does internally. 1277(Contributed by Ammar Askar in :issue:`33899`.) 1278 1279 1280tkinter 1281------- 1282 1283Added methods :meth:`~tkinter.Spinbox.selection_from`, 1284:meth:`~tkinter.Spinbox.selection_present`, 1285:meth:`~tkinter.Spinbox.selection_range` and 1286:meth:`~tkinter.Spinbox.selection_to` 1287in the :class:`tkinter.Spinbox` class. 1288(Contributed by Juliette Monsel in :issue:`34829`.) 1289 1290Added method :meth:`~tkinter.Canvas.moveto` 1291in the :class:`tkinter.Canvas` class. 1292(Contributed by Juliette Monsel in :issue:`23831`.) 1293 1294The :class:`tkinter.PhotoImage` class now has 1295:meth:`~tkinter.PhotoImage.transparency_get` and 1296:meth:`~tkinter.PhotoImage.transparency_set` methods. (Contributed by 1297Zackery Spytz in :issue:`25451`.) 1298 1299 1300time 1301---- 1302 1303Added new clock :data:`~time.CLOCK_UPTIME_RAW` for macOS 10.12. 1304(Contributed by Joannah Nanjekye in :issue:`35702`.) 1305 1306 1307typing 1308------ 1309 1310The :mod:`typing` module incorporates several new features: 1311 1312* A dictionary type with per-key types. See :pep:`589` and 1313 :class:`typing.TypedDict`. 1314 TypedDict uses only string keys. By default, every key is required 1315 to be present. Specify "total=False" to allow keys to be optional:: 1316 1317 class Location(TypedDict, total=False): 1318 lat_long: tuple 1319 grid_square: str 1320 xy_coordinate: tuple 1321 1322* Literal types. See :pep:`586` and :class:`typing.Literal`. 1323 Literal types indicate that a parameter or return value 1324 is constrained to one or more specific literal values:: 1325 1326 def get_status(port: int) -> Literal['connected', 'disconnected']: 1327 ... 1328 1329* "Final" variables, functions, methods and classes. See :pep:`591`, 1330 :class:`typing.Final` and :func:`typing.final`. 1331 The final qualifier instructs a static type checker to restrict 1332 subclassing, overriding, or reassignment:: 1333 1334 pi: Final[float] = 3.1415926536 1335 1336* Protocol definitions. See :pep:`544`, :class:`typing.Protocol` and 1337 :func:`typing.runtime_checkable`. Simple ABCs like 1338 :class:`typing.SupportsInt` are now ``Protocol`` subclasses. 1339 1340* New protocol class :class:`typing.SupportsIndex`. 1341 1342* New functions :func:`typing.get_origin` and :func:`typing.get_args`. 1343 1344 1345unicodedata 1346----------- 1347 1348The :mod:`unicodedata` module has been upgraded to use the `Unicode 12.1.0 1349<http://blog.unicode.org/2019/05/unicode-12-1-en.html>`_ release. 1350 1351New function :func:`~unicodedata.is_normalized` can be used to verify a string 1352is in a specific normal form, often much faster than by actually normalizing 1353the string. (Contributed by Max Belanger, David Euresti, and Greg Price in 1354:issue:`32285` and :issue:`37966`). 1355 1356 1357unittest 1358-------- 1359 1360Added :class:`~unittest.mock.AsyncMock` to support an asynchronous version of 1361:class:`~unittest.mock.Mock`. Appropriate new assert functions for testing 1362have been added as well. 1363(Contributed by Lisa Roach in :issue:`26467`). 1364 1365Added :func:`~unittest.addModuleCleanup()` and 1366:meth:`~unittest.TestCase.addClassCleanup()` to unittest to support 1367cleanups for :func:`~unittest.setUpModule()` and 1368:meth:`~unittest.TestCase.setUpClass()`. 1369(Contributed by Lisa Roach in :issue:`24412`.) 1370 1371Several mock assert functions now also print a list of actual calls upon 1372failure. (Contributed by Petter Strandmark in :issue:`35047`.) 1373 1374:mod:`unittest` module gained support for coroutines to be used as test cases 1375with :class:`unittest.IsolatedAsyncioTestCase`. 1376(Contributed by Andrew Svetlov in :issue:`32972`.) 1377 1378Example:: 1379 1380 import unittest 1381 1382 1383 class TestRequest(unittest.IsolatedAsyncioTestCase): 1384 1385 async def asyncSetUp(self): 1386 self.connection = await AsyncConnection() 1387 1388 async def test_get(self): 1389 response = await self.connection.get("https://example.com") 1390 self.assertEqual(response.status_code, 200) 1391 1392 async def asyncTearDown(self): 1393 await self.connection.close() 1394 1395 1396 if __name__ == "__main__": 1397 unittest.main() 1398 1399 1400venv 1401---- 1402 1403:mod:`venv` now includes an ``Activate.ps1`` script on all platforms for 1404activating virtual environments under PowerShell Core 6.1. 1405(Contributed by Brett Cannon in :issue:`32718`.) 1406 1407 1408weakref 1409------- 1410 1411The proxy objects returned by :func:`weakref.proxy` now support the matrix 1412multiplication operators ``@`` and ``@=`` in addition to the other 1413numeric operators. (Contributed by Mark Dickinson in :issue:`36669`.) 1414 1415 1416xml 1417--- 1418 1419As mitigation against DTD and external entity retrieval, the 1420:mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process 1421external entities by default. 1422(Contributed by Christian Heimes in :issue:`17239`.) 1423 1424The ``.find*()`` methods in the :mod:`xml.etree.ElementTree` module 1425support wildcard searches like ``{*}tag`` which ignores the namespace 1426and ``{namespace}*`` which returns all tags in the given namespace. 1427(Contributed by Stefan Behnel in :issue:`28238`.) 1428 1429The :mod:`xml.etree.ElementTree` module provides a new function 1430:func:`–xml.etree.ElementTree.canonicalize()` that implements C14N 2.0. 1431(Contributed by Stefan Behnel in :issue:`13611`.) 1432 1433The target object of :class:`xml.etree.ElementTree.XMLParser` can 1434receive namespace declaration events through the new callback methods 1435``start_ns()`` and ``end_ns()``. Additionally, the 1436:class:`xml.etree.ElementTree.TreeBuilder` target can be configured 1437to process events about comments and processing instructions to include 1438them in the generated tree. 1439(Contributed by Stefan Behnel in :issue:`36676` and :issue:`36673`.) 1440 1441 1442xmlrpc 1443------ 1444 1445:class:`xmlrpc.client.ServerProxy` now supports an optional *headers* keyword 1446argument for a sequence of HTTP headers to be sent with each request. Among 1447other things, this makes it possible to upgrade from default basic 1448authentication to faster session authentication. 1449(Contributed by Cédric Krier in :issue:`35153`.) 1450 1451 1452Optimizations 1453============= 1454 1455* The :mod:`subprocess` module can now use the :func:`os.posix_spawn` function 1456 in some cases for better performance. Currently, it is only used on macOS 1457 and Linux (using glibc 2.24 or newer) if all these conditions are met: 1458 1459 * *close_fds* is false; 1460 * *preexec_fn*, *pass_fds*, *cwd* and *start_new_session* parameters 1461 are not set; 1462 * the *executable* path contains a directory. 1463 1464 (Contributed by Joannah Nanjekye and Victor Stinner in :issue:`35537`.) 1465 1466* :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, 1467 :func:`shutil.copytree` and :func:`shutil.move` use platform-specific 1468 "fast-copy" syscalls on Linux and macOS in order to copy the file 1469 more efficiently. 1470 "fast-copy" means that the copying operation occurs within the kernel, 1471 avoiding the use of userspace buffers in Python as in 1472 "``outfd.write(infd.read())``". 1473 On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB 1474 instead of 16 KiB) and a :func:`memoryview`-based variant of 1475 :func:`shutil.copyfileobj` is used. 1476 The speedup for copying a 512 MiB file within the same partition is about 1477 +26% on Linux, +50% on macOS and +40% on Windows. Also, much less CPU cycles 1478 are consumed. 1479 See :ref:`shutil-platform-dependent-efficient-copy-operations` section. 1480 (Contributed by Giampaolo Rodolà in :issue:`33671`.) 1481 1482* :func:`shutil.copytree` uses :func:`os.scandir` function and all copy 1483 functions depending from it use cached :func:`os.stat` values. The speedup 1484 for copying a directory with 8000 files is around +9% on Linux, +20% on 1485 Windows and +30% on a Windows SMB share. Also the number of :func:`os.stat` 1486 syscalls is reduced by 38% making :func:`shutil.copytree` especially faster 1487 on network filesystems. (Contributed by Giampaolo Rodolà in :issue:`33695`.) 1488 1489* The default protocol in the :mod:`pickle` module is now Protocol 4, 1490 first introduced in Python 3.4. It offers better performance and smaller 1491 size compared to Protocol 3 available since Python 3.0. 1492 1493* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked 1494 objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. 1495 (Contributed by Inada Naoki in :issue:`33597`.) 1496 1497* :class:`uuid.UUID` now uses ``__slots__`` to reduce its memory footprint. 1498 (Contributed by Wouter Bolsterlee and Tal Einat in :issue:`30977`) 1499 1500* Improved performance of :func:`operator.itemgetter` by 33%. Optimized 1501 argument handling and added a fast path for the common case of a single 1502 non-negative integer index into a tuple (which is the typical use case in 1503 the standard library). (Contributed by Raymond Hettinger in 1504 :issue:`35664`.) 1505 1506* Sped-up field lookups in :func:`collections.namedtuple`. They are now more 1507 than two times faster, making them the fastest form of instance variable 1508 lookup in Python. (Contributed by Raymond Hettinger, Pablo Galindo, and 1509 Joe Jevnik, Serhiy Storchaka in :issue:`32492`.) 1510 1511* The :class:`list` constructor does not overallocate the internal item buffer 1512 if the input iterable has a known length (the input implements ``__len__``). 1513 This makes the created list 12% smaller on average. (Contributed by 1514 Raymond Hettinger and Pablo Galindo in :issue:`33234`.) 1515 1516* Doubled the speed of class variable writes. When a non-dunder attribute 1517 was updated, there was an unnecessary call to update slots. 1518 (Contributed by Stefan Behnel, Pablo Galindo Salgado, Raymond Hettinger, 1519 Neil Schemenauer, and Serhiy Storchaka in :issue:`36012`.) 1520 1521* Reduced an overhead of converting arguments passed to many builtin functions 1522 and methods. This sped up calling some simple builtin functions and 1523 methods up to 20--50%. (Contributed by Serhiy Storchaka in :issue:`23867`, 1524 :issue:`35582` and :issue:`36127`.) 1525 1526* ``LOAD_GLOBAL`` instruction now uses new "per opcode cache" mechanism. 1527 It is about 40% faster now. (Contributed by Yury Selivanov and Inada Naoki in 1528 :issue:`26219`.) 1529 1530 1531Build and C API Changes 1532======================= 1533 1534* Default :data:`sys.abiflags` became an empty string: the ``m`` flag for 1535 pymalloc became useless (builds with and without pymalloc are ABI compatible) 1536 and so has been removed. (Contributed by Victor Stinner in :issue:`36707`.) 1537 1538 Example of changes: 1539 1540 * Only ``python3.8`` program is installed, ``python3.8m`` program is gone. 1541 * Only ``python3.8-config`` script is installed, ``python3.8m-config`` script 1542 is gone. 1543 * The ``m`` flag has been removed from the suffix of dynamic library 1544 filenames: extension modules in the standard library as well as those 1545 produced and installed by third-party packages, like those downloaded from 1546 PyPI. On Linux, for example, the Python 3.7 suffix 1547 ``.cpython-37m-x86_64-linux-gnu.so`` became 1548 ``.cpython-38-x86_64-linux-gnu.so`` in Python 3.8. 1549 1550* The header files have been reorganized to better separate the different kinds 1551 of APIs: 1552 1553 * ``Include/*.h`` should be the portable public stable C API. 1554 * ``Include/cpython/*.h`` should be the unstable C API specific to CPython; 1555 public API, with some private API prefixed by ``_Py`` or ``_PY``. 1556 * ``Include/internal/*.h`` is the private internal C API very specific to 1557 CPython. This API comes with no backward compatibility warranty and should 1558 not be used outside CPython. It is only exposed for very specific needs 1559 like debuggers and profiles which has to access to CPython internals 1560 without calling functions. This API is now installed by ``make install``. 1561 1562 (Contributed by Victor Stinner in :issue:`35134` and :issue:`35081`, 1563 work initiated by Eric Snow in Python 3.7.) 1564 1565* Some macros have been converted to static inline functions: parameter types 1566 and return type are well defined, they don't have issues specific to macros, 1567 variables have a local scopes. Examples: 1568 1569 * :c:func:`Py_INCREF`, :c:func:`Py_DECREF` 1570 * :c:func:`Py_XINCREF`, :c:func:`Py_XDECREF` 1571 * :c:func:`PyObject_INIT`, :c:func:`PyObject_INIT_VAR` 1572 * Private functions: :c:func:`_PyObject_GC_TRACK`, 1573 :c:func:`_PyObject_GC_UNTRACK`, :c:func:`_Py_Dealloc` 1574 1575 (Contributed by Victor Stinner in :issue:`35059`.) 1576 1577* The :c:func:`PyByteArray_Init` and :c:func:`PyByteArray_Fini` functions have 1578 been removed. They did nothing since Python 2.7.4 and Python 3.2.0, were 1579 excluded from the limited API (stable ABI), and were not documented. 1580 (Contributed by Victor Stinner in :issue:`35713`.) 1581 1582* The result of :c:func:`PyExceptionClass_Name` is now of type 1583 ``const char *`` rather of ``char *``. 1584 (Contributed by Serhiy Storchaka in :issue:`33818`.) 1585 1586* The duality of ``Modules/Setup.dist`` and ``Modules/Setup`` has been 1587 removed. Previously, when updating the CPython source tree, one had 1588 to manually copy ``Modules/Setup.dist`` (inside the source tree) to 1589 ``Modules/Setup`` (inside the build tree) in order to reflect any changes 1590 upstream. This was of a small benefit to packagers at the expense of 1591 a frequent annoyance to developers following CPython development, as 1592 forgetting to copy the file could produce build failures. 1593 1594 Now the build system always reads from ``Modules/Setup`` inside the source 1595 tree. People who want to customize that file are encouraged to maintain 1596 their changes in a git fork of CPython or as patch files, as they would do 1597 for any other change to the source tree. 1598 1599 (Contributed by Antoine Pitrou in :issue:`32430`.) 1600 1601* Functions that convert Python number to C integer like 1602 :c:func:`PyLong_AsLong` and argument parsing functions like 1603 :c:func:`PyArg_ParseTuple` with integer converting format units like ``'i'`` 1604 will now use the :meth:`~object.__index__` special method instead of 1605 :meth:`~object.__int__`, if available. The deprecation warning will be 1606 emitted for objects with the ``__int__()`` method but without the 1607 ``__index__()`` method (like :class:`~decimal.Decimal` and 1608 :class:`~fractions.Fraction`). :c:func:`PyNumber_Check` will now return 1609 ``1`` for objects implementing ``__index__()``. 1610 :c:func:`PyNumber_Long`, :c:func:`PyNumber_Float` and 1611 :c:func:`PyFloat_AsDouble` also now use the ``__index__()`` method if 1612 available. 1613 (Contributed by Serhiy Storchaka in :issue:`36048` and :issue:`20092`.) 1614 1615* Heap-allocated type objects will now increase their reference count 1616 in :c:func:`PyObject_Init` (and its parallel macro ``PyObject_INIT``) 1617 instead of in :c:func:`PyType_GenericAlloc`. Types that modify instance 1618 allocation or deallocation may need to be adjusted. 1619 (Contributed by Eddie Elizondo in :issue:`35810`.) 1620 1621* The new function :c:func:`PyCode_NewWithPosOnlyArgs` allows to create 1622 code objects like :c:func:`PyCode_New`, but with an extra *posonlyargcount* 1623 parameter for indicating the number of positional-only arguments. 1624 (Contributed by Pablo Galindo in :issue:`37221`.) 1625 1626* :c:func:`Py_SetPath` now sets :data:`sys.executable` to the program full 1627 path (:c:func:`Py_GetProgramFullPath`) rather than to the program name 1628 (:c:func:`Py_GetProgramName`). 1629 (Contributed by Victor Stinner in :issue:`38234`.) 1630 1631 1632Deprecated 1633========== 1634 1635* The distutils ``bdist_wininst`` command is now deprecated, use 1636 ``bdist_wheel`` (wheel packages) instead. 1637 (Contributed by Victor Stinner in :issue:`37481`.) 1638 1639* Deprecated methods ``getchildren()`` and ``getiterator()`` in 1640 the :mod:`~xml.etree.ElementTree` module now emit a 1641 :exc:`DeprecationWarning` instead of :exc:`PendingDeprecationWarning`. 1642 They will be removed in Python 3.9. 1643 (Contributed by Serhiy Storchaka in :issue:`29209`.) 1644 1645* Passing an object that is not an instance of 1646 :class:`concurrent.futures.ThreadPoolExecutor` to 1647 :meth:`loop.set_default_executor() <asyncio.loop.set_default_executor>` is 1648 deprecated and will be prohibited in Python 3.9. 1649 (Contributed by Elvis Pranskevichus in :issue:`34075`.) 1650 1651* The :meth:`__getitem__` methods of :class:`xml.dom.pulldom.DOMEventStream`, 1652 :class:`wsgiref.util.FileWrapper` and :class:`fileinput.FileInput` have been 1653 deprecated. 1654 1655 Implementations of these methods have been ignoring their *index* parameter, 1656 and returning the next item instead. 1657 (Contributed by Berker Peksag in :issue:`9372`.) 1658 1659* The :class:`typing.NamedTuple` class has deprecated the ``_field_types`` 1660 attribute in favor of the ``__annotations__`` attribute which has the same 1661 information. (Contributed by Raymond Hettinger in :issue:`36320`.) 1662 1663* :mod:`ast` classes ``Num``, ``Str``, ``Bytes``, ``NameConstant`` and 1664 ``Ellipsis`` are considered deprecated and will be removed in future Python 1665 versions. :class:`~ast.Constant` should be used instead. 1666 (Contributed by Serhiy Storchaka in :issue:`32892`.) 1667 1668* :class:`ast.NodeVisitor` methods ``visit_Num()``, ``visit_Str()``, 1669 ``visit_Bytes()``, ``visit_NameConstant()`` and ``visit_Ellipsis()`` are 1670 deprecated now and will not be called in future Python versions. 1671 Add the :meth:`~ast.NodeVisitor.visit_Constant` method to handle all 1672 constant nodes. 1673 (Contributed by Serhiy Storchaka in :issue:`36917`.) 1674 1675* The :func:`asyncio.coroutine` :term:`decorator` is deprecated and will be 1676 removed in version 3.10. Instead of ``@asyncio.coroutine``, use 1677 :keyword:`async def` instead. 1678 (Contributed by Andrew Svetlov in :issue:`36921`.) 1679 1680* In :mod:`asyncio`, the explicit passing of a *loop* argument has been 1681 deprecated and will be removed in version 3.10 for the following: 1682 :func:`asyncio.sleep`, :func:`asyncio.gather`, :func:`asyncio.shield`, 1683 :func:`asyncio.wait_for`, :func:`asyncio.wait`, :func:`asyncio.as_completed`, 1684 :class:`asyncio.Task`, :class:`asyncio.Lock`, :class:`asyncio.Event`, 1685 :class:`asyncio.Condition`, :class:`asyncio.Semaphore`, 1686 :class:`asyncio.BoundedSemaphore`, :class:`asyncio.Queue`, 1687 :func:`asyncio.create_subprocess_exec`, and 1688 :func:`asyncio.create_subprocess_shell`. 1689 1690* The explicit passing of coroutine objects to :func:`asyncio.wait` has been 1691 deprecated and will be removed in version 3.11. 1692 (Contributed by Yury Selivanov in :issue:`34790`.) 1693 1694* The following functions and methods are deprecated in the :mod:`gettext` 1695 module: :func:`~gettext.lgettext`, :func:`~gettext.ldgettext`, 1696 :func:`~gettext.lngettext` and :func:`~gettext.ldngettext`. 1697 They return encoded bytes, and it's possible that you will get unexpected 1698 Unicode-related exceptions if there are encoding problems with the 1699 translated strings. It's much better to use alternatives which return 1700 Unicode strings in Python 3. These functions have been broken for a long time. 1701 1702 Function :func:`~gettext.bind_textdomain_codeset`, methods 1703 :meth:`~gettext.NullTranslations.output_charset` and 1704 :meth:`~gettext.NullTranslations.set_output_charset`, and the *codeset* 1705 parameter of functions :func:`~gettext.translation` and 1706 :func:`~gettext.install` are also deprecated, since they are only used for 1707 the ``l*gettext()`` functions. 1708 (Contributed by Serhiy Storchaka in :issue:`33710`.) 1709 1710* The :meth:`~threading.Thread.isAlive()` method of :class:`threading.Thread` 1711 has been deprecated. 1712 (Contributed by Dong-hee Na in :issue:`35283`.) 1713 1714* Many builtin and extension functions that take integer arguments will 1715 now emit a deprecation warning for :class:`~decimal.Decimal`\ s, 1716 :class:`~fractions.Fraction`\ s and any other objects that can be converted 1717 to integers only with a loss (e.g. that have the :meth:`~object.__int__` 1718 method but do not have the :meth:`~object.__index__` method). In future 1719 version they will be errors. 1720 (Contributed by Serhiy Storchaka in :issue:`36048`.) 1721 1722* Deprecated passing the following arguments as keyword arguments: 1723 1724 - *func* in :func:`functools.partialmethod`, :func:`weakref.finalize`, 1725 :meth:`profile.Profile.runcall`, :meth:`cProfile.Profile.runcall`, 1726 :meth:`bdb.Bdb.runcall`, :meth:`trace.Trace.runfunc` and 1727 :func:`curses.wrapper`. 1728 - *function* in :meth:`unittest.TestCase.addCleanup`. 1729 - *fn* in the :meth:`~concurrent.futures.Executor.submit` method of 1730 :class:`concurrent.futures.ThreadPoolExecutor` and 1731 :class:`concurrent.futures.ProcessPoolExecutor`. 1732 - *callback* in :meth:`contextlib.ExitStack.callback`, 1733 :meth:`contextlib.AsyncExitStack.callback` and 1734 :meth:`contextlib.AsyncExitStack.push_async_callback`. 1735 - *c* and *typeid* in the :meth:`~multiprocessing.managers.Server.create` 1736 method of :class:`multiprocessing.managers.Server` and 1737 :class:`multiprocessing.managers.SharedMemoryServer`. 1738 - *obj* in :func:`weakref.finalize`. 1739 1740 In future releases of Python, they will be :ref:`positional-only 1741 <positional-only_parameter>`. 1742 (Contributed by Serhiy Storchaka in :issue:`36492`.) 1743 1744 1745API and Feature Removals 1746======================== 1747 1748The following features and APIs have been removed from Python 3.8: 1749 1750* Starting with Python 3.3, importing ABCs from :mod:`collections` was 1751 deprecated, and importing should be done from :mod:`collections.abc`. Being 1752 able to import from collections was marked for removal in 3.8, but has been 1753 delayed to 3.9. (See :issue:`36952`.) 1754 1755* The :mod:`macpath` module, deprecated in Python 3.7, has been removed. 1756 (Contributed by Victor Stinner in :issue:`35471`.) 1757 1758* The function :func:`platform.popen` has been removed, after having been 1759 deprecated since Python 3.3: use :func:`os.popen` instead. 1760 (Contributed by Victor Stinner in :issue:`35345`.) 1761 1762* The function :func:`time.clock` has been removed, after having been 1763 deprecated since Python 3.3: use :func:`time.perf_counter` or 1764 :func:`time.process_time` instead, depending 1765 on your requirements, to have well-defined behavior. 1766 (Contributed by Matthias Bussonnier in :issue:`36895`.) 1767 1768* The ``pyvenv`` script has been removed in favor of ``python3.8 -m venv`` 1769 to help eliminate confusion as to what Python interpreter the ``pyvenv`` 1770 script is tied to. (Contributed by Brett Cannon in :issue:`25427`.) 1771 1772* ``parse_qs``, ``parse_qsl``, and ``escape`` are removed from the :mod:`cgi` 1773 module. They are deprecated in Python 3.2 or older. They should be imported 1774 from the ``urllib.parse`` and ``html`` modules instead. 1775 1776* ``filemode`` function is removed from the :mod:`tarfile` module. 1777 It is not documented and deprecated since Python 3.3. 1778 1779* The :class:`~xml.etree.ElementTree.XMLParser` constructor no longer accepts 1780 the *html* argument. It never had an effect and was deprecated in Python 3.4. 1781 All other parameters are now :ref:`keyword-only <keyword-only_parameter>`. 1782 (Contributed by Serhiy Storchaka in :issue:`29209`.) 1783 1784* Removed the ``doctype()`` method of :class:`~xml.etree.ElementTree.XMLParser`. 1785 (Contributed by Serhiy Storchaka in :issue:`29209`.) 1786 1787* "unicode_internal" codec is removed. 1788 (Contributed by Inada Naoki in :issue:`36297`.) 1789 1790* The ``Cache`` and ``Statement`` objects of the :mod:`sqlite3` module are not 1791 exposed to the user. 1792 (Contributed by Aviv Palivoda in :issue:`30262`.) 1793 1794* The ``bufsize`` keyword argument of :func:`fileinput.input` and 1795 :func:`fileinput.FileInput` which was ignored and deprecated since Python 3.6 1796 has been removed. :issue:`36952` (Contributed by Matthias Bussonnier.) 1797 1798* The functions :func:`sys.set_coroutine_wrapper` and 1799 :func:`sys.get_coroutine_wrapper` deprecated in Python 3.7 have been removed; 1800 :issue:`36933` (Contributed by Matthias Bussonnier.) 1801 1802 1803Porting to Python 3.8 1804===================== 1805 1806This section lists previously described changes and other bugfixes 1807that may require changes to your code. 1808 1809 1810Changes in Python behavior 1811-------------------------- 1812 1813* Yield expressions (both ``yield`` and ``yield from`` clauses) are now disallowed 1814 in comprehensions and generator expressions (aside from the iterable expression 1815 in the leftmost :keyword:`!for` clause). 1816 (Contributed by Serhiy Storchaka in :issue:`10544`.) 1817 1818* The compiler now produces a :exc:`SyntaxWarning` when identity checks 1819 (``is`` and ``is not``) are used with certain types of literals 1820 (e.g. strings, numbers). These can often work by accident in CPython, 1821 but are not guaranteed by the language spec. The warning advises users 1822 to use equality tests (``==`` and ``!=``) instead. 1823 (Contributed by Serhiy Storchaka in :issue:`34850`.) 1824 1825* The CPython interpreter can swallow exceptions in some circumstances. 1826 In Python 3.8 this happens in fewer cases. In particular, exceptions 1827 raised when getting the attribute from the type dictionary are no longer 1828 ignored. (Contributed by Serhiy Storchaka in :issue:`35459`.) 1829 1830* Removed ``__str__`` implementations from builtin types :class:`bool`, 1831 :class:`int`, :class:`float`, :class:`complex` and few classes from 1832 the standard library. They now inherit ``__str__()`` from :class:`object`. 1833 As result, defining the ``__repr__()`` method in the subclass of these 1834 classes will affect their string representation. 1835 (Contributed by Serhiy Storchaka in :issue:`36793`.) 1836 1837* On AIX, :attr:`sys.platform` doesn't contain the major version anymore. 1838 It is always ``'aix'``, instead of ``'aix3'`` .. ``'aix7'``. Since 1839 older Python versions include the version number, so it is recommended to 1840 always use ``sys.platform.startswith('aix')``. 1841 (Contributed by M. Felt in :issue:`36588`.) 1842 1843* :c:func:`PyEval_AcquireLock` and :c:func:`PyEval_AcquireThread` now 1844 terminate the current thread if called while the interpreter is 1845 finalizing, making them consistent with :c:func:`PyEval_RestoreThread`, 1846 :c:func:`Py_END_ALLOW_THREADS`, and :c:func:`PyGILState_Ensure`. If this 1847 behavior is not desired, guard the call by checking :c:func:`_Py_IsFinalizing` 1848 or :c:func:`sys.is_finalizing`. 1849 (Contributed by Joannah Nanjekye in :issue:`36475`.) 1850 1851 1852Changes in the Python API 1853------------------------- 1854 1855* The :func:`os.getcwdb` function now uses the UTF-8 encoding on Windows, 1856 rather than the ANSI code page: see :pep:`529` for the rationale. The 1857 function is no longer deprecated on Windows. 1858 (Contributed by Victor Stinner in :issue:`37412`.) 1859 1860* :class:`subprocess.Popen` can now use :func:`os.posix_spawn` in some cases 1861 for better performance. On Windows Subsystem for Linux and QEMU User 1862 Emulation, the :class:`Popen` constructor using :func:`os.posix_spawn` no longer raises an 1863 exception on errors like "missing program". Instead the child process fails with a 1864 non-zero :attr:`~Popen.returncode`. 1865 (Contributed by Joannah Nanjekye and Victor Stinner in :issue:`35537`.) 1866 1867* The *preexec_fn* argument of * :class:`subprocess.Popen` is no longer 1868 compatible with subinterpreters. The use of the parameter in a 1869 subinterpreter now raises :exc:`RuntimeError`. 1870 (Contributed by Eric Snow in :issue:`34651`, modified by Christian Heimes 1871 in :issue:`37951`.) 1872 1873* The :meth:`imap.IMAP4.logout` method no longer silently ignores arbitrary 1874 exceptions. 1875 (Contributed by Victor Stinner in :issue:`36348`.) 1876 1877* The function :func:`platform.popen` has been removed, after having been deprecated since 1878 Python 3.3: use :func:`os.popen` instead. 1879 (Contributed by Victor Stinner in :issue:`35345`.) 1880 1881* The :func:`statistics.mode` function no longer raises an exception 1882 when given multimodal data. Instead, it returns the first mode 1883 encountered in the input data. (Contributed by Raymond Hettinger 1884 in :issue:`35892`.) 1885 1886* The :meth:`~tkinter.ttk.Treeview.selection` method of the 1887 :class:`tkinter.ttk.Treeview` class no longer takes arguments. Using it with 1888 arguments for changing the selection was deprecated in Python 3.6. Use 1889 specialized methods like :meth:`~tkinter.ttk.Treeview.selection_set` for 1890 changing the selection. (Contributed by Serhiy Storchaka in :issue:`31508`.) 1891 1892* The :meth:`writexml`, :meth:`toxml` and :meth:`toprettyxml` methods of 1893 :mod:`xml.dom.minidom`, and the :meth:`write` method of :mod:`xml.etree`, 1894 now preserve the attribute order specified by the user. 1895 (Contributed by Diego Rojas and Raymond Hettinger in :issue:`34160`.) 1896 1897* A :mod:`dbm.dumb` database opened with flags ``'r'`` is now read-only. 1898 :func:`dbm.dumb.open` with flags ``'r'`` and ``'w'`` no longer creates 1899 a database if it does not exist. 1900 (Contributed by Serhiy Storchaka in :issue:`32749`.) 1901 1902* The ``doctype()`` method defined in a subclass of 1903 :class:`~xml.etree.ElementTree.XMLParser` will no longer be called and will 1904 emit a :exc:`RuntimeWarning` instead of a :exc:`DeprecationWarning`. 1905 Define the :meth:`doctype() <xml.etree.ElementTree.TreeBuilder.doctype>` 1906 method on a target for handling an XML doctype declaration. 1907 (Contributed by Serhiy Storchaka in :issue:`29209`.) 1908 1909* A :exc:`RuntimeError` is now raised when the custom metaclass doesn't 1910 provide the ``__classcell__`` entry in the namespace passed to 1911 ``type.__new__``. A :exc:`DeprecationWarning` was emitted in Python 1912 3.6--3.7. (Contributed by Serhiy Storchaka in :issue:`23722`.) 1913 1914* The :class:`cProfile.Profile` class can now be used as a context 1915 manager. (Contributed by Scott Sanderson in :issue:`29235`.) 1916 1917* :func:`shutil.copyfile`, :func:`shutil.copy`, :func:`shutil.copy2`, 1918 :func:`shutil.copytree` and :func:`shutil.move` use platform-specific 1919 "fast-copy" syscalls (see 1920 :ref:`shutil-platform-dependent-efficient-copy-operations` section). 1921 1922* :func:`shutil.copyfile` default buffer size on Windows was changed from 1923 16 KiB to 1 MiB. 1924 1925* The ``PyGC_Head`` struct has changed completely. All code that touched the 1926 struct member should be rewritten. (See :issue:`33597`.) 1927 1928* The :c:type:`PyInterpreterState` struct has been moved into the "internal" 1929 header files (specifically Include/internal/pycore_pystate.h). An 1930 opaque ``PyInterpreterState`` is still available as part of the public 1931 API (and stable ABI). The docs indicate that none of the struct's 1932 fields are public, so we hope no one has been using them. However, 1933 if you do rely on one or more of those private fields and have no 1934 alternative then please open a BPO issue. We'll work on helping 1935 you adjust (possibly including adding accessor functions to the 1936 public API). (See :issue:`35886`.) 1937 1938* The :meth:`mmap.flush() <mmap.mmap.flush>` method now returns ``None`` on 1939 success and raises an exception on error under all platforms. Previously, 1940 its behavior was platform-dependent: a nonzero value was returned on success; 1941 zero was returned on error under Windows. A zero value was returned on 1942 success; an exception was raised on error under Unix. 1943 (Contributed by Berker Peksag in :issue:`2122`.) 1944 1945* :mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process 1946 external entities by default. 1947 (Contributed by Christian Heimes in :issue:`17239`.) 1948 1949* Deleting a key from a read-only :mod:`dbm` database (:mod:`dbm.dumb`, 1950 :mod:`dbm.gnu` or :mod:`dbm.ndbm`) raises :attr:`error` (:exc:`dbm.dumb.error`, 1951 :exc:`dbm.gnu.error` or :exc:`dbm.ndbm.error`) instead of :exc:`KeyError`. 1952 (Contributed by Xiang Zhang in :issue:`33106`.) 1953 1954* Simplified AST for literals. All constants will be represented as 1955 :class:`ast.Constant` instances. Instantiating old classes ``Num``, 1956 ``Str``, ``Bytes``, ``NameConstant`` and ``Ellipsis`` will return 1957 an instance of ``Constant``. 1958 (Contributed by Serhiy Storchaka in :issue:`32892`.) 1959 1960* :func:`~os.path.expanduser` on Windows now prefers the :envvar:`USERPROFILE` 1961 environment variable and does not use :envvar:`HOME`, which is not normally 1962 set for regular user accounts. 1963 (Contributed by Anthony Sottile in :issue:`36264`.) 1964 1965* The exception :class:`asyncio.CancelledError` now inherits from 1966 :class:`BaseException` rather than :class:`Exception` and no longer inherits 1967 from :class:`concurrent.futures.CancelledError`. 1968 (Contributed by Yury Selivanov in :issue:`32528`.) 1969 1970* The function :func:`asyncio.wait_for` now correctly waits for cancellation 1971 when using an instance of :class:`asyncio.Task`. Previously, upon reaching 1972 *timeout*, it was cancelled and immediately returned. 1973 (Contributed by Elvis Pranskevichus in :issue:`32751`.) 1974 1975* The function :func:`asyncio.BaseTransport.get_extra_info` now returns a safe 1976 to use socket object when 'socket' is passed to the *name* parameter. 1977 (Contributed by Yury Selivanov in :issue:`37027`.) 1978 1979* :class:`asyncio.BufferedProtocol` has graduated to the stable API. 1980 1981.. _bpo-36085-whatsnew: 1982 1983* DLL dependencies for extension modules and DLLs loaded with :mod:`ctypes` on 1984 Windows are now resolved more securely. Only the system paths, the directory 1985 containing the DLL or PYD file, and directories added with 1986 :func:`~os.add_dll_directory` are searched for load-time dependencies. 1987 Specifically, :envvar:`PATH` and the current working directory are no longer 1988 used, and modifications to these will no longer have any effect on normal DLL 1989 resolution. If your application relies on these mechanisms, you should check 1990 for :func:`~os.add_dll_directory` and if it exists, use it to add your DLLs 1991 directory while loading your library. Note that Windows 7 users will need to 1992 ensure that Windows Update KB2533623 has been installed (this is also verified 1993 by the installer). 1994 (Contributed by Steve Dower in :issue:`36085`.) 1995 1996* The header files and functions related to pgen have been removed after its 1997 replacement by a pure Python implementation. (Contributed by Pablo Galindo 1998 in :issue:`36623`.) 1999 2000* :class:`types.CodeType` has a new parameter in the second position of the 2001 constructor (*posonlyargcount*) to support positional-only arguments defined 2002 in :pep:`570`. The first argument (*argcount*) now represents the total 2003 number of positional arguments (including positional-only arguments). The new 2004 ``replace()`` method of :class:`types.CodeType` can be used to make the code 2005 future-proof. 2006 2007 2008Changes in the C API 2009-------------------- 2010 2011* The :c:type:`PyCompilerFlags` structure got a new *cf_feature_version* 2012 field. It should be initialized to ``PY_MINOR_VERSION``. The field is ignored 2013 by default, and is used if and only if ``PyCF_ONLY_AST`` flag is set in 2014 *cf_flags*. 2015 (Contributed by Guido van Rossum in :issue:`35766`.) 2016 2017* The :c:func:`PyEval_ReInitThreads` function has been removed from the C API. 2018 It should not be called explicitly: use :c:func:`PyOS_AfterFork_Child` 2019 instead. 2020 (Contributed by Victor Stinner in :issue:`36728`.) 2021 2022* On Unix, C extensions are no longer linked to libpython except on Android 2023 and Cygwin. When Python is embedded, ``libpython`` must not be loaded with 2024 ``RTLD_LOCAL``, but ``RTLD_GLOBAL`` instead. Previously, using 2025 ``RTLD_LOCAL``, it was already not possible to load C extensions which 2026 were not linked to ``libpython``, like C extensions of the standard 2027 library built by the ``*shared*`` section of ``Modules/Setup``. 2028 (Contributed by Victor Stinner in :issue:`21536`.) 2029 2030* Use of ``#`` variants of formats in parsing or building value (e.g. 2031 :c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`, 2032 etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now. 2033 It will be removed in 3.10 or 4.0. Read :ref:`arg-parsing` for detail. 2034 (Contributed by Inada Naoki in :issue:`36381`.) 2035 2036* Instances of heap-allocated types (such as those created with 2037 :c:func:`PyType_FromSpec`) hold a reference to their type object. 2038 Increasing the reference count of these type objects has been moved from 2039 :c:func:`PyType_GenericAlloc` to the more low-level functions, 2040 :c:func:`PyObject_Init` and :c:func:`PyObject_INIT`. 2041 This makes types created through :c:func:`PyType_FromSpec` behave like 2042 other classes in managed code. 2043 2044 :ref:`Statically allocated types <static-types>` are not affected. 2045 2046 For the vast majority of cases, there should be no side effect. 2047 However, types that manually increase the reference count after allocating 2048 an instance (perhaps to work around the bug) may now become immortal. 2049 To avoid this, these classes need to call Py_DECREF on the type object 2050 during instance deallocation. 2051 2052 To correctly port these types into 3.8, please apply the following 2053 changes: 2054 2055 * Remove :c:macro:`Py_INCREF` on the type object after allocating an 2056 instance - if any. 2057 This may happen after calling :c:func:`PyObject_New`, 2058 :c:func:`PyObject_NewVar`, :c:func:`PyObject_GC_New`, 2059 :c:func:`PyObject_GC_NewVar`, or any other custom allocator that uses 2060 :c:func:`PyObject_Init` or :c:func:`PyObject_INIT`. 2061 2062 Example: 2063 2064 .. code-block:: c 2065 2066 static foo_struct * 2067 foo_new(PyObject *type) { 2068 foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type); 2069 if (foo == NULL) 2070 return NULL; 2071 #if PY_VERSION_HEX < 0x03080000 2072 // Workaround for Python issue 35810; no longer necessary in Python 3.8 2073 PY_INCREF(type) 2074 #endif 2075 return foo; 2076 } 2077 2078 * Ensure that all custom ``tp_dealloc`` functions of heap-allocated types 2079 decrease the type's reference count. 2080 2081 Example: 2082 2083 .. code-block:: c 2084 2085 static void 2086 foo_dealloc(foo_struct *instance) { 2087 PyObject *type = Py_TYPE(instance); 2088 PyObject_GC_Del(instance); 2089 #if PY_VERSION_HEX >= 0x03080000 2090 // This was not needed before Python 3.8 (Python issue 35810) 2091 Py_DECREF(type); 2092 #endif 2093 } 2094 2095 (Contributed by Eddie Elizondo in :issue:`35810`.) 2096 2097* The :c:macro:`Py_DEPRECATED()` macro has been implemented for MSVC. 2098 The macro now must be placed before the symbol name. 2099 2100 Example: 2101 2102 .. code-block:: c 2103 2104 Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void); 2105 2106 (Contributed by Zackery Spytz in :issue:`33407`.) 2107 2108* The interpreter does not pretend to support binary compatibility of 2109 extension types across feature releases, anymore. A :c:type:`PyTypeObject` 2110 exported by a third-party extension module is supposed to have all the 2111 slots expected in the current Python version, including 2112 :c:member:`~PyTypeObject.tp_finalize` (:const:`Py_TPFLAGS_HAVE_FINALIZE` 2113 is not checked anymore before reading :c:member:`~PyTypeObject.tp_finalize`). 2114 2115 (Contributed by Antoine Pitrou in :issue:`32388`.) 2116 2117* The functions :c:func:`PyNode_AddChild` and :c:func:`PyParser_AddToken` now accept 2118 two additional ``int`` arguments *end_lineno* and *end_col_offset*. 2119 2120* The :file:`libpython38.a` file to allow MinGW tools to link directly against 2121 :file:`python38.dll` is no longer included in the regular Windows distribution. 2122 If you require this file, it may be generated with the ``gendef`` and 2123 ``dlltool`` tools, which are part of the MinGW binutils package: 2124 2125 .. code-block:: shell 2126 2127 gendef - python38.dll > tmp.def 2128 dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a 2129 2130 The location of an installed :file:`pythonXY.dll` will depend on the 2131 installation options and the version and language of Windows. See 2132 :ref:`using-on-windows` for more information. The resulting library should be 2133 placed in the same directory as :file:`pythonXY.lib`, which is generally the 2134 :file:`libs` directory under your Python installation. 2135 2136 (Contributed by Steve Dower in :issue:`37351`.) 2137 2138 2139CPython bytecode changes 2140------------------------ 2141 2142* The interpreter loop has been simplified by moving the logic of unrolling 2143 the stack of blocks into the compiler. The compiler emits now explicit 2144 instructions for adjusting the stack of values and calling the 2145 cleaning-up code for :keyword:`break`, :keyword:`continue` and 2146 :keyword:`return`. 2147 2148 Removed opcodes :opcode:`BREAK_LOOP`, :opcode:`CONTINUE_LOOP`, 2149 :opcode:`SETUP_LOOP` and :opcode:`SETUP_EXCEPT`. Added new opcodes 2150 :opcode:`ROT_FOUR`, :opcode:`BEGIN_FINALLY`, :opcode:`CALL_FINALLY` and 2151 :opcode:`POP_FINALLY`. Changed the behavior of :opcode:`END_FINALLY` 2152 and :opcode:`WITH_CLEANUP_START`. 2153 2154 (Contributed by Mark Shannon, Antoine Pitrou and Serhiy Storchaka in 2155 :issue:`17611`.) 2156 2157* Added new opcode :opcode:`END_ASYNC_FOR` for handling exceptions raised 2158 when awaiting a next item in an :keyword:`async for` loop. 2159 (Contributed by Serhiy Storchaka in :issue:`33041`.) 2160 2161* The :opcode:`MAP_ADD` now expects the value as the first element in the 2162 stack and the key as the second element. This change was made so the key 2163 is always evaluated before the value in dictionary comprehensions, as 2164 proposed by :pep:`572`. (Contributed by Jörn Heissler in :issue:`35224`.) 2165 2166 2167Demos and Tools 2168--------------- 2169 2170Added a benchmark script for timing various ways to access variables: 2171``Tools/scripts/var_access_benchmark.py``. 2172(Contributed by Raymond Hettinger in :issue:`35884`.) 2173 2174Here's a summary of performance improvements since Python 3.3: 2175 2176.. code-block:: none 2177 2178 Python version 3.3 3.4 3.5 3.6 3.7 3.8 2179 -------------- --- --- --- --- --- --- 2180 2181 Variable and attribute read access: 2182 read_local 4.0 7.1 7.1 5.4 5.1 3.9 2183 read_nonlocal 5.3 7.1 8.1 5.8 5.4 4.4 2184 read_global 13.3 15.5 19.0 14.3 13.6 7.6 2185 read_builtin 20.0 21.1 21.6 18.5 19.0 7.5 2186 read_classvar_from_class 20.5 25.6 26.5 20.7 19.5 18.4 2187 read_classvar_from_instance 18.5 22.8 23.5 18.8 17.1 16.4 2188 read_instancevar 26.8 32.4 33.1 28.0 26.3 25.4 2189 read_instancevar_slots 23.7 27.8 31.3 20.8 20.8 20.2 2190 read_namedtuple 68.5 73.8 57.5 45.0 46.8 18.4 2191 read_boundmethod 29.8 37.6 37.9 29.6 26.9 27.7 2192 2193 Variable and attribute write access: 2194 write_local 4.6 8.7 9.3 5.5 5.3 4.3 2195 write_nonlocal 7.3 10.5 11.1 5.6 5.5 4.7 2196 write_global 15.9 19.7 21.2 18.0 18.0 15.8 2197 write_classvar 81.9 92.9 96.0 104.6 102.1 39.2 2198 write_instancevar 36.4 44.6 45.8 40.0 38.9 35.5 2199 write_instancevar_slots 28.7 35.6 36.1 27.3 26.6 25.7 2200 2201 Data structure read access: 2202 read_list 19.2 24.2 24.5 20.8 20.8 19.0 2203 read_deque 19.9 24.7 25.5 20.2 20.6 19.8 2204 read_dict 19.7 24.3 25.7 22.3 23.0 21.0 2205 read_strdict 17.9 22.6 24.3 19.5 21.2 18.9 2206 2207 Data structure write access: 2208 write_list 21.2 27.1 28.5 22.5 21.6 20.0 2209 write_deque 23.8 28.7 30.1 22.7 21.8 23.5 2210 write_dict 25.9 31.4 33.3 29.3 29.2 24.7 2211 write_strdict 22.9 28.4 29.9 27.5 25.2 23.1 2212 2213 Stack (or queue) operations: 2214 list_append_pop 144.2 93.4 112.7 75.4 74.2 50.8 2215 deque_append_pop 30.4 43.5 57.0 49.4 49.2 42.5 2216 deque_append_popleft 30.8 43.7 57.3 49.7 49.7 42.8 2217 2218 Timing loop: 2219 loop_overhead 0.3 0.5 0.6 0.4 0.3 0.3 2220 2221The benchmarks were measured on an 2222`Intel® Core™ i7-4960HQ processor 2223<https://ark.intel.com/content/www/us/en/ark/products/76088/intel-core-i7-4960hq-processor-6m-cache-up-to-3-80-ghz.html>`_ 2224running the macOS 64-bit builds found at 2225`python.org <https://www.python.org/downloads/mac-osx/>`_. 2226The benchmark script displays timings in nanoseconds. 2227 2228 2229Notable changes in Python 3.8.1 2230=============================== 2231 2232Due to significant security concerns, the *reuse_address* parameter of 2233:meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This is 2234because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more 2235details, see the documentation for ``loop.create_datagram_endpoint()``. 2236(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in 2237:issue:`37228`.) 2238 2239Notable changes in Python 3.8.8 2240=============================== 2241 2242Earlier Python versions allowed using both ``;`` and ``&`` as 2243query parameter separators in :func:`urllib.parse.parse_qs` and 2244:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with 2245newer W3C recommendations, this has been changed to allow only a single 2246separator key, with ``&`` as the default. This change also affects 2247:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected 2248functions internally. For more details, please see their respective 2249documentation. 2250(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) 2251 2252Notable changes in Python 3.8.12 2253================================ 2254 2255Starting with Python 3.8.12 the :mod:`ipaddress` module no longer accepts 2256any leading zeros in IPv4 address strings. Leading zeros are ambiguous and 2257interpreted as octal notation by some libraries. For example the legacy 2258function :func:`socket.inet_aton` treats leading zeros as octal notation. 2259glibc implementation of modern :func:`~socket.inet_pton` does not accept 2260any leading zeros. 2261 2262(Originally contributed by Christian Heimes in :issue:`36384`, and backported 2263to 3.8 by Achraf Merzouki.) 2264