| **************************** | |
| What's New In Python 3.7 | |
| **************************** | |
| :Editor: Elvis Pranskevichus <elvis@magic.io> | |
| .. Rules for maintenance: | |
| * Anyone can add text to this document. Do not spend very much time | |
| on the wording of your changes, because your text will probably | |
| get rewritten to some degree. | |
| * The maintainer will go through Misc/NEWS periodically and add | |
| changes; it's therefore more important to add your changes to | |
| Misc/NEWS than to this file. | |
| * This is not a complete list of every single change; completeness | |
| is the purpose of Misc/NEWS. Some changes I consider too small | |
| or esoteric to include. If such a change is added to the text, | |
| I'll just remove it. (This is another reason you shouldn't spend | |
| too much time on writing your addition.) | |
| * If you want to draw your new text to the attention of the | |
| maintainer, add 'XXX' to the beginning of the paragraph or | |
| section. | |
| * It's OK to just add a fragmentary note about a change. For | |
| example: "XXX Describe the transmogrify() function added to the | |
| socket module." The maintainer will research the change and | |
| write the necessary text. | |
| * You can comment out your additions if you like, but it's not | |
| necessary (especially when a final release is some months away). | |
| * Credit the author of a patch or bugfix. Just the name is | |
| sufficient; the e-mail address isn't necessary. | |
| * It's helpful to add the bug/patch number as a comment: | |
| XXX Describe the transmogrify() function added to the socket | |
| module. | |
| (Contributed by P.Y. Developer in :issue:`12345`.) | |
| This saves the maintainer the effort of going through the Git log | |
| when researching a change. | |
| This article explains the new features in Python 3.7, compared to 3.6. | |
| Python 3.7 was released on June 27, 2018. | |
| For full details, see the :ref:`changelog <changelog>`. | |
| Summary -- Release Highlights | |
| ============================= | |
| .. This section singles out the most important changes in Python 3.7. | |
| Brevity is key. | |
| New syntax features: | |
| * :ref:`PEP 563 <whatsnew37-pep563>`, postponed evaluation of type annotations. | |
| Backwards incompatible syntax changes: | |
| * :keyword:`async` and :keyword:`await` are now reserved keywords. | |
| New library modules: | |
| * :mod:`contextvars`: :ref:`PEP 567 -- Context Variables <whatsnew37-pep567>` | |
| * :mod:`dataclasses`: :ref:`PEP 557 -- Data Classes <whatsnew37-pep557>` | |
| * :ref:`whatsnew37_importlib_resources` | |
| New built-in features: | |
| * :ref:`PEP 553 <whatsnew37-pep553>`, the new :func:`breakpoint` function. | |
| Python data model improvements: | |
| * :ref:`PEP 562 <whatsnew37-pep562>`, customization of access to | |
| module attributes. | |
| * :ref:`PEP 560 <whatsnew37-pep560>`, core support for typing module and | |
| generic types. | |
| * the insertion-order preservation nature of :ref:`dict <typesmapping>` | |
| objects `has been declared`_ to be an official | |
| part of the Python language spec. | |
| .. _has been declared: https://mail.python.org/pipermail/python-dev/2017-December/151283.html | |
| Significant improvements in the standard library: | |
| * The :mod:`asyncio` module has received new features, significant | |
| :ref:`usability and performance improvements <whatsnew37_asyncio>`. | |
| * The :mod:`time` module gained support for | |
| :ref:`functions with nanosecond resolution <whatsnew37-pep564>`. | |
| CPython implementation improvements: | |
| * Avoiding the use of ASCII as a default text encoding: | |
| * :ref:`PEP 538 <whatsnew37-pep538>`, legacy C locale coercion | |
| * :ref:`PEP 540 <whatsnew37-pep540>`, forced UTF-8 runtime mode | |
| * :ref:`PEP 552 <whatsnew37-pep552>`, deterministic .pycs | |
| * :ref:`New Python Development Mode <whatsnew37-devmode>` | |
| * :ref:`PEP 565 <whatsnew37-pep565>`, improved :exc:`DeprecationWarning` | |
| handling | |
| C API improvements: | |
| * :ref:`PEP 539 <whatsnew37-pep539>`, new C API for thread-local storage | |
| Documentation improvements: | |
| * :ref:`PEP 545 <whatsnew37-pep545>`, Python documentation translations | |
| * New documentation translations: `Japanese <https://docs.python.org/ja/>`_, | |
| `French <https://docs.python.org/fr/>`_, and | |
| `Korean <https://docs.python.org/ko/>`_. | |
| This release features notable performance improvements in many areas. | |
| The :ref:`whatsnew37-perf` section lists them in detail. | |
| For a list of changes that may affect compatibility with previous Python | |
| releases please refer to the :ref:`porting-to-python-37` section. | |
| New Features | |
| ============ | |
| .. _whatsnew37-pep563: | |
| PEP 563: Postponed Evaluation of Annotations | |
| -------------------------------------------- | |
| The advent of type hints in Python uncovered two glaring usability issues | |
| with the functionality of annotations added in :pep:`3107` and refined | |
| further in :pep:`526`: | |
| * annotations could only use names which were already available in the | |
| current scope, in other words they didn't support forward references | |
| of any kind; and | |
| * annotating source code had adverse effects on startup time of Python | |
| programs. | |
| Both of these issues are fixed by postponing the evaluation of | |
| annotations. Instead of compiling code which executes expressions in | |
| annotations at their definition time, the compiler stores the annotation | |
| in a string form equivalent to the AST of the expression in question. | |
| If needed, annotations can be resolved at runtime using | |
| :func:`typing.get_type_hints`. In the common case where this is not | |
| required, the annotations are cheaper to store (since short strings | |
| are interned by the interpreter) and make startup time faster. | |
| Usability-wise, annotations now support forward references, making the | |
| following syntax valid:: | |
| class C: | |
| @classmethod | |
| def from_string(cls, source: str) -> C: | |
| ... | |
| def validate_b(self, obj: B) -> bool: | |
| ... | |
| class B: | |
| ... | |
| Since this change breaks compatibility, the new behavior needs to be enabled | |
| on a per-module basis in Python 3.7 using a :mod:`__future__` import:: | |
| from __future__ import annotations | |
| It will become the default in Python 3.10. | |
| .. seealso:: | |
| :pep:`563` -- Postponed evaluation of annotations | |
| PEP written and implemented by Ćukasz Langa. | |
| .. _whatsnew37-pep538: | |
| PEP 538: Legacy C Locale Coercion | |
| --------------------------------- | |
| An ongoing challenge within the Python 3 series has been determining a sensible | |
| default strategy for handling the "7-bit ASCII" text encoding assumption | |
| currently implied by the use of the default C or POSIX locale on non-Windows | |
| platforms. | |
| :pep:`538` updates the default interpreter command line interface to | |
| automatically coerce that locale to an available UTF-8 based locale as | |
| described in the documentation of the new :envvar:`PYTHONCOERCECLOCALE` | |
| environment variable. Automatically setting ``LC_CTYPE`` this way means that | |
| both the core interpreter and locale-aware C extensions (such as | |
| :mod:`readline`) will assume the use of UTF-8 as the default text encoding, | |
| rather than ASCII. | |
| The platform support definition in :pep:`11` has also been updated to limit | |
| full text handling support to suitably configured non-ASCII based locales. | |
| As part of this change, the default error handler for :data:`~sys.stdin` and | |
| :data:`~sys.stdout` is now ``surrogateescape`` (rather than ``strict``) when | |
| using any of the defined coercion target locales (currently ``C.UTF-8``, | |
| ``C.utf8``, and ``UTF-8``). The default error handler for :data:`~sys.stderr` | |
| continues to be ``backslashreplace``, regardless of locale. | |
| Locale coercion is silent by default, but to assist in debugging potentially | |
| locale related integration problems, explicit warnings (emitted directly on | |
| :data:`~sys.stderr`) can be requested by setting ``PYTHONCOERCECLOCALE=warn``. | |
| This setting will also cause the Python runtime to emit a warning if the | |
| legacy C locale remains active when the core interpreter is initialized. | |
| While :pep:`538`'s locale coercion has the benefit of also affecting extension | |
| modules (such as GNU ``readline``), as well as child processes (including those | |
| running non-Python applications and older versions of Python), it has the | |
| downside of requiring that a suitable target locale be present on the running | |
| system. To better handle the case where no suitable target locale is available | |
| (as occurs on RHEL/CentOS 7, for example), Python 3.7 also implements | |
| :ref:`whatsnew37-pep540`. | |
| .. seealso:: | |
| :pep:`538` -- Coercing the legacy C locale to a UTF-8 based locale | |
| PEP written and implemented by Nick Coghlan. | |
| .. _whatsnew37-pep540: | |
| PEP 540: Forced UTF-8 Runtime Mode | |
| ----------------------------------- | |
| The new :option:`-X` ``utf8`` command line option and :envvar:`PYTHONUTF8` | |
| environment variable can be used to enable the CPython *UTF-8 mode*. | |
| When in UTF-8 mode, CPython ignores the locale settings, and uses the | |
| UTF-8 encoding by default. The error handlers for :data:`sys.stdin` and | |
| :data:`sys.stdout` streams are set to ``surrogateescape``. | |
| The forced UTF-8 mode can be used to change the text handling behavior in | |
| an embedded Python interpreter without changing the locale settings of | |
| an embedding application. | |
| While :pep:`540`'s UTF-8 mode has the benefit of working regardless of which | |
| locales are available on the running system, it has the downside of having no | |
| effect on extension modules (such as GNU ``readline``), child processes running | |
| non-Python applications, and child processes running older versions of Python. | |
| To reduce the risk of corrupting text data when communicating with such | |
| components, Python 3.7 also implements :ref:`whatsnew37-pep540`). | |
| The UTF-8 mode is enabled by default when the locale is ``C`` or ``POSIX``, and | |
| the :pep:`538` locale coercion feature fails to change it to a UTF-8 based | |
| alternative (whether that failure is due to ``PYTHONCOERCECLOCALE=0`` being set, | |
| ``LC_ALL`` being set, or the lack of a suitable target locale). | |
| .. seealso:: | |
| :pep:`540` -- Add a new UTF-8 mode | |
| PEP written and implemented by Victor Stinner | |
| .. _whatsnew37-pep553: | |
| PEP 553: Built-in ``breakpoint()`` | |
| ---------------------------------- | |
| Python 3.7 includes the new built-in :func:`breakpoint` function as | |
| an easy and consistent way to enter the Python debugger. | |
| Built-in ``breakpoint()`` calls :func:`sys.breakpointhook`. By default, the | |
| latter imports :mod:`pdb` and then calls ``pdb.set_trace()``, but by binding | |
| ``sys.breakpointhook()`` to the function of your choosing, ``breakpoint()`` can | |
| enter any debugger. Additionally, the environment variable | |
| :envvar:`PYTHONBREAKPOINT` can be set to the callable of your debugger of | |
| choice. Set ``PYTHONBREAKPOINT=0`` to completely disable built-in | |
| ``breakpoint()``. | |
| .. seealso:: | |
| :pep:`553` -- Built-in breakpoint() | |
| PEP written and implemented by Barry Warsaw | |
| .. _whatsnew37-pep539: | |
| PEP 539: New C API for Thread-Local Storage | |
| ------------------------------------------- | |
| While Python provides a C API for thread-local storage support; the existing | |
| :ref:`Thread Local Storage (TLS) API <thread-local-storage-api>` has used | |
| :c:type:`int` to represent TLS keys across all platforms. This has not | |
| generally been a problem for officially-support platforms, but that is neither | |
| POSIX-compliant, nor portable in any practical sense. | |
| :pep:`539` changes this by providing a new :ref:`Thread Specific Storage (TSS) | |
| API <thread-specific-storage-api>` to CPython which supersedes use of the | |
| existing TLS API within the CPython interpreter, while deprecating the existing | |
| API. The TSS API uses a new type :c:type:`Py_tss_t` instead of :c:type:`int` | |
| to represent TSS keys--an opaque type the definition of which may depend on | |
| the underlying TLS implementation. Therefore, this will allow to build CPython | |
| on platforms where the native TLS key is defined in a way that cannot be safely | |
| cast to :c:type:`int`. | |
| Note that on platforms where the native TLS key is defined in a way that cannot | |
| be safely cast to :c:type:`int`, all functions of the existing TLS API will be | |
| no-op and immediately return failure. This indicates clearly that the old API | |
| is not supported on platforms where it cannot be used reliably, and that no | |
| effort will be made to add such support. | |
| .. seealso:: | |
| :pep:`539` -- A New C-API for Thread-Local Storage in CPython | |
| PEP written by Erik M. Bray; implementation by Masayuki Yamamoto. | |
| .. _whatsnew37-pep562: | |
| PEP 562: Customization of Access to Module Attributes | |
| ----------------------------------------------------- | |
| Python 3.7 allows defining :meth:`__getattr__` on modules and will call | |
| it whenever a module attribute is otherwise not found. Defining | |
| :meth:`__dir__` on modules is now also allowed. | |
| A typical example of where this may be useful is module attribute deprecation | |
| and lazy loading. | |
| .. seealso:: | |
| :pep:`562` -- Module ``__getattr__`` and ``__dir__`` | |
| PEP written and implemented by Ivan Levkivskyi | |
| .. _whatsnew37-pep564: | |
| PEP 564: New Time Functions With Nanosecond Resolution | |
| ------------------------------------------------------ | |
| The resolution of clocks in modern systems can exceed the limited precision | |
| of a floating point number returned by the :func:`time.time` function | |
| and its variants. To avoid loss of precision, :pep:`564` adds six new | |
| "nanosecond" variants of the existing timer functions to the :mod:`time` | |
| module: | |
| * :func:`time.clock_gettime_ns` | |
| * :func:`time.clock_settime_ns` | |
| * :func:`time.monotonic_ns` | |
| * :func:`time.perf_counter_ns` | |
| * :func:`time.process_time_ns` | |
| * :func:`time.time_ns` | |
| The new functions return the number of nanoseconds as an integer value. | |
| `Measurements <https://www.python.org/dev/peps/pep-0564/#annex-clocks-resolution-in-python>`_ | |
| show that on Linux and Windows the resolution of :func:`time.time_ns` is | |
| approximately 3 times better than that of :func:`time.time`. | |
| .. seealso:: | |
| :pep:`564` -- Add new time functions with nanosecond resolution | |
| PEP written and implemented by Victor Stinner | |
| .. _whatsnew37-pep565: | |
| PEP 565: Show DeprecationWarning in ``__main__`` | |
| ------------------------------------------------ | |
| The default handling of :exc:`DeprecationWarning` has been changed such that | |
| these warnings are once more shown by default, but only when the code | |
| triggering them is running directly in the :mod:`__main__` module. As a result, | |
| developers of single file scripts and those using Python interactively should | |
| once again start seeing deprecation warnings for the APIs they use, but | |
| deprecation warnings triggered by imported application, library and framework | |
| modules will continue to be hidden by default. | |
| As a result of this change, the standard library now allows developers to choose | |
| between three different deprecation warning behaviours: | |
| * :exc:`FutureWarning`: always displayed by default, recommended for warnings | |
| intended to be seen by application end users (e.g. for deprecated application | |
| configuration settings). | |
| * :exc:`DeprecationWarning`: displayed by default only in :mod:`__main__` and when | |
| running tests, recommended for warnings intended to be seen by other Python | |
| developers where a version upgrade may result in changed behaviour or an | |
| error. | |
| * :exc:`PendingDeprecationWarning`: displayed by default only when running | |
| tests, intended for cases where a future version upgrade will change the | |
| warning category to :exc:`DeprecationWarning` or :exc:`FutureWarning`. | |
| Previously both :exc:`DeprecationWarning` and :exc:`PendingDeprecationWarning` | |
| were only visible when running tests, which meant that developers primarily | |
| writing single file scripts or using Python interactively could be surprised | |
| by breaking changes in the APIs they used. | |
| .. seealso:: | |
| :pep:`565` -- Show DeprecationWarning in ``__main__`` | |
| PEP written and implemented by Nick Coghlan | |
| .. _whatsnew37-pep560: | |
| PEP 560: Core Support for ``typing`` module and Generic Types | |
| ------------------------------------------------------------- | |
| Initially :pep:`484` was designed in such way that it would not introduce *any* | |
| changes to the core CPython interpreter. Now type hints and the :mod:`typing` | |
| module are extensively used by the community, so this restriction is removed. | |
| The PEP introduces two special methods :meth:`__class_getitem__` and | |
| ``__mro_entries__``, these methods are now used by most classes and special | |
| constructs in :mod:`typing`. As a result, the speed of various operations | |
| with types increased up to 7 times, the generic types can be used without | |
| metaclass conflicts, and several long standing bugs in :mod:`typing` module are | |
| fixed. | |
| .. seealso:: | |
| :pep:`560` -- Core support for typing module and generic types | |
| PEP written and implemented by Ivan Levkivskyi | |
| .. _whatsnew37-pep552: | |
| PEP 552: Hash-based .pyc Files | |
| ------------------------------ | |
| Python has traditionally checked the up-to-dateness of bytecode cache files | |
| (i.e., ``.pyc`` files) by comparing the source metadata (last-modified timestamp | |
| and size) with source metadata saved in the cache file header when it was | |
| generated. While effective, this invalidation method has its drawbacks. When | |
| filesystem timestamps are too coarse, Python can miss source updates, leading to | |
| user confusion. Additionally, having a timestamp in the cache file is | |
| problematic for `build reproducibility <https://reproducible-builds.org/>`_ and | |
| content-based build systems. | |
| :pep:`552` extends the pyc format to allow the hash of the source file to be | |
| used for invalidation instead of the source timestamp. Such ``.pyc`` files are | |
| called "hash-based". By default, Python still uses timestamp-based invalidation | |
| and does not generate hash-based ``.pyc`` files at runtime. Hash-based ``.pyc`` | |
| files may be generated with :mod:`py_compile` or :mod:`compileall`. | |
| Hash-based ``.pyc`` files come in two variants: checked and unchecked. Python | |
| validates checked hash-based ``.pyc`` files against the corresponding source | |
| files at runtime but doesn't do so for unchecked hash-based pycs. Unchecked | |
| hash-based ``.pyc`` files are a useful performance optimization for environments | |
| where a system external to Python (e.g., the build system) is responsible for | |
| keeping ``.pyc`` files up-to-date. | |
| See :ref:`pyc-invalidation` for more information. | |
| .. seealso:: | |
| :pep:`552` -- Deterministic pycs | |
| PEP written and implemented by Benjamin Peterson | |
| .. _whatsnew37-pep545: | |
| PEP 545: Python Documentation Translations | |
| ------------------------------------------ | |
| :pep:`545` describes the process of creating and maintaining Python | |
| documentation translations. | |
| Three new translations have been added: | |
| - Japanese: https://docs.python.org/ja/ | |
| - French: https://docs.python.org/fr/ | |
| - Korean: https://docs.python.org/ko/ | |
| .. seealso:: | |
| :pep:`545` -- Python Documentation Translations | |
| PEP written and implemented by Julien Palard, Inada Naoki, and | |
| Victor Stinner. | |
| .. _whatsnew37-devmode: | |
| Python Development Mode (-X dev) | |
| -------------------------------- | |
| The new :option:`-X` ``dev`` command line option or the new | |
| :envvar:`PYTHONDEVMODE` environment variable can be used to enable | |
| :ref:`Python Development Mode <devmode>`. When in development mode, Python performs | |
| additional runtime checks that are too expensive to be enabled by default. | |
| See :ref:`Python Development Mode <devmode>` documentation for the full | |
| description. | |
| Other Language Changes | |
| ====================== | |
| * An :keyword:`await` expression and comprehensions containing an | |
| :keyword:`async for` clause were illegal in the expressions in | |
| :ref:`formatted string literals <f-strings>` due to a problem with the | |
| implementation. In Python 3.7 this restriction was lifted. | |
| * More than 255 arguments can now be passed to a function, and a function can | |
| now have more than 255 parameters. (Contributed by Serhiy Storchaka in | |
| :issue:`12844` and :issue:`18896`.) | |
| * :meth:`bytes.fromhex` and :meth:`bytearray.fromhex` now ignore all ASCII | |
| whitespace, not only spaces. (Contributed by Robert Xiao in :issue:`28927`.) | |
| * :class:`str`, :class:`bytes`, and :class:`bytearray` gained support for | |
| the new :meth:`isascii() <str.isascii>` method, which can be used to | |
| test if a string or bytes contain only the ASCII characters. | |
| (Contributed by INADA Naoki in :issue:`32677`.) | |
| * :exc:`ImportError` now displays module name and module ``__file__`` path when | |
| ``from ... import ...`` fails. (Contributed by Matthias Bussonnier in | |
| :issue:`29546`.) | |
| * Circular imports involving absolute imports with binding a submodule to | |
| a name are now supported. | |
| (Contributed by Serhiy Storchaka in :issue:`30024`.) | |
| * ``object.__format__(x, '')`` is now equivalent to ``str(x)`` rather than | |
| ``format(str(self), '')``. | |
| (Contributed by Serhiy Storchaka in :issue:`28974`.) | |
| * In order to better support dynamic creation of stack traces, | |
| :class:`types.TracebackType` can now be instantiated from Python code, and | |
| the ``tb_next`` attribute on :ref:`tracebacks <traceback-objects>` is now | |
| writable. | |
| (Contributed by Nathaniel J. Smith in :issue:`30579`.) | |
| * When using the :option:`-m` switch, ``sys.path[0]`` is now eagerly expanded | |
| to the full starting directory path, rather than being left as the empty | |
| directory (which allows imports from the *current* working directory at the | |
| time when an import occurs) | |
| (Contributed by Nick Coghlan in :issue:`33053`.) | |
| * The new :option:`-X` ``importtime`` option or the | |
| :envvar:`PYTHONPROFILEIMPORTTIME` environment variable can be used to show | |
| the timing of each module import. | |
| (Contributed by Victor Stinner in :issue:`31415`.) | |
| New Modules | |
| =========== | |
| .. _whatsnew37-pep567: | |
| contextvars | |
| ----------- | |
| The new :mod:`contextvars` module and a set of | |
| :ref:`new C APIs <contextvarsobjects>` introduce | |
| support for *context variables*. Context variables are conceptually | |
| similar to thread-local variables. Unlike TLS, context variables | |
| support asynchronous code correctly. | |
| The :mod:`asyncio` and :mod:`decimal` modules have been updated to use | |
| and support context variables out of the box. Particularly the active | |
| decimal context is now stored in a context variable, which allows | |
| decimal operations to work with the correct context in asynchronous code. | |
| .. seealso:: | |
| :pep:`567` -- Context Variables | |
| PEP written and implemented by Yury Selivanov | |
| .. _whatsnew37-pep557: | |
| dataclasses | |
| ----------- | |
| The new :func:`~dataclasses.dataclass` decorator provides a way to declare | |
| *data classes*. A data class describes its attributes using class variable | |
| annotations. Its constructor and other magic methods, such as | |
| :meth:`~object.__repr__`, :meth:`~object.__eq__`, and | |
| :meth:`~object.__hash__` are generated automatically. | |
| Example:: | |
| @dataclass | |
| class Point: | |
| x: float | |
| y: float | |
| z: float = 0.0 | |
| p = Point(1.5, 2.5) | |
| print(p) # produces "Point(x=1.5, y=2.5, z=0.0)" | |
| .. seealso:: | |
| :pep:`557` -- Data Classes | |
| PEP written and implemented by Eric V. Smith | |
| .. _whatsnew37_importlib_resources: | |
| importlib.resources | |
| ------------------- | |
| The new :mod:`importlib.resources` module provides several new APIs and one | |
| new ABC for access to, opening, and reading *resources* inside packages. | |
| Resources are roughly similar to files inside packages, but they needn't | |
| be actual files on the physical file system. Module loaders can provide a | |
| :meth:`get_resource_reader()` function which returns | |
| a :class:`importlib.abc.ResourceReader` instance to support this | |
| new API. Built-in file path loaders and zip file loaders both support this. | |
| Contributed by Barry Warsaw and Brett Cannon in :issue:`32248`. | |
| .. seealso:: | |
| `importlib_resources <http://importlib-resources.readthedocs.io/en/latest/>`_ | |
| -- a PyPI backport for earlier Python versions. | |
| Improved Modules | |
| ================ | |
| argparse | |
| -------- | |
| The new :meth:`ArgumentParser.parse_intermixed_args() | |
| <argparse.ArgumentParser.parse_intermixed_args>` | |
| method allows intermixing options and positional arguments. | |
| (Contributed by paul.j3 in :issue:`14191`.) | |
| .. _whatsnew37_asyncio: | |
| asyncio | |
| ------- | |
| The :mod:`asyncio` module has received many new features, usability and | |
| :ref:`performance improvements <whatsnew37-asyncio-perf>`. Notable changes | |
| include: | |
| * The new :term:`provisional <provisional API>` :func:`asyncio.run` function can | |
| be used to run a coroutine from synchronous code by automatically creating and | |
| destroying the event loop. | |
| (Contributed by Yury Selivanov in :issue:`32314`.) | |
| * asyncio gained support for :mod:`contextvars`. | |
| :meth:`loop.call_soon() <asyncio.loop.call_soon>`, | |
| :meth:`loop.call_soon_threadsafe() <asyncio.loop.call_soon_threadsafe>`, | |
| :meth:`loop.call_later() <asyncio.loop.call_later>`, | |
| :meth:`loop.call_at() <asyncio.loop.call_at>`, and | |
| :meth:`Future.add_done_callback() <asyncio.Future.add_done_callback>` | |
| have a new optional keyword-only *context* parameter. | |
| :class:`Tasks <asyncio.Task>` now track their context automatically. | |
| See :pep:`567` for more details. | |
| (Contributed by Yury Selivanov in :issue:`32436`.) | |
| * The new :func:`asyncio.create_task` function has been added as a shortcut | |
| to ``asyncio.get_event_loop().create_task()``. | |
| (Contributed by Andrew Svetlov in :issue:`32311`.) | |
| * The new :meth:`loop.start_tls() <asyncio.loop.start_tls>` | |
| method can be used to upgrade an existing connection to TLS. | |
| (Contributed by Yury Selivanov in :issue:`23749`.) | |
| * The new :meth:`loop.sock_recv_into() <asyncio.loop.sock_recv_into>` | |
| method allows reading data from a socket directly into a provided buffer making | |
| it possible to reduce data copies. | |
| (Contributed by Antoine Pitrou in :issue:`31819`.) | |
| * The new :func:`asyncio.current_task` function returns the currently running | |
| :class:`~asyncio.Task` instance, and the new :func:`asyncio.all_tasks` | |
| function returns a set of all existing ``Task`` instances in a given loop. | |
| The :meth:`Task.current_task() <asyncio.Task.current_task>` and | |
| :meth:`Task.all_tasks() <asyncio.Task.all_tasks>` methods have been deprecated. | |
| (Contributed by Andrew Svetlov in :issue:`32250`.) | |
| * The new *provisional* :class:`~asyncio.BufferedProtocol` class allows | |
| implementing streaming protocols with manual control over the receive buffer. | |
| (Contributed by Yury Selivanov in :issue:`32251`.) | |
| * The new :func:`asyncio.get_running_loop` function returns the currently | |
| running loop, and raises a :exc:`RuntimeError` if no loop is running. | |
| This is in contrast with :func:`asyncio.get_event_loop`, which will *create* | |
| a new event loop if none is running. | |
| (Contributed by Yury Selivanov in :issue:`32269`.) | |
| * The new :meth:`StreamWriter.wait_closed() <asyncio.StreamWriter.wait_closed>` | |
| coroutine method allows waiting until the stream writer is closed. The new | |
| :meth:`StreamWriter.is_closing() <asyncio.StreamWriter.is_closing>` method | |
| can be used to determine if the writer is closing. | |
| (Contributed by Andrew Svetlov in :issue:`32391`.) | |
| * The new :meth:`loop.sock_sendfile() <asyncio.loop.sock_sendfile>` | |
| coroutine method allows sending files using :mod:`os.sendfile` when possible. | |
| (Contributed by Andrew Svetlov in :issue:`32410`.) | |
| * The new :meth:`Future.get_loop() <asyncio.Future.get_loop>` and | |
| ``Task.get_loop()`` methods return the instance of the loop on which a task or | |
| a future were created. | |
| :meth:`Server.get_loop() <asyncio.Server.get_loop>` allows doing the same for | |
| :class:`asyncio.Server` objects. | |
| (Contributed by Yury Selivanov in :issue:`32415` and | |
| Srinivas Reddy Thatiparthy in :issue:`32418`.) | |
| * It is now possible to control how instances of :class:`asyncio.Server` begin | |
| serving. Previously, the server would start serving immediately when created. | |
| The new *start_serving* keyword argument to | |
| :meth:`loop.create_server() <asyncio.loop.create_server>` and | |
| :meth:`loop.create_unix_server() <asyncio.loop.create_unix_server>`, | |
| as well as :meth:`Server.start_serving() <asyncio.Server.start_serving>`, and | |
| :meth:`Server.serve_forever() <asyncio.Server.serve_forever>` | |
| can be used to decouple server instantiation and serving. The new | |
| :meth:`Server.is_serving() <asyncio.Server.is_serving>` method returns ``True`` | |
| if the server is serving. :class:`~asyncio.Server` objects are now | |
| asynchronous context managers:: | |
| srv = await loop.create_server(...) | |
| async with srv: | |
| # some code | |
| # At this point, srv is closed and no longer accepts new connections. | |
| (Contributed by Yury Selivanov in :issue:`32662`.) | |
| * Callback objects returned by | |
| :func:`loop.call_later() <asyncio.loop.call_later>` | |
| gained the new :meth:`when() <asyncio.TimerHandle.when>` method which | |
| returns an absolute scheduled callback timestamp. | |
| (Contributed by Andrew Svetlov in :issue:`32741`.) | |
| * The :meth:`loop.create_datagram_endpoint() \ | |
| <asyncio.loop.create_datagram_endpoint>` method | |
| gained support for Unix sockets. | |
| (Contributed by Quentin Dawans in :issue:`31245`.) | |
| * The :func:`asyncio.open_connection`, :func:`asyncio.start_server` functions, | |
| :meth:`loop.create_connection() <asyncio.loop.create_connection>`, | |
| :meth:`loop.create_server() <asyncio.loop.create_server>`, | |
| :meth:`loop.create_accepted_socket() <asyncio.loop.connect_accepted_socket>` | |
| methods and their corresponding UNIX socket variants now accept the | |
| *ssl_handshake_timeout* keyword argument. | |
| (Contributed by Neil Aspinall in :issue:`29970`.) | |
| * The new :meth:`Handle.cancelled() <asyncio.Handle.cancelled>` method returns | |
| ``True`` if the callback was cancelled. | |
| (Contributed by Marat Sharafutdinov in :issue:`31943`.) | |
| * The asyncio source has been converted to use the | |
| :keyword:`async`/:keyword:`await` syntax. | |
| (Contributed by Andrew Svetlov in :issue:`32193`.) | |
| * The new :meth:`ReadTransport.is_reading() <asyncio.ReadTransport.is_reading>` | |
| method can be used to determine the reading state of the transport. | |
| Additionally, calls to | |
| :meth:`ReadTransport.resume_reading() <asyncio.ReadTransport.resume_reading>` | |
| and :meth:`ReadTransport.pause_reading() <asyncio.ReadTransport.pause_reading>` | |
| are now idempotent. | |
| (Contributed by Yury Selivanov in :issue:`32356`.) | |
| * Loop methods which accept socket paths now support passing | |
| :term:`path-like objects <path-like object>`. | |
| (Contributed by Yury Selivanov in :issue:`32066`.) | |
| * In :mod:`asyncio` TCP sockets on Linux are now created with ``TCP_NODELAY`` | |
| flag set by default. | |
| (Contributed by Yury Selivanov and Victor Stinner in :issue:`27456`.) | |
| * Exceptions occurring in cancelled tasks are no longer logged. | |
| (Contributed by Yury Selivanov in :issue:`30508`.) | |
| * New ``WindowsSelectorEventLoopPolicy`` and | |
| ``WindowsProactorEventLoopPolicy`` classes. | |
| (Contributed by Yury Selivanov in :issue:`33792`.) | |
| Several ``asyncio`` APIs have been | |
| :ref:`deprecated <whatsnew37-asyncio-deprecated>`. | |
| binascii | |
| -------- | |
| The :func:`~binascii.b2a_uu` function now accepts an optional *backtick* | |
| keyword argument. When it's true, zeros are represented by ``'`'`` | |
| instead of spaces. (Contributed by Xiang Zhang in :issue:`30103`.) | |
| calendar | |
| -------- | |
| The :class:`~calendar.HTMLCalendar` class has new class attributes which ease | |
| the customization of CSS classes in the produced HTML calendar. | |
| (Contributed by Oz Tiram in :issue:`30095`.) | |
| collections | |
| ----------- | |
| ``collections.namedtuple()`` now supports default values. | |
| (Contributed by Raymond Hettinger in :issue:`32320`.) | |
| compileall | |
| ---------- | |
| :func:`compileall.compile_dir` learned the new *invalidation_mode* parameter, | |
| which can be used to enable | |
| :ref:`hash-based .pyc invalidation <whatsnew37-pep552>`. The invalidation | |
| mode can also be specified on the command line using the new | |
| ``--invalidation-mode`` argument. | |
| (Contributed by Benjamin Peterson in :issue:`31650`.) | |
| concurrent.futures | |
| ------------------ | |
| :class:`ProcessPoolExecutor <concurrent.futures.ProcessPoolExecutor>` and | |
| :class:`ThreadPoolExecutor <concurrent.futures.ThreadPoolExecutor>` now | |
| support the new *initializer* and *initargs* constructor arguments. | |
| (Contributed by Antoine Pitrou in :issue:`21423`.) | |
| The :class:`ProcessPoolExecutor <concurrent.futures.ProcessPoolExecutor>` | |
| can now take the multiprocessing context via the new *mp_context* argument. | |
| (Contributed by Thomas Moreau in :issue:`31540`.) | |
| contextlib | |
| ---------- | |
| The new :func:`~contextlib.nullcontext` is a simpler and faster no-op | |
| context manager than :class:`~contextlib.ExitStack`. | |
| (Contributed by Jesse-Bakker in :issue:`10049`.) | |
| The new :func:`~contextlib.asynccontextmanager`, | |
| :class:`~contextlib.AbstractAsyncContextManager`, and | |
| :class:`~contextlib.AsyncExitStack` have been added to | |
| complement their synchronous counterparts. (Contributed | |
| by Jelle Zijlstra in :issue:`29679` and :issue:`30241`, | |
| and by Alexander Mohr and Ilya Kulakov in :issue:`29302`.) | |
| cProfile | |
| -------- | |
| The :mod:`cProfile` command line now accepts ``-m module_name`` as an | |
| alternative to script path. (Contributed by Sanyam Khurana in :issue:`21862`.) | |
| crypt | |
| ----- | |
| The :mod:`crypt` module now supports the Blowfish hashing method. | |
| (Contributed by Serhiy Storchaka in :issue:`31664`.) | |
| The :func:`~crypt.mksalt` function now allows specifying the number of rounds | |
| for hashing. (Contributed by Serhiy Storchaka in :issue:`31702`.) | |
| datetime | |
| -------- | |
| The new :meth:`datetime.fromisoformat() <datetime.datetime.fromisoformat>` | |
| method constructs a :class:`~datetime.datetime` object from a string | |
| in one of the formats output by | |
| :meth:`datetime.isoformat() <datetime.datetime.isoformat>`. | |
| (Contributed by Paul Ganssle in :issue:`15873`.) | |
| The :class:`tzinfo <datetime.tzinfo>` class now supports sub-minute offsets. | |
| (Contributed by Alexander Belopolsky in :issue:`5288`.) | |
| dbm | |
| --- | |
| :mod:`dbm.dumb` now supports reading read-only files and no longer writes the | |
| index file when it is not changed. | |
| decimal | |
| ------- | |
| The :mod:`decimal` module now uses :ref:`context variables <whatsnew37-pep567>` | |
| to store the decimal context. | |
| (Contributed by Yury Selivanov in :issue:`32630`.) | |
| dis | |
| --- | |
| The :func:`~dis.dis` function is now able to | |
| disassemble nested code objects (the code of comprehensions, generator | |
| expressions and nested functions, and the code used for building nested | |
| classes). The maximum depth of disassembly recursion is controlled by | |
| the new *depth* parameter. | |
| (Contributed by Serhiy Storchaka in :issue:`11822`.) | |
| distutils | |
| --------- | |
| ``README.rst`` is now included in the list of distutils standard READMEs and | |
| therefore included in source distributions. | |
| (Contributed by Ryan Gonzalez in :issue:`11913`.) | |
| enum | |
| ---- | |
| The :class:`Enum <enum.Enum>` learned the new ``_ignore_`` class property, | |
| which allows listing the names of properties which should not become | |
| enum members. | |
| (Contributed by Ethan Furman in :issue:`31801`.) | |
| In Python 3.8, attempting to check for non-Enum objects in :class:`Enum` | |
| classes will raise a :exc:`TypeError` (e.g. ``1 in Color``); similarly, | |
| attempting to check for non-Flag objects in a :class:`Flag` member will | |
| raise :exc:`TypeError` (e.g. ``1 in Perm.RW``); currently, both operations | |
| return :const:`False` instead and are deprecated. | |
| (Contributed by Ethan Furman in :issue:`33217`.) | |
| functools | |
| --------- | |
| :func:`functools.singledispatch` now supports registering implementations | |
| using type annotations. | |
| (Contributed by Ćukasz Langa in :issue:`32227`.) | |
| gc | |
| -- | |
| The new :func:`gc.freeze` function allows freezing all objects tracked | |
| by the garbage collector and excluding them from future collections. | |
| This can be used before a POSIX ``fork()`` call to make the GC copy-on-write | |
| friendly or to speed up collection. The new :func:`gc.unfreeze` functions | |
| reverses this operation. Additionally, :func:`gc.get_freeze_count` can | |
| be used to obtain the number of frozen objects. | |
| (Contributed by Li Zekun in :issue:`31558`.) | |
| hmac | |
| ---- | |
| The :mod:`hmac` module now has an optimized one-shot :func:`~hmac.digest` | |
| function, which is up to three times faster than :func:`~hmac.HMAC`. | |
| (Contributed by Christian Heimes in :issue:`32433`.) | |
| http.client | |
| ----------- | |
| :class:`~http.client.HTTPConnection` and :class:`~http.client.HTTPSConnection` | |
| now support the new *blocksize* argument for improved upload throughput. | |
| (Contributed by Nir Soffer in :issue:`31945`.) | |
| http.server | |
| ----------- | |
| :class:`~http.server.SimpleHTTPRequestHandler` now supports the HTTP | |
| ``If-Modified-Since`` header. The server returns the 304 response status if | |
| the target file was not modified after the time specified in the header. | |
| (Contributed by Pierre Quentel in :issue:`29654`.) | |
| :class:`~http.server.SimpleHTTPRequestHandler` accepts the new *directory* | |
| argument, in addition to the new ``--directory`` command line argument. | |
| With this parameter, the server serves the specified directory, by default it | |
| uses the current working directory. | |
| (Contributed by Stéphane Wirtel and Julien Palard in :issue:`28707`.) | |
| The new :class:`ThreadingHTTPServer <http.server.ThreadingHTTPServer>` class | |
| uses threads to handle requests using :class:`~socketserver.ThreadingMixin`. | |
| It is used when ``http.server`` is run with ``-m``. | |
| (Contributed by Julien Palard in :issue:`31639`.) | |
| idlelib and IDLE | |
| ---------------- | |
| Multiple fixes for autocompletion. (Contributed by Louie Lu in :issue:`15786`.) | |
| Module Browser (on the File menu, formerly called Class Browser), | |
| now displays nested functions and classes in addition to top-level | |
| functions and classes. | |
| (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy | |
| in :issue:`1612262`.) | |
| The Settings dialog (Options, Configure IDLE) has been partly rewritten | |
| to improve both appearance and function. | |
| (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.) | |
| The font sample now includes a selection of non-Latin characters so that | |
| users can better see the effect of selecting a particular font. | |
| (Contributed by Terry Jan Reedy in :issue:`13802`.) | |
| The sample can be edited to include other characters. | |
| (Contributed by Serhiy Storchaka in :issue:`31860`.) | |
| The IDLE features formerly implemented as extensions have been reimplemented | |
| as normal features. Their settings have been moved from the Extensions tab | |
| to other dialog tabs. | |
| (Contributed by Charles Wohlganger and Terry Jan Reedy in :issue:`27099`.) | |
| Editor code context option revised. Box displays all context lines up to | |
| maxlines. Clicking on a context line jumps the editor to that line. Context | |
| colors for custom themes is added to Highlights tab of Settings dialog. | |
| (Contributed by Cheryl Sabella and Terry Jan Reedy in :issue:`33642`, | |
| :issue:`33768`, and :issue:`33679`.) | |
| On Windows, a new API call tells Windows that tk scales for DPI. On Windows | |
| 8.1+ or 10, with DPI compatibility properties of the Python binary | |
| unchanged, and a monitor resolution greater than 96 DPI, this should | |
| make text and lines sharper. It should otherwise have no effect. | |
| (Contributed by Terry Jan Reedy in :issue:`33656`.) | |
| New in 3.7.1: | |
| Output over N lines (50 by default) is squeezed down to a button. | |
| N can be changed in the PyShell section of the General page of the | |
| Settings dialog. Fewer, but possibly extra long, lines can be squeezed by | |
| right clicking on the output. Squeezed output can be expanded in place | |
| by double-clicking the button or into the clipboard or a separate window | |
| by right-clicking the button. (Contributed by Tal Einat in :issue:`1529353`.) | |
| The changes above have been backported to 3.6 maintenance releases. | |
| NEW in 3.7.4: | |
| Add "Run Customized" to the Run menu to run a module with customized | |
| settings. Any command line arguments entered are added to sys.argv. | |
| They re-appear in the box for the next customized run. One can also | |
| suppress the normal Shell main module restart. (Contributed by Cheryl | |
| Sabella, Terry Jan Reedy, and others in :issue:`5680` and :issue:`37627`.) | |
| New in 3.7.5: | |
| Add optional line numbers for IDLE editor windows. Windows | |
| open without line numbers unless set otherwise in the General | |
| tab of the configuration dialog. Line numbers for an existing | |
| window are shown and hidden in the Options menu. | |
| (Contributed by Tal Einat and Saimadhav Heblikar in :issue:`17535`.) | |
| importlib | |
| --------- | |
| The :class:`importlib.abc.ResourceReader` ABC was introduced to | |
| support the loading of resources from packages. See also | |
| :ref:`whatsnew37_importlib_resources`. | |
| (Contributed by Barry Warsaw, Brett Cannon in :issue:`32248`.) | |
| :func:`importlib.reload` now raises :exc:`ModuleNotFoundError` if the module | |
| lacks a spec. | |
| (Contributed by Garvit Khatri in :issue:`29851`.) | |
| :func:`importlib.find_spec` now raises :exc:`ModuleNotFoundError` instead of | |
| :exc:`AttributeError` if the specified parent module is not a package (i.e. | |
| lacks a ``__path__`` attribute). | |
| (Contributed by Milan Oberkirch in :issue:`30436`.) | |
| The new :func:`importlib.source_hash` can be used to compute the hash of | |
| the passed source. A :ref:`hash-based .pyc file <whatsnew37-pep552>` | |
| embeds the value returned by this function. | |
| io | |
| -- | |
| The new :meth:`TextIOWrapper.reconfigure() <io.TextIOWrapper.reconfigure>` | |
| method can be used to reconfigure the text stream with the new settings. | |
| (Contributed by Antoine Pitrou in :issue:`30526` and | |
| INADA Naoki in :issue:`15216`.) | |
| ipaddress | |
| --------- | |
| The new ``subnet_of()`` and ``supernet_of()`` methods of | |
| :class:`ipaddress.IPv6Network` and :class:`ipaddress.IPv4Network` can | |
| be used for network containment tests. | |
| (Contributed by Michel Albert and Cheryl Sabella in :issue:`20825`.) | |
| itertools | |
| --------- | |
| :func:`itertools.islice` now accepts | |
| :meth:`integer-like objects <object.__index__>` as start, stop, | |
| and slice arguments. | |
| (Contributed by Will Roberts in :issue:`30537`.) | |
| locale | |
| ------ | |
| The new *monetary* argument to :func:`locale.format_string` can be used | |
| to make the conversion use monetary thousands separators and | |
| grouping strings. (Contributed by Garvit in :issue:`10379`.) | |
| The :func:`locale.getpreferredencoding` function now always returns ``'UTF-8'`` | |
| on Android or when in the :ref:`forced UTF-8 mode <whatsnew37-pep540>`. | |
| logging | |
| ------- | |
| :class:`~logging.Logger` instances can now be pickled. | |
| (Contributed by Vinay Sajip in :issue:`30520`.) | |
| The new :meth:`StreamHandler.setStream() <logging.StreamHandler.setStream>` | |
| method can be used to replace the logger stream after handler creation. | |
| (Contributed by Vinay Sajip in :issue:`30522`.) | |
| It is now possible to specify keyword arguments to handler constructors in | |
| configuration passed to :func:`logging.config.fileConfig`. | |
| (Contributed by Preston Landers in :issue:`31080`.) | |
| math | |
| ---- | |
| The new :func:`math.remainder` function implements the IEEE 754-style remainder | |
| operation. (Contributed by Mark Dickinson in :issue:`29962`.) | |
| mimetypes | |
| --------- | |
| The MIME type of .bmp has been changed from ``'image/x-ms-bmp'`` to | |
| ``'image/bmp'``. | |
| (Contributed by Nitish Chandra in :issue:`22589`.) | |
| msilib | |
| ------ | |
| The new :meth:`Database.Close() <msilib.Database.Close>` method can be used | |
| to close the :abbr:`MSI` database. | |
| (Contributed by Berker Peksag in :issue:`20486`.) | |
| multiprocessing | |
| --------------- | |
| The new :meth:`Process.close() <multiprocessing.Process.close>` method | |
| explicitly closes the process object and releases all resources associated | |
| with it. :exc:`ValueError` is raised if the underlying process is still | |
| running. | |
| (Contributed by Antoine Pitrou in :issue:`30596`.) | |
| The new :meth:`Process.kill() <multiprocessing.Process.kill>` method can | |
| be used to terminate the process using the :data:`SIGKILL` signal on Unix. | |
| (Contributed by Vitor Pereira in :issue:`30794`.) | |
| Non-daemonic threads created by :class:`~multiprocessing.Process` are now | |
| joined on process exit. | |
| (Contributed by Antoine Pitrou in :issue:`18966`.) | |
| os | |
| -- | |
| :func:`os.fwalk` now accepts the *path* argument as :class:`bytes`. | |
| (Contributed by Serhiy Storchaka in :issue:`28682`.) | |
| :func:`os.scandir` gained support for :ref:`file descriptors <path_fd>`. | |
| (Contributed by Serhiy Storchaka in :issue:`25996`.) | |
| The new :func:`~os.register_at_fork` function allows registering Python | |
| callbacks to be executed at process fork. | |
| (Contributed by Antoine Pitrou in :issue:`16500`.) | |
| Added :func:`os.preadv` (combine the functionality of :func:`os.readv` and | |
| :func:`os.pread`) and :func:`os.pwritev` functions (combine the functionality | |
| of :func:`os.writev` and :func:`os.pwrite`). (Contributed by Pablo Galindo in | |
| :issue:`31368`.) | |
| The mode argument of :func:`os.makedirs` no longer affects the file | |
| permission bits of newly-created intermediate-level directories. | |
| (Contributed by Serhiy Storchaka in :issue:`19930`.) | |
| :func:`os.dup2` now returns the new file descriptor. Previously, ``None`` | |
| was always returned. | |
| (Contributed by Benjamin Peterson in :issue:`32441`.) | |
| The structure returned by :func:`os.stat` now contains the | |
| :attr:`~os.stat_result.st_fstype` attribute on Solaris and its derivatives. | |
| (Contributed by JesĂșs Cea AviĂłn in :issue:`32659`.) | |
| pathlib | |
| ------- | |
| The new :meth:`Path.is_mount() <pathlib.Path.is_mount>` method is now available | |
| on POSIX systems and can be used to determine whether a path is a mount point. | |
| (Contributed by Cooper Ry Lees in :issue:`30897`.) | |
| pdb | |
| --- | |
| :func:`pdb.set_trace` now takes an optional *header* keyword-only | |
| argument. If given, it is printed to the console just before debugging | |
| begins. (Contributed by Barry Warsaw in :issue:`31389`.) | |
| :mod:`pdb` command line now accepts ``-m module_name`` as an alternative to | |
| script file. (Contributed by Mario Corchero in :issue:`32206`.) | |
| py_compile | |
| ---------- | |
| :func:`py_compile.compile` -- and by extension, :mod:`compileall` -- now | |
| respects the :envvar:`SOURCE_DATE_EPOCH` environment variable by | |
| unconditionally creating ``.pyc`` files for hash-based validation. | |
| This allows for guaranteeing | |
| `reproducible builds <https://reproducible-builds.org/>`_ of ``.pyc`` | |
| files when they are created eagerly. (Contributed by Bernhard M. Wiedemann | |
| in :issue:`29708`.) | |
| pydoc | |
| ----- | |
| The pydoc server can now bind to an arbitrary hostname specified by the | |
| new ``-n`` command-line argument. | |
| (Contributed by Feanil Patel in :issue:`31128`.) | |
| queue | |
| ----- | |
| The new :class:`~queue.SimpleQueue` class is an unbounded :abbr:`FIFO` queue. | |
| (Contributed by Antoine Pitrou in :issue:`14976`.) | |
| re | |
| -- | |
| The flags :const:`re.ASCII`, :const:`re.LOCALE` and :const:`re.UNICODE` | |
| can be set within the scope of a group. | |
| (Contributed by Serhiy Storchaka in :issue:`31690`.) | |
| :func:`re.split` now supports splitting on a pattern like ``r'\b'``, | |
| ``'^$'`` or ``(?=-)`` that matches an empty string. | |
| (Contributed by Serhiy Storchaka in :issue:`25054`.) | |
| Regular expressions compiled with the :const:`re.LOCALE` flag no longer | |
| depend on the locale at compile time. Locale settings are applied only | |
| when the compiled regular expression is used. | |
| (Contributed by Serhiy Storchaka in :issue:`30215`.) | |
| :exc:`FutureWarning` is now emitted if a regular expression contains | |
| character set constructs that will change semantically in the future, | |
| such as nested sets and set operations. | |
| (Contributed by Serhiy Storchaka in :issue:`30349`.) | |
| Compiled regular expression and match objects can now be copied | |
| using :func:`copy.copy` and :func:`copy.deepcopy`. | |
| (Contributed by Serhiy Storchaka in :issue:`10076`.) | |
| signal | |
| ------ | |
| The new *warn_on_full_buffer* argument to the :func:`signal.set_wakeup_fd` | |
| function makes it possible to specify whether Python prints a warning on | |
| stderr when the wakeup buffer overflows. | |
| (Contributed by Nathaniel J. Smith in :issue:`30050`.) | |
| socket | |
| ------ | |
| The new :func:`socket.getblocking() <socket.socket.getblocking>` method | |
| returns ``True`` if the socket is in blocking mode and ``False`` otherwise. | |
| (Contributed by Yury Selivanov in :issue:`32373`.) | |
| The new :func:`socket.close` function closes the passed socket file descriptor. | |
| This function should be used instead of :func:`os.close` for better | |
| compatibility across platforms. | |
| (Contributed by Christian Heimes in :issue:`32454`.) | |
| The :mod:`socket` module now exposes the :data:`socket.TCP_CONGESTION` | |
| (Linux 2.6.13), :data:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37), and | |
| :data:`socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constants. | |
| (Contributed by Omar Sandoval in :issue:`26273` and | |
| Nathaniel J. Smith in :issue:`29728`.) | |
| Support for :data:`socket.AF_VSOCK` sockets has been added to allow | |
| communication between virtual machines and their hosts. | |
| (Contributed by Cathy Avery in :issue:`27584`.) | |
| Sockets now auto-detect family, type and protocol from file descriptor | |
| by default. | |
| (Contributed by Christian Heimes in :issue:`28134`.) | |
| socketserver | |
| ------------ | |
| :meth:`socketserver.ThreadingMixIn.server_close` now waits until all non-daemon | |
| threads complete. :meth:`socketserver.ForkingMixIn.server_close` now waits | |
| until all child processes complete. | |
| Add a new :attr:`socketserver.ForkingMixIn.block_on_close` class attribute to | |
| :class:`socketserver.ForkingMixIn` and :class:`socketserver.ThreadingMixIn` | |
| classes. Set the class attribute to ``False`` to get the pre-3.7 behaviour. | |
| sqlite3 | |
| ------- | |
| :class:`sqlite3.Connection` now exposes the :meth:`~sqlite3.Connection.backup` | |
| method when the underlying SQLite library is at version 3.6.11 or higher. | |
| (Contributed by Lele Gaifax in :issue:`27645`.) | |
| The *database* argument of :func:`sqlite3.connect` now accepts any | |
| :term:`path-like object`, instead of just a string. | |
| (Contributed by Anders Lorentsen in :issue:`31843`.) | |
| ssl | |
| --- | |
| The :mod:`ssl` module now uses OpenSSL's builtin API instead of | |
| :func:`~ssl.match_hostname` to check a host name or an IP address. Values | |
| are validated during TLS handshake. Any certificate validation error | |
| including failing the host name check now raises | |
| :exc:`~ssl.SSLCertVerificationError` and aborts the handshake with a proper | |
| TLS Alert message. The new exception contains additional information. | |
| Host name validation can be customized with | |
| :attr:`SSLContext.hostname_checks_common_name <ssl.SSLContext.hostname_checks_common_name>`. | |
| (Contributed by Christian Heimes in :issue:`31399`.) | |
| .. note:: | |
| The improved host name check requires a *libssl* implementation compatible | |
| with OpenSSL 1.0.2 or 1.1. Consequently, OpenSSL 0.9.8 and 1.0.1 are no | |
| longer supported (see :ref:`37-platform-support-removals` for more details). | |
| The ssl module is mostly compatible with LibreSSL 2.7.2 and newer. | |
| The ``ssl`` module no longer sends IP addresses in SNI TLS extension. | |
| (Contributed by Christian Heimes in :issue:`32185`.) | |
| :func:`~ssl.match_hostname` no longer supports partial wildcards like | |
| ``www*.example.org``. | |
| (Contributed by Mandeep Singh in :issue:`23033` and Christian Heimes in | |
| :issue:`31399`.) | |
| The default cipher suite selection of the ``ssl`` module now uses a blacklist | |
| approach rather than a hard-coded whitelist. Python no longer re-enables | |
| ciphers that have been blocked by OpenSSL security updates. Default cipher | |
| suite selection can be configured at compile time. | |
| (Contributed by Christian Heimes in :issue:`31429`.) | |
| Validation of server certificates containing internationalized domain names | |
| (IDNs) is now supported. As part of this change, the | |
| :attr:`SSLSocket.server_hostname <ssl.SSLSocket.server_hostname>` attribute | |
| now stores the expected hostname in A-label form (``"xn--pythn-mua.org"``), | |
| rather than the U-label form (``"pythön.org"``). (Contributed by | |
| Nathaniel J. Smith and Christian Heimes in :issue:`28414`.) | |
| The ``ssl`` module has preliminary and experimental support for TLS 1.3 and | |
| OpenSSL 1.1.1. At the time of Python 3.7.0 release, OpenSSL 1.1.1 is still | |
| under development and TLS 1.3 hasn't been finalized yet. The TLS 1.3 | |
| handshake and protocol behaves slightly differently than TLS 1.2 and earlier, | |
| see :ref:`ssl-tlsv1_3`. | |
| (Contributed by Christian Heimes in :issue:`32947`, :issue:`20995`, | |
| :issue:`29136`, :issue:`30622` and :issue:`33618`) | |
| :class:`~ssl.SSLSocket` and :class:`~ssl.SSLObject` no longer have a public | |
| constructor. Direct instantiation was never a documented and supported | |
| feature. Instances must be created with :class:`~ssl.SSLContext` methods | |
| :meth:`~ssl.SSLContext.wrap_socket` and :meth:`~ssl.SSLContext.wrap_bio`. | |
| (Contributed by Christian Heimes in :issue:`32951`) | |
| OpenSSL 1.1 APIs for setting the minimum and maximum TLS protocol version are | |
| available as :attr:`SSLContext.minimum_version <ssl.SSLContext.minimum_version>` | |
| and :attr:`SSLContext.maximum_version <ssl.SSLContext.maximum_version>`. | |
| Supported protocols are indicated by several new flags, such as | |
| :data:`~ssl.HAS_TLSv1_1`. | |
| (Contributed by Christian Heimes in :issue:`32609`.) | |
| string | |
| ------ | |
| :class:`string.Template` now lets you to optionally modify the regular | |
| expression pattern for braced placeholders and non-braced placeholders | |
| separately. (Contributed by Barry Warsaw in :issue:`1198569`.) | |
| subprocess | |
| ---------- | |
| The :func:`subprocess.run` function accepts the new *capture_output* | |
| keyword argument. When true, stdout and stderr will be captured. | |
| This is equivalent to passing :data:`subprocess.PIPE` as *stdout* and | |
| *stderr* arguments. | |
| (Contributed by Bo Bayles in :issue:`32102`.) | |
| The ``subprocess.run`` function and the :class:`subprocess.Popen` constructor | |
| now accept the *text* keyword argument as an alias | |
| to *universal_newlines*. | |
| (Contributed by Andrew Clegg in :issue:`31756`.) | |
| On Windows the default for *close_fds* was changed from ``False`` to | |
| ``True`` when redirecting the standard handles. It's now possible to set | |
| *close_fds* to true when redirecting the standard handles. See | |
| :class:`subprocess.Popen`. This means that *close_fds* now defaults to | |
| ``True`` on all supported platforms. | |
| (Contributed by Segev Finer in :issue:`19764`.) | |
| The subprocess module is now more graceful when handling | |
| :exc:`KeyboardInterrupt` during :func:`subprocess.call`, | |
| :func:`subprocess.run`, or in a :class:`~subprocess.Popen` | |
| context manager. It now waits a short amount of time for the child | |
| to exit, before continuing the handling of the ``KeyboardInterrupt`` | |
| exception. | |
| (Contributed by Gregory P. Smith in :issue:`25942`.) | |
| sys | |
| --- | |
| The new :func:`sys.breakpointhook` hook function is called by the | |
| built-in :func:`breakpoint`. | |
| (Contributed by Barry Warsaw in :issue:`31353`.) | |
| On Android, the new :func:`sys.getandroidapilevel` returns the build-time | |
| Android API version. | |
| (Contributed by Victor Stinner in :issue:`28740`.) | |
| The new :func:`sys.get_coroutine_origin_tracking_depth` function returns | |
| the current coroutine origin tracking depth, as set by | |
| the new :func:`sys.set_coroutine_origin_tracking_depth`. :mod:`asyncio` | |
| has been converted to use this new API instead of | |
| the deprecated :func:`sys.set_coroutine_wrapper`. | |
| (Contributed by Nathaniel J. Smith in :issue:`32591`.) | |
| time | |
| ---- | |
| :pep:`564` adds six new functions with nanosecond resolution to the | |
| :mod:`time` module: | |
| * :func:`time.clock_gettime_ns` | |
| * :func:`time.clock_settime_ns` | |
| * :func:`time.monotonic_ns` | |
| * :func:`time.perf_counter_ns` | |
| * :func:`time.process_time_ns` | |
| * :func:`time.time_ns` | |
| New clock identifiers have been added: | |
| * :data:`time.CLOCK_BOOTTIME` (Linux): Identical to | |
| :data:`time.CLOCK_MONOTONIC`, except it also includes any time that the | |
| system is suspended. | |
| * :data:`time.CLOCK_PROF` (FreeBSD, NetBSD and OpenBSD): High-resolution | |
| per-process CPU timer. | |
| * :data:`time.CLOCK_UPTIME` (FreeBSD, OpenBSD): Time whose absolute value is | |
| the time the system has been running and not suspended, providing accurate | |
| uptime measurement. | |
| The new :func:`time.thread_time` and :func:`time.thread_time_ns` functions | |
| can be used to get per-thread CPU time measurements. | |
| (Contributed by Antoine Pitrou in :issue:`32025`.) | |
| The new :func:`time.pthread_getcpuclockid` function returns the clock ID | |
| of the thread-specific CPU-time clock. | |
| tkinter | |
| ------- | |
| The new :class:`tkinter.ttk.Spinbox` class is now available. | |
| (Contributed by Alan Moore in :issue:`32585`.) | |
| tracemalloc | |
| ----------- | |
| :class:`tracemalloc.Traceback` behaves more like regular tracebacks, | |
| sorting the frames from oldest to most recent. | |
| :meth:`Traceback.format() <tracemalloc.Traceback.format>` | |
| now accepts negative *limit*, truncating the result to the | |
| ``abs(limit)`` oldest frames. To get the old behaviour, use | |
| the new *most_recent_first* argument to ``Traceback.format()``. | |
| (Contributed by Jesse Bakker in :issue:`32121`.) | |
| types | |
| ----- | |
| The new :class:`~types.WrapperDescriptorType`, | |
| :class:`~types.MethodWrapperType`, :class:`~types.MethodDescriptorType`, | |
| and :class:`~types.ClassMethodDescriptorType` classes are now available. | |
| (Contributed by Manuel Krebber and Guido van Rossum in :issue:`29377`, | |
| and Serhiy Storchaka in :issue:`32265`.) | |
| The new :func:`types.resolve_bases` function resolves MRO entries | |
| dynamically as specified by :pep:`560`. | |
| (Contributed by Ivan Levkivskyi in :issue:`32717`.) | |
| unicodedata | |
| ----------- | |
| The internal :mod:`unicodedata` database has been upgraded to use `Unicode 11 | |
| <http://www.unicode.org/versions/Unicode11.0.0/>`_. (Contributed by Benjamin | |
| Peterson.) | |
| unittest | |
| -------- | |
| The new ``-k`` command-line option allows filtering tests by a name | |
| substring or a Unix shell-like pattern. | |
| For example, ``python -m unittest -k foo`` runs | |
| ``foo_tests.SomeTest.test_something``, ``bar_tests.SomeTest.test_foo``, | |
| but not ``bar_tests.FooTest.test_something``. | |
| (Contributed by Jonas Haag in :issue:`32071`.) | |
| unittest.mock | |
| ------------- | |
| The :const:`~unittest.mock.sentinel` attributes now preserve their identity | |
| when they are :mod:`copied <copy>` or :mod:`pickled <pickle>`. (Contributed by | |
| Serhiy Storchaka in :issue:`20804`.) | |
| The new :func:`~unittest.mock.seal` function allows sealing | |
| :class:`~unittest.mock.Mock` instances, which will disallow further creation | |
| of attribute mocks. The seal is applied recursively to all attributes that | |
| are themselves mocks. | |
| (Contributed by Mario Corchero in :issue:`30541`.) | |
| urllib.parse | |
| ------------ | |
| :func:`urllib.parse.quote` has been updated from :rfc:`2396` to :rfc:`3986`, | |
| adding ``~`` to the set of characters that are never quoted by default. | |
| (Contributed by Christian Theune and Ratnadeep Debnath in :issue:`16285`.) | |
| uu | |
| -- | |
| The :func:`uu.encode` function now accepts an optional *backtick* | |
| keyword argument. When it's true, zeros are represented by ``'`'`` | |
| instead of spaces. (Contributed by Xiang Zhang in :issue:`30103`.) | |
| uuid | |
| ---- | |
| The new :attr:`UUID.is_safe <uuid.UUID.is_safe>` attribute relays information | |
| from the platform about whether generated UUIDs are generated with a | |
| multiprocessing-safe method. | |
| (Contributed by Barry Warsaw in :issue:`22807`.) | |
| :func:`uuid.getnode` now prefers universally administered | |
| MAC addresses over locally administered MAC addresses. | |
| This makes a better guarantee for global uniqueness of UUIDs returned | |
| from :func:`uuid.uuid1`. If only locally administered MAC addresses are | |
| available, the first such one found is returned. | |
| (Contributed by Barry Warsaw in :issue:`32107`.) | |
| warnings | |
| -------- | |
| The initialization of the default warnings filters has changed as follows: | |
| * warnings enabled via command line options (including those for :option:`-b` | |
| and the new CPython-specific :option:`-X` ``dev`` option) are always passed | |
| to the warnings machinery via the :data:`sys.warnoptions` attribute. | |
| * warnings filters enabled via the command line or the environment now have the | |
| following order of precedence: | |
| * the ``BytesWarning`` filter for :option:`-b` (or ``-bb``) | |
| * any filters specified with the :option:`-W` option | |
| * any filters specified with the :envvar:`PYTHONWARNINGS` environment | |
| variable | |
| * any other CPython specific filters (e.g. the ``default`` filter added | |
| for the new ``-X dev`` mode) | |
| * any implicit filters defined directly by the warnings machinery | |
| * in CPython debug builds, all warnings are now displayed by default (the | |
| implicit filter list is empty) | |
| (Contributed by Nick Coghlan and Victor Stinner in :issue:`20361`, | |
| :issue:`32043`, and :issue:`32230`.) | |
| Deprecation warnings are once again shown by default in single-file scripts and | |
| at the interactive prompt. See :ref:`whatsnew37-pep565` for details. | |
| (Contributed by Nick Coghlan in :issue:`31975`.) | |
| xml.etree | |
| --------- | |
| :ref:`ElementPath <elementtree-xpath>` predicates in the :meth:`find` | |
| methods can now compare text of the current node with ``[. = "text"]``, | |
| not only text in children. Predicates also allow adding spaces for | |
| better readability. (Contributed by Stefan Behnel in :issue:`31648`.) | |
| xmlrpc.server | |
| ------------- | |
| :meth:`SimpleXMLRPCDispatcher.register_function <xmlrpc.server.SimpleXMLRPCDispatcher>` | |
| can now be used as a decorator. (Contributed by Xiang Zhang in | |
| :issue:`7769`.) | |
| zipapp | |
| ------ | |
| Function :func:`~zipapp.create_archive` now accepts an optional *filter* | |
| argument to allow the user to select which files should be included in the | |
| archive. (Contributed by Irmen de Jong in :issue:`31072`.) | |
| Function :func:`~zipapp.create_archive` now accepts an optional *compressed* | |
| argument to generate a compressed archive. A command line option | |
| ``--compress`` has also been added to support compression. | |
| (Contributed by Zhiming Wang in :issue:`31638`.) | |
| zipfile | |
| ------- | |
| :class:`~zipfile.ZipFile` now accepts the new *compresslevel* parameter to | |
| control the compression level. | |
| (Contributed by Bo Bayles in :issue:`21417`.) | |
| Subdirectories in archives created by ``ZipFile`` are now stored in | |
| alphabetical order. | |
| (Contributed by Bernhard M. Wiedemann in :issue:`30693`.) | |
| C API Changes | |
| ============= | |
| A new API for thread-local storage has been implemented. See | |
| :ref:`whatsnew37-pep539` for an overview and | |
| :ref:`thread-specific-storage-api` for a complete reference. | |
| (Contributed by Masayuki Yamamoto in :issue:`25658`.) | |
| The new :ref:`context variables <whatsnew37-pep567>` functionality | |
| exposes a number of :ref:`new C APIs <contextvarsobjects>`. | |
| The new :c:func:`PyImport_GetModule` function returns the previously | |
| imported module with the given name. | |
| (Contributed by Eric Snow in :issue:`28411`.) | |
| The new :c:macro:`Py_RETURN_RICHCOMPARE` macro eases writing rich | |
| comparison functions. | |
| (Contributed by Petr Victorin in :issue:`23699`.) | |
| The new :c:macro:`Py_UNREACHABLE` macro can be used to mark unreachable | |
| code paths. | |
| (Contributed by Barry Warsaw in :issue:`31338`.) | |
| The :mod:`tracemalloc` now exposes a C API through the new | |
| :c:func:`PyTraceMalloc_Track` and :c:func:`PyTraceMalloc_Untrack` | |
| functions. | |
| (Contributed by Victor Stinner in :issue:`30054`.) | |
| The new :c:func:`import__find__load__start` and | |
| :c:func:`import__find__load__done` static markers can be used to trace | |
| module imports. | |
| (Contributed by Christian Heimes in :issue:`31574`.) | |
| The fields :c:member:`name` and :c:member:`doc` of structures | |
| :c:type:`PyMemberDef`, :c:type:`PyGetSetDef`, | |
| :c:type:`PyStructSequence_Field`, :c:type:`PyStructSequence_Desc`, | |
| and :c:type:`wrapperbase` are now of type ``const char *`` rather of | |
| ``char *``. (Contributed by Serhiy Storchaka in :issue:`28761`.) | |
| The result of :c:func:`PyUnicode_AsUTF8AndSize` and :c:func:`PyUnicode_AsUTF8` | |
| is now of type ``const char *`` rather of ``char *``. (Contributed by Serhiy | |
| Storchaka in :issue:`28769`.) | |
| The result of :c:func:`PyMapping_Keys`, :c:func:`PyMapping_Values` and | |
| :c:func:`PyMapping_Items` is now always a list, rather than a list or a | |
| tuple. (Contributed by Oren Milman in :issue:`28280`.) | |
| Added functions :c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices`. | |
| (Contributed by Serhiy Storchaka in :issue:`27867`.) | |
| :c:func:`PyOS_AfterFork` is deprecated in favour of the new functions | |
| :c:func:`PyOS_BeforeFork`, :c:func:`PyOS_AfterFork_Parent` and | |
| :c:func:`PyOS_AfterFork_Child`. (Contributed by Antoine Pitrou in | |
| :issue:`16500`.) | |
| The ``PyExc_RecursionErrorInst`` singleton that was part of the public API | |
| has been removed as its members being never cleared may cause a segfault | |
| during finalization of the interpreter. Contributed by Xavier de Gaye in | |
| :issue:`22898` and :issue:`30697`. | |
| Added C API support for timezones with timezone constructors | |
| :c:func:`PyTimeZone_FromOffset` and :c:func:`PyTimeZone_FromOffsetAndName`, | |
| and access to the UTC singleton with :c:data:`PyDateTime_TimeZone_UTC`. | |
| Contributed by Paul Ganssle in :issue:`10381`. | |
| The type of results of :c:func:`PyThread_start_new_thread` and | |
| :c:func:`PyThread_get_thread_ident`, and the *id* parameter of | |
| :c:func:`PyThreadState_SetAsyncExc` changed from :c:type:`long` to | |
| :c:type:`unsigned long`. | |
| (Contributed by Serhiy Storchaka in :issue:`6532`.) | |
| :c:func:`PyUnicode_AsWideCharString` now raises a :exc:`ValueError` if the | |
| second argument is ``NULL`` and the :c:type:`wchar_t*` string contains null | |
| characters. (Contributed by Serhiy Storchaka in :issue:`30708`.) | |
| Changes to the startup sequence and the management of dynamic memory | |
| allocators mean that the long documented requirement to call | |
| :c:func:`Py_Initialize` before calling most C API functions is now | |
| relied on more heavily, and failing to abide by it may lead to segfaults in | |
| embedding applications. See the :ref:`porting-to-python-37` section in this | |
| document and the :ref:`pre-init-safe` section in the C API documentation | |
| for more details. | |
| The new :c:func:`PyInterpreterState_GetID` returns the unique ID for a | |
| given interpreter. | |
| (Contributed by Eric Snow in :issue:`29102`.) | |
| :c:func:`Py_DecodeLocale`, :c:func:`Py_EncodeLocale` now use the UTF-8 | |
| encoding when the :ref:`UTF-8 mode <whatsnew37-pep540>` is enabled. | |
| (Contributed by Victor Stinner in :issue:`29240`.) | |
| :c:func:`PyUnicode_DecodeLocaleAndSize` and :c:func:`PyUnicode_EncodeLocale` | |
| now use the current locale encoding for ``surrogateescape`` error handler. | |
| (Contributed by Victor Stinner in :issue:`29240`.) | |
| The *start* and *end* parameters of :c:func:`PyUnicode_FindChar` are | |
| now adjusted to behave like string slices. | |
| (Contributed by Xiang Zhang in :issue:`28822`.) | |
| Build Changes | |
| ============= | |
| Support for building ``--without-threads`` has been removed. The | |
| :mod:`threading` module is now always available. | |
| (Contributed by Antoine Pitrou in :issue:`31370`.). | |
| A full copy of libffi is no longer bundled for use when building the | |
| :mod:`_ctypes <ctypes>` module on non-OSX UNIX platforms. An installed copy | |
| of libffi is now required when building ``_ctypes`` on such platforms. | |
| (Contributed by Zachary Ware in :issue:`27979`.) | |
| The Windows build process no longer depends on Subversion to pull in external | |
| sources, a Python script is used to download zipfiles from GitHub instead. | |
| If Python 3.6 is not found on the system (via ``py -3.6``), NuGet is used to | |
| download a copy of 32-bit Python for this purpose. (Contributed by Zachary | |
| Ware in :issue:`30450`.) | |
| The :mod:`ssl` module requires OpenSSL 1.0.2 or 1.1 compatible libssl. | |
| OpenSSL 1.0.1 has reached end of lifetime on 2016-12-31 and is no longer | |
| supported. LibreSSL is temporarily not supported as well. LibreSSL releases | |
| up to version 2.6.4 are missing required OpenSSL 1.0.2 APIs. | |
| .. _whatsnew37-perf: | |
| Optimizations | |
| ============= | |
| The overhead of calling many methods of various standard library classes | |
| implemented in C has been significantly reduced by porting more code | |
| to use the ``METH_FASTCALL`` convention. | |
| (Contributed by Victor Stinner in :issue:`29300`, :issue:`29507`, | |
| :issue:`29452`, and :issue:`29286`.) | |
| Various optimizations have reduced Python startup time by 10% on Linux and | |
| up to 30% on macOS. | |
| (Contributed by Victor Stinner, INADA Naoki in :issue:`29585`, and | |
| Ivan Levkivskyi in :issue:`31333`.) | |
| Method calls are now up to 20% faster due to the bytecode changes which | |
| avoid creating bound method instances. | |
| (Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.) | |
| .. _whatsnew37-asyncio-perf: | |
| The :mod:`asyncio` module received a number of notable optimizations for | |
| commonly used functions: | |
| * The :func:`asyncio.get_event_loop` function has been reimplemented in C to | |
| make it up to 15 times faster. | |
| (Contributed by Yury Selivanov in :issue:`32296`.) | |
| * :class:`asyncio.Future` callback management has been optimized. | |
| (Contributed by Yury Selivanov in :issue:`32348`.) | |
| * :func:`asyncio.gather` is now up to 15% faster. | |
| (Contributed by Yury Selivanov in :issue:`32355`.) | |
| * :func:`asyncio.sleep` is now up to 2 times faster when the *delay* | |
| argument is zero or negative. | |
| (Contributed by Andrew Svetlov in :issue:`32351`.) | |
| * The performance overhead of asyncio debug mode has been reduced. | |
| (Contributed by Antoine Pitrou in :issue:`31970`.) | |
| As a result of :ref:`PEP 560 work <whatsnew37-pep560>`, the import time | |
| of :mod:`typing` has been reduced by a factor of 7, and many typing operations | |
| are now faster. | |
| (Contributed by Ivan Levkivskyi in :issue:`32226`.) | |
| :func:`sorted` and :meth:`list.sort` have been optimized for common cases | |
| to be up to 40-75% faster. | |
| (Contributed by Elliot Gorokhovsky in :issue:`28685`.) | |
| :meth:`dict.copy` is now up to 5.5 times faster. | |
| (Contributed by Yury Selivanov in :issue:`31179`.) | |
| :func:`hasattr` and :func:`getattr` are now about 4 times faster when | |
| *name* is not found and *obj* does not override :meth:`object.__getattr__` | |
| or :meth:`object.__getattribute__`. | |
| (Contributed by INADA Naoki in :issue:`32544`.) | |
| Searching for certain Unicode characters (like Ukrainian capital "Đ") | |
| in a string was up to 25 times slower than searching for other characters. | |
| It is now only 3 times slower in the worst case. | |
| (Contributed by Serhiy Storchaka in :issue:`24821`.) | |
| The :func:`collections.namedtuple` factory has been reimplemented to | |
| make the creation of named tuples 4 to 6 times faster. | |
| (Contributed by Jelle Zijlstra with further improvements by INADA Naoki, | |
| Serhiy Storchaka, and Raymond Hettinger in :issue:`28638`.) | |
| :meth:`date.fromordinal` and :meth:`date.fromtimestamp` are now up to | |
| 30% faster in the common case. | |
| (Contributed by Paul Ganssle in :issue:`32403`.) | |
| The :func:`os.fwalk` function is now up to 2 times faster thanks to | |
| the use of :func:`os.scandir`. | |
| (Contributed by Serhiy Storchaka in :issue:`25996`.) | |
| The speed of the :func:`shutil.rmtree` function has been improved by | |
| 20--40% thanks to the use of the :func:`os.scandir` function. | |
| (Contributed by Serhiy Storchaka in :issue:`28564`.) | |
| Optimized case-insensitive matching and searching of :mod:`regular | |
| expressions <re>`. Searching some patterns can now be up to 20 times faster. | |
| (Contributed by Serhiy Storchaka in :issue:`30285`.) | |
| :func:`re.compile` now converts ``flags`` parameter to int object if | |
| it is ``RegexFlag``. It is now as fast as Python 3.5, and faster than | |
| Python 3.6 by about 10% depending on the pattern. | |
| (Contributed by INADA Naoki in :issue:`31671`.) | |
| The :meth:`~selectors.BaseSelector.modify` methods of classes | |
| :class:`selectors.EpollSelector`, :class:`selectors.PollSelector` | |
| and :class:`selectors.DevpollSelector` may be around 10% faster under | |
| heavy loads. (Contributed by Giampaolo Rodola' in :issue:`30014`) | |
| Constant folding has been moved from the peephole optimizer to the new AST | |
| optimizer, which is able perform optimizations more consistently. | |
| (Contributed by Eugene Toder and INADA Naoki in :issue:`29469` and | |
| :issue:`11549`.) | |
| Most functions and methods in :mod:`abc` have been rewritten in C. | |
| This makes creation of abstract base classes, and calling :func:`isinstance` | |
| and :func:`issubclass` on them 1.5x faster. This also reduces Python | |
| start-up time by up to 10%. (Contributed by Ivan Levkivskyi and INADA Naoki | |
| in :issue:`31333`) | |
| Significant speed improvements to alternate constructors for | |
| :class:`datetime.date` and :class:`datetime.datetime` by using fast-path | |
| constructors when not constructing subclasses. (Contributed by Paul Ganssle | |
| in :issue:`32403`) | |
| The speed of comparison of :class:`array.array` instances has been | |
| improved considerably in certain cases. It is now from 10x to 70x faster | |
| when comparing arrays holding values of the same integer type. | |
| (Contributed by Adrian Wielgosik in :issue:`24700`.) | |
| The :func:`math.erf` and :func:`math.erfc` functions now use the (faster) | |
| C library implementation on most platforms. | |
| (Contributed by Serhiy Storchaka in :issue:`26121`.) | |
| Other CPython Implementation Changes | |
| ==================================== | |
| * Trace hooks may now opt out of receiving the ``line`` and opt into receiving | |
| the ``opcode`` events from the interpreter by setting the corresponding new | |
| ``f_trace_lines`` and ``f_trace_opcodes`` attributes on the | |
| frame being traced. (Contributed by Nick Coghlan in :issue:`31344`.) | |
| * Fixed some consistency problems with namespace package module attributes. | |
| Namespace module objects now have an ``__file__`` that is set to ``None`` | |
| (previously unset), and their ``__spec__.origin`` is also set to ``None`` | |
| (previously the string ``"namespace"``). See :issue:`32305`. Also, the | |
| namespace module object's ``__spec__.loader`` is set to the same value as | |
| ``__loader__`` (previously, the former was set to ``None``). See | |
| :issue:`32303`. | |
| * The :func:`locals` dictionary now displays in the lexical order that | |
| variables were defined. Previously, the order was undefined. | |
| (Contributed by Raymond Hettinger in :issue:`32690`.) | |
| * The :mod:`distutils` ``upload`` command no longer tries to change CR | |
| end-of-line characters to CRLF. This fixes a corruption issue with sdists | |
| that ended with a byte equivalent to CR. | |
| (Contributed by Bo Bayles in :issue:`32304`.) | |
| Deprecated Python Behavior | |
| ========================== | |
| Yield expressions (both ``yield`` and ``yield from`` clauses) are now deprecated | |
| in comprehensions and generator expressions (aside from the iterable expression | |
| in the leftmost :keyword:`!for` clause). This ensures that comprehensions | |
| always immediately return a container of the appropriate type (rather than | |
| potentially returning a :term:`generator iterator` object), while generator | |
| expressions won't attempt to interleave their implicit output with the output | |
| from any explicit yield expressions. In Python 3.7, such expressions emit | |
| :exc:`DeprecationWarning` when compiled, in Python 3.8 this will be a | |
| :exc:`SyntaxError`. | |
| (Contributed by Serhiy Storchaka in :issue:`10544`.) | |
| Returning a subclass of :class:`complex` from :meth:`object.__complex__` is | |
| deprecated and will be an error in future Python versions. This makes | |
| ``__complex__()`` consistent with :meth:`object.__int__` and | |
| :meth:`object.__float__`. | |
| (Contributed by Serhiy Storchaka in :issue:`28894`.) | |
| Deprecated Python modules, functions and methods | |
| ================================================ | |
| aifc | |
| ---- | |
| :func:`aifc.openfp` has been deprecated and will be removed in Python 3.9. | |
| Use :func:`aifc.open` instead. | |
| (Contributed by Brian Curtin in :issue:`31985`.) | |
| .. _whatsnew37-asyncio-deprecated: | |
| asyncio | |
| ------- | |
| Support for directly ``await``-ing instances of :class:`asyncio.Lock` and | |
| other asyncio synchronization primitives has been deprecated. An | |
| asynchronous context manager must be used in order to acquire and release | |
| the synchronization resource. | |
| (Contributed by Andrew Svetlov in :issue:`32253`.) | |
| The :meth:`asyncio.Task.current_task` and :meth:`asyncio.Task.all_tasks` | |
| methods have been deprecated. | |
| (Contributed by Andrew Svetlov in :issue:`32250`.) | |
| collections | |
| ----------- | |
| In Python 3.8, the abstract base classes in :mod:`collections.abc` will no | |
| longer be exposed in the regular :mod:`collections` module. This will help | |
| create a clearer distinction between the concrete classes and the abstract | |
| base classes. | |
| (Contributed by Serhiy Storchaka in :issue:`25988`.) | |
| dbm | |
| --- | |
| :mod:`dbm.dumb` now supports reading read-only files and no longer writes the | |
| index file when it is not changed. A deprecation warning is now emitted | |
| if the index file is missing and recreated in the ``'r'`` and ``'w'`` | |
| modes (this will be an error in future Python releases). | |
| (Contributed by Serhiy Storchaka in :issue:`28847`.) | |
| enum | |
| ---- | |
| In Python 3.8, attempting to check for non-Enum objects in :class:`Enum` | |
| classes will raise a :exc:`TypeError` (e.g. ``1 in Color``); similarly, | |
| attempting to check for non-Flag objects in a :class:`Flag` member will | |
| raise :exc:`TypeError` (e.g. ``1 in Perm.RW``); currently, both operations | |
| return :const:`False` instead. | |
| (Contributed by Ethan Furman in :issue:`33217`.) | |
| gettext | |
| ------- | |
| Using non-integer value for selecting a plural form in :mod:`gettext` is | |
| now deprecated. It never correctly worked. (Contributed by Serhiy Storchaka | |
| in :issue:`28692`.) | |
| importlib | |
| --------- | |
| Methods | |
| :meth:`MetaPathFinder.find_module() <importlib.abc.MetaPathFinder.find_module>` | |
| (replaced by | |
| :meth:`MetaPathFinder.find_spec() <importlib.abc.MetaPathFinder.find_spec>`) | |
| and | |
| :meth:`PathEntryFinder.find_loader() <importlib.abc.PathEntryFinder.find_loader>` | |
| (replaced by | |
| :meth:`PathEntryFinder.find_spec() <importlib.abc.PathEntryFinder.find_spec>`) | |
| both deprecated in Python 3.4 now emit :exc:`DeprecationWarning`. | |
| (Contributed by Matthias Bussonnier in :issue:`29576`) | |
| The :class:`importlib.abc.ResourceLoader` ABC has been deprecated in | |
| favour of :class:`importlib.abc.ResourceReader`. | |
| locale | |
| ------ | |
| :func:`locale.format` has been deprecated, use :meth:`locale.format_string` | |
| instead. (Contributed by Garvit in :issue:`10379`.) | |
| macpath | |
| ------- | |
| The :mod:`macpath` is now deprecated and will be removed in Python 3.8. | |
| (Contributed by Chi Hsuan Yen in :issue:`9850`.) | |
| threading | |
| --------- | |
| :mod:`dummy_threading` and :mod:`_dummy_thread` have been deprecated. It is | |
| no longer possible to build Python with threading disabled. | |
| Use :mod:`threading` instead. | |
| (Contributed by Antoine Pitrou in :issue:`31370`.) | |
| socket | |
| ------ | |
| The silent argument value truncation in :func:`socket.htons` and | |
| :func:`socket.ntohs` has been deprecated. In future versions of Python, | |
| if the passed argument is larger than 16 bits, an exception will be raised. | |
| (Contributed by Oren Milman in :issue:`28332`.) | |
| ssl | |
| --- | |
| :func:`ssl.wrap_socket` is deprecated. Use | |
| :meth:`ssl.SSLContext.wrap_socket` instead. | |
| (Contributed by Christian Heimes in :issue:`28124`.) | |
| sunau | |
| ----- | |
| :func:`sunau.openfp` has been deprecated and will be removed in Python 3.9. | |
| Use :func:`sunau.open` instead. | |
| (Contributed by Brian Curtin in :issue:`31985`.) | |
| sys | |
| --- | |
| Deprecated :func:`sys.set_coroutine_wrapper` and | |
| :func:`sys.get_coroutine_wrapper`. | |
| The undocumented ``sys.callstats()`` function has been deprecated and | |
| will be removed in a future Python version. | |
| (Contributed by Victor Stinner in :issue:`28799`.) | |
| wave | |
| ---- | |
| :func:`wave.openfp` has been deprecated and will be removed in Python 3.9. | |
| Use :func:`wave.open` instead. | |
| (Contributed by Brian Curtin in :issue:`31985`.) | |
| Deprecated functions and types of the C API | |
| =========================================== | |
| Function :c:func:`PySlice_GetIndicesEx` is deprecated and replaced with | |
| a macro if ``Py_LIMITED_API`` is not set or set to a value in the range | |
| between ``0x03050400`` and ``0x03060000`` (not inclusive), or is ``0x03060100`` | |
| or higher. (Contributed by Serhiy Storchaka in :issue:`27867`.) | |
| :c:func:`PyOS_AfterFork` has been deprecated. Use :c:func:`PyOS_BeforeFork`, | |
| :c:func:`PyOS_AfterFork_Parent` or :c:func:`PyOS_AfterFork_Child()` instead. | |
| (Contributed by Antoine Pitrou in :issue:`16500`.) | |
| .. _37-platform-support-removals: | |
| Platform Support Removals | |
| ========================= | |
| * FreeBSD 9 and older are no longer officially supported. | |
| * For full Unicode support, including within extension modules, \*nix platforms | |
| are now expected to provide at least one of ``C.UTF-8`` (full locale), | |
| ``C.utf8`` (full locale) or ``UTF-8`` (``LC_CTYPE``-only locale) as an | |
| alternative to the legacy ``ASCII``-based ``C`` locale. | |
| * OpenSSL 0.9.8 and 1.0.1 are no longer supported, which means building CPython | |
| 3.7 with SSL/TLS support on older platforms still using these versions | |
| requires custom build options that link to a more recent version of OpenSSL. | |
| Notably, this issue affects the Debian 8 (aka "jessie") and Ubuntu 14.04 | |
| (aka "Trusty") LTS Linux distributions, as they still use OpenSSL 1.0.1 by | |
| default. | |
| Debian 9 ("stretch") and Ubuntu 16.04 ("xenial"), as well as recent releases | |
| of other LTS Linux releases (e.g. RHEL/CentOS 7.5, SLES 12-SP3), use OpenSSL | |
| 1.0.2 or later, and remain supported in the default build configuration. | |
| CPython's own :source:`CI configuration file <.travis.yml>` provides an | |
| example of using the SSL | |
| :source:`compatibility testing infrastructure <Tools/ssl/multissltests.py>` in | |
| CPython's test suite to build and link against OpenSSL 1.1.0 rather than an | |
| outdated system provided OpenSSL. | |
| API and Feature Removals | |
| ======================== | |
| The following features and APIs have been removed from Python 3.7: | |
| * The ``os.stat_float_times()`` function has been removed. It was introduced in | |
| Python 2.3 for backward compatibility with Python 2.2, and was deprecated | |
| since Python 3.1. | |
| * Unknown escapes consisting of ``'\'`` and an ASCII letter in replacement | |
| templates for :func:`re.sub` were deprecated in Python 3.5, and will now | |
| cause an error. | |
| * Removed support of the *exclude* argument in :meth:`tarfile.TarFile.add`. | |
| It was deprecated in Python 2.7 and 3.2. Use the *filter* argument instead. | |
| * The ``splitunc()`` function in the :mod:`ntpath` module was deprecated in | |
| Python 3.1, and has now been removed. Use the :func:`~os.path.splitdrive` | |
| function instead. | |
| * :func:`collections.namedtuple` no longer supports the *verbose* parameter | |
| or ``_source`` attribute which showed the generated source code for the | |
| named tuple class. This was part of an optimization designed to speed-up | |
| class creation. (Contributed by Jelle Zijlstra with further improvements | |
| by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in :issue:`28638`.) | |
| * Functions :func:`bool`, :func:`float`, :func:`list` and :func:`tuple` no | |
| longer take keyword arguments. The first argument of :func:`int` can now | |
| be passed only as positional argument. | |
| * Removed previously deprecated in Python 2.4 classes ``Plist``, ``Dict`` and | |
| ``_InternalDict`` in the :mod:`plistlib` module. Dict values in the result | |
| of functions :func:`~plistlib.readPlist` and | |
| :func:`~plistlib.readPlistFromBytes` are now normal dicts. You no longer | |
| can use attribute access to access items of these dictionaries. | |
| * The ``asyncio.windows_utils.socketpair()`` function has been | |
| removed. Use the :func:`socket.socketpair` function instead, | |
| it is available on all platforms since Python 3.5. | |
| ``asyncio.windows_utils.socketpair`` was just an alias to | |
| ``socket.socketpair`` on Python 3.5 and newer. | |
| * :mod:`asyncio` no longer exports the :mod:`selectors` and | |
| :mod:`_overlapped` modules as ``asyncio.selectors`` and | |
| ``asyncio._overlapped``. Replace ``from asyncio import selectors`` with | |
| ``import selectors``. | |
| * Direct instantiation of :class:`ssl.SSLSocket` and :class:`ssl.SSLObject` | |
| objects is now prohibited. The constructors were never documented, tested, | |
| or designed as public constructors. Users were supposed to use | |
| :func:`ssl.wrap_socket` or :class:`ssl.SSLContext`. | |
| (Contributed by Christian Heimes in :issue:`32951`.) | |
| * The unused :mod:`distutils` ``install_misc`` command has been removed. | |
| (Contributed by Eric N. Vander Weele in :issue:`29218`.) | |
| Module Removals | |
| =============== | |
| The ``fpectl`` module has been removed. It was never enabled by | |
| default, never worked correctly on x86-64, and it changed the Python | |
| ABI in ways that caused unexpected breakage of C extensions. | |
| (Contributed by Nathaniel J. Smith in :issue:`29137`.) | |
| Windows-only Changes | |
| ==================== | |
| The python launcher, (py.exe), can accept 32 & 64 bit specifiers **without** | |
| having to specify a minor version as well. So ``py -3-32`` and ``py -3-64`` | |
| become valid as well as ``py -3.7-32``, also the -*m*-64 and -*m.n*-64 forms | |
| are now accepted to force 64 bit python even if 32 bit would have otherwise | |
| been used. If the specified version is not available py.exe will error exit. | |
| (Contributed by Steve Barnes in :issue:`30291`.) | |
| The launcher can be run as ``py -0`` to produce a list of the installed pythons, | |
| *with default marked with an asterisk*. Running ``py -0p`` will include the paths. | |
| If py is run with a version specifier that cannot be matched it will also print | |
| the *short form* list of available specifiers. | |
| (Contributed by Steve Barnes in :issue:`30362`.) | |
| .. _porting-to-python-37: | |
| Porting to Python 3.7 | |
| ===================== | |
| This section lists previously described changes and other bugfixes | |
| that may require changes to your code. | |
| Changes in Python Behavior | |
| -------------------------- | |
| * :keyword:`async` and :keyword:`await` names are now reserved keywords. | |
| Code using these names as identifiers will now raise a :exc:`SyntaxError`. | |
| (Contributed by Jelle Zijlstra in :issue:`30406`.) | |
| * :pep:`479` is enabled for all code in Python 3.7, meaning that | |
| :exc:`StopIteration` exceptions raised directly or indirectly in | |
| coroutines and generators are transformed into :exc:`RuntimeError` | |
| exceptions. | |
| (Contributed by Yury Selivanov in :issue:`32670`.) | |
| * :meth:`object.__aiter__` methods can no longer be declared as | |
| asynchronous. (Contributed by Yury Selivanov in :issue:`31709`.) | |
| * Due to an oversight, earlier Python versions erroneously accepted the | |
| following syntax:: | |
| f(1 for x in [1],) | |
| class C(1 for x in [1]): | |
| pass | |
| Python 3.7 now correctly raises a :exc:`SyntaxError`, as a generator | |
| expression always needs to be directly inside a set of parentheses | |
| and cannot have a comma on either side, and the duplication of the | |
| parentheses can be omitted only on calls. | |
| (Contributed by Serhiy Storchaka in :issue:`32012` and :issue:`32023`.) | |
| * When using the :option:`-m` switch, the initial working directory is now added | |
| to :data:`sys.path`, rather than an empty string (which dynamically denoted | |
| the current working directory at the time of each import). Any programs that | |
| are checking for the empty string, or otherwise relying on the previous | |
| behaviour, will need to be updated accordingly (e.g. by also checking for | |
| ``os.getcwd()`` or ``os.path.dirname(__main__.__file__)``, depending on why | |
| the code was checking for the empty string in the first place). | |
| Changes in the Python API | |
| ------------------------- | |
| * :meth:`socketserver.ThreadingMixIn.server_close` now waits until all | |
| non-daemon threads complete. Set the new | |
| :attr:`socketserver.ThreadingMixIn.block_on_close` class attribute to | |
| ``False`` to get the pre-3.7 behaviour. | |
| (Contributed by Victor Stinner in :issue:`31233` and :issue:`33540`.) | |
| * :meth:`socketserver.ForkingMixIn.server_close` now waits until all | |
| child processes complete. Set the new | |
| :attr:`socketserver.ForkingMixIn.block_on_close` class attribute to ``False`` | |
| to get the pre-3.7 behaviour. | |
| (Contributed by Victor Stinner in :issue:`31151` and :issue:`33540`.) | |
| * The :func:`locale.localeconv` function now temporarily sets the ``LC_CTYPE`` | |
| locale to the value of ``LC_NUMERIC`` in some cases. | |
| (Contributed by Victor Stinner in :issue:`31900`.) | |
| * :meth:`pkgutil.walk_packages` now raises a :exc:`ValueError` if *path* is | |
| a string. Previously an empty list was returned. | |
| (Contributed by Sanyam Khurana in :issue:`24744`.) | |
| * A format string argument for :meth:`string.Formatter.format` | |
| is now :ref:`positional-only <positional-only_parameter>`. | |
| Passing it as a keyword argument was deprecated in Python 3.5. (Contributed | |
| by Serhiy Storchaka in :issue:`29193`.) | |
| * Attributes :attr:`~http.cookies.Morsel.key`, | |
| :attr:`~http.cookies.Morsel.value` and | |
| :attr:`~http.cookies.Morsel.coded_value` of class | |
| :class:`http.cookies.Morsel` are now read-only. | |
| Assigning to them was deprecated in Python 3.5. | |
| Use the :meth:`~http.cookies.Morsel.set` method for setting them. | |
| (Contributed by Serhiy Storchaka in :issue:`29192`.) | |
| * The *mode* argument of :func:`os.makedirs` no longer affects the file | |
| permission bits of newly-created intermediate-level directories. | |
| To set their file permission bits you can set the umask before invoking | |
| ``makedirs()``. | |
| (Contributed by Serhiy Storchaka in :issue:`19930`.) | |
| * The :attr:`struct.Struct.format` type is now :class:`str` instead of | |
| :class:`bytes`. (Contributed by Victor Stinner in :issue:`21071`.) | |
| * :func:`~cgi.parse_multipart` now accepts the *encoding* and *errors* | |
| arguments and returns the same results as | |
| :class:`~FieldStorage`: for non-file fields, the value associated to a key | |
| is a list of strings, not bytes. | |
| (Contributed by Pierre Quentel in :issue:`29979`.) | |
| * Due to internal changes in :mod:`socket`, calling :func:`socket.fromshare` | |
| on a socket created by :func:`socket.share <socket.socket.share>` in older | |
| Python versions is not supported. | |
| * ``repr`` for :exc:`BaseException` has changed to not include the trailing | |
| comma. Most exceptions are affected by this change. | |
| (Contributed by Serhiy Storchaka in :issue:`30399`.) | |
| * ``repr`` for :class:`datetime.timedelta` has changed to include the keyword | |
| arguments in the output. (Contributed by Utkarsh Upadhyay in :issue:`30302`.) | |
| * Because :func:`shutil.rmtree` is now implemented using the :func:`os.scandir` | |
| function, the user specified handler *onerror* is now called with the first | |
| argument ``os.scandir`` instead of ``os.listdir`` when listing the directory | |
| is failed. | |
| * Support for nested sets and set operations in regular expressions as in | |
| `Unicode Technical Standard #18`_ might be added in the future. This would | |
| change the syntax. To facilitate this future change a :exc:`FutureWarning` | |
| will be raised in ambiguous cases for the time being. | |
| That include sets starting with a literal ``'['`` or containing literal | |
| character sequences ``'--'``, ``'&&'``, ``'~~'``, and ``'||'``. To | |
| avoid a warning, escape them with a backslash. | |
| (Contributed by Serhiy Storchaka in :issue:`30349`.) | |
| .. _Unicode Technical Standard #18: https://unicode.org/reports/tr18/ | |
| * The result of splitting a string on a :mod:`regular expression <re>` | |
| that could match an empty string has been changed. For example | |
| splitting on ``r'\s*'`` will now split not only on whitespaces as it | |
| did previously, but also on empty strings before all non-whitespace | |
| characters and just before the end of the string. | |
| The previous behavior can be restored by changing the pattern | |
| to ``r'\s+'``. A :exc:`FutureWarning` was emitted for such patterns since | |
| Python 3.5. | |
| For patterns that match both empty and non-empty strings, the result of | |
| searching for all matches may also be changed in other cases. For example | |
| in the string ``'a\n\n'``, the pattern ``r'(?m)^\s*?$'`` will not only | |
| match empty strings at positions 2 and 3, but also the string ``'\n'`` at | |
| positions 2--3. To match only blank lines, the pattern should be rewritten | |
| as ``r'(?m)^[^\S\n]*$'``. | |
| :func:`re.sub()` now replaces empty matches adjacent to a previous | |
| non-empty match. For example ``re.sub('x*', '-', 'abxd')`` returns now | |
| ``'-a-b--d-'`` instead of ``'-a-b-d-'`` (the first minus between 'b' and | |
| 'd' replaces 'x', and the second minus replaces an empty string between | |
| 'x' and 'd'). | |
| (Contributed by Serhiy Storchaka in :issue:`25054` and :issue:`32308`.) | |
| * Change :func:`re.escape` to only escape regex special characters instead | |
| of escaping all characters other than ASCII letters, numbers, and ``'_'``. | |
| (Contributed by Serhiy Storchaka in :issue:`29995`.) | |
| * :class:`tracemalloc.Traceback` frames are now sorted from oldest to most | |
| recent to be more consistent with :mod:`traceback`. | |
| (Contributed by Jesse Bakker in :issue:`32121`.) | |
| * On OSes that support :const:`socket.SOCK_NONBLOCK` or | |
| :const:`socket.SOCK_CLOEXEC` bit flags, the | |
| :attr:`socket.type <socket.socket.type>` no longer has them applied. | |
| Therefore, checks like ``if sock.type == socket.SOCK_STREAM`` | |
| work as expected on all platforms. | |
| (Contributed by Yury Selivanov in :issue:`32331`.) | |
| * On Windows the default for the *close_fds* argument of | |
| :class:`subprocess.Popen` was changed from :const:`False` to :const:`True` | |
| when redirecting the standard handles. If you previously depended on handles | |
| being inherited when using :class:`subprocess.Popen` with standard io | |
| redirection, you will have to pass ``close_fds=False`` to preserve the | |
| previous behaviour, or use | |
| :attr:`STARTUPINFO.lpAttributeList <subprocess.STARTUPINFO.lpAttributeList>`. | |
| * :meth:`importlib.machinery.PathFinder.invalidate_caches` -- which implicitly | |
| affects :func:`importlib.invalidate_caches` -- now deletes entries | |
| in :data:`sys.path_importer_cache` which are set to ``None``. | |
| (Contributed by Brett Cannon in :issue:`33169`.) | |
| * In :mod:`asyncio`, | |
| :meth:`loop.sock_recv() <asyncio.loop.sock_recv>`, | |
| :meth:`loop.sock_sendall() <asyncio.loop.sock_sendall>`, | |
| :meth:`loop.sock_accept() <asyncio.loop.sock_accept>`, | |
| :meth:`loop.getaddrinfo() <asyncio.loop.getaddrinfo>`, | |
| :meth:`loop.getnameinfo() <asyncio.loop.getnameinfo>` | |
| have been changed to be proper coroutine methods to match their | |
| documentation. Previously, these methods returned :class:`asyncio.Future` | |
| instances. | |
| (Contributed by Yury Selivanov in :issue:`32327`.) | |
| * :attr:`asyncio.Server.sockets` now returns a copy of the internal list | |
| of server sockets, instead of returning it directly. | |
| (Contributed by Yury Selivanov in :issue:`32662`.) | |
| * :attr:`Struct.format <struct.Struct.format>` is now a :class:`str` instance | |
| instead of a :class:`bytes` instance. | |
| (Contributed by Victor Stinner in :issue:`21071`.) | |
| * :mod:`argparse` subparsers can now be made mandatory by passing ``required=True`` | |
| to :meth:`ArgumentParser.add_subparsers() <argparse.ArgumentParser.add_subparsers>`. | |
| (Contributed by Anthony Sottile in :issue:`26510`.) | |
| * :meth:`ast.literal_eval()` is now stricter. Addition and subtraction of | |
| arbitrary numbers are no longer allowed. | |
| (Contributed by Serhiy Storchaka in :issue:`31778`.) | |
| * :meth:`Calendar.itermonthdates <calendar.Calendar.itermonthdates>` | |
| will now consistently raise an exception when a date falls outside of the | |
| ``0001-01-01`` through ``9999-12-31`` range. To support applications that | |
| cannot tolerate such exceptions, the new | |
| :meth:`Calendar.itermonthdays3 <calendar.Calendar.itermonthdays3>` and | |
| :meth:`Calendar.itermonthdays4 <calendar.Calendar.itermonthdays4>` can be used. | |
| The new methods return tuples and are not restricted by the range supported by | |
| :class:`datetime.date`. | |
| (Contributed by Alexander Belopolsky in :issue:`28292`.) | |
| * :class:`collections.ChainMap` now preserves the order of the underlying | |
| mappings. (Contributed by Raymond Hettinger in :issue:`32792`.) | |
| * The ``submit()`` method of :class:`concurrent.futures.ThreadPoolExecutor` | |
| and :class:`concurrent.futures.ProcessPoolExecutor` now raises | |
| a :exc:`RuntimeError` if called during interpreter shutdown. | |
| (Contributed by Mark Nemec in :issue:`33097`.) | |
| * The :class:`configparser.ConfigParser` constructor now uses ``read_dict()`` | |
| to process the default values, making its behavior consistent with the | |
| rest of the parser. Non-string keys and values in the defaults | |
| dictionary are now being implicitly converted to strings. | |
| (Contributed by James Tocknell in :issue:`23835`.) | |
| * Several undocumented internal imports were removed. | |
| One example is that ``os.errno`` is no longer available; use ``import errno`` | |
| directly instead. | |
| Note that such undocumented internal imports may be removed any time without | |
| notice, even in micro version releases. | |
| Changes in the C API | |
| -------------------- | |
| The function :c:func:`PySlice_GetIndicesEx` is considered unsafe for | |
| resizable sequences. If the slice indices are not instances of :class:`int`, | |
| but objects that implement the :meth:`!__index__` method, the sequence can be | |
| resized after passing its length to :c:func:`!PySlice_GetIndicesEx`. This | |
| can lead to returning indices out of the length of the sequence. For | |
| avoiding possible problems use new functions :c:func:`PySlice_Unpack` and | |
| :c:func:`PySlice_AdjustIndices`. | |
| (Contributed by Serhiy Storchaka in :issue:`27867`.) | |
| CPython bytecode changes | |
| ------------------------ | |
| There are two new opcodes: :opcode:`LOAD_METHOD` and :opcode:`CALL_METHOD`. | |
| (Contributed by Yury Selivanov and INADA Naoki in :issue:`26110`.) | |
| The :opcode:`STORE_ANNOTATION` opcode has been removed. | |
| (Contributed by Mark Shannon in :issue:`32550`.) | |
| Windows-only Changes | |
| -------------------- | |
| The file used to override :data:`sys.path` is now called | |
| ``<python-executable>._pth`` instead of ``'sys.path'``. | |
| See :ref:`finding_modules` for more information. | |
| (Contributed by Steve Dower in :issue:`28137`.) | |
| Other CPython implementation changes | |
| ------------------------------------ | |
| In preparation for potential future changes to the public CPython runtime | |
| initialization API (see :pep:`432` for an initial, but somewhat outdated, | |
| draft), CPython's internal startup | |
| and configuration management logic has been significantly refactored. While | |
| these updates are intended to be entirely transparent to both embedding | |
| applications and users of the regular CPython CLI, they're being mentioned | |
| here as the refactoring changes the internal order of various operations | |
| during interpreter startup, and hence may uncover previously latent defects, | |
| either in embedding applications, or in CPython itself. | |
| (Initially contributed by Nick Coghlan and Eric Snow as part of | |
| :issue:`22257`, and further updated by Nick, Eric, and Victor Stinner in a | |
| number of other issues). Some known details affected: | |
| * :c:func:`PySys_AddWarnOptionUnicode` is not currently usable by embedding | |
| applications due to the requirement to create a Unicode object prior to | |
| calling `Py_Initialize`. Use :c:func:`PySys_AddWarnOption` instead. | |
| * warnings filters added by an embedding application with | |
| :c:func:`PySys_AddWarnOption` should now more consistently take precedence | |
| over the default filters set by the interpreter | |
| Due to changes in the way the default warnings filters are configured, | |
| setting :c:data:`Py_BytesWarningFlag` to a value greater than one is no longer | |
| sufficient to both emit :exc:`BytesWarning` messages and have them converted | |
| to exceptions. Instead, the flag must be set (to cause the warnings to be | |
| emitted in the first place), and an explicit ``error::BytesWarning`` | |
| warnings filter added to convert them to exceptions. | |
| Due to a change in the way docstrings are handled by the compiler, the | |
| implicit ``return None`` in a function body consisting solely of a docstring | |
| is now marked as occurring on the same line as the docstring, not on the | |
| function's header line. | |
| The current exception state has been moved from the frame object to the co-routine. | |
| This simplified the interpreter and fixed a couple of obscure bugs caused by | |
| having swap exception state when entering or exiting a generator. | |
| (Contributed by Mark Shannon in :issue:`25612`.) | |
| Notable changes in Python 3.7.1 | |
| =============================== | |
| Starting in 3.7.1, :c:func:`Py_Initialize` now consistently reads and respects | |
| all of the same environment settings as :c:func:`Py_Main` (in earlier Python | |
| versions, it respected an ill-defined subset of those environment variables, | |
| while in Python 3.7.0 it didn't read any of them due to :issue:`34247`). If | |
| this behavior is unwanted, set :c:data:`Py_IgnoreEnvironmentFlag` to 1 before | |
| calling :c:func:`Py_Initialize`. | |
| In 3.7.1 the C API for Context Variables | |
| :ref:`was updated <contextvarsobjects_pointertype_change>` to use | |
| :c:type:`PyObject` pointers. See also :issue:`34762`. | |
| In 3.7.1 the :mod:`tokenize` module now implicitly emits a ``NEWLINE`` token | |
| when provided with input that does not have a trailing new line. This behavior | |
| now matches what the C tokenizer does internally. | |
| (Contributed by Ammar Askar in :issue:`33899`.) | |
| Notable changes in Python 3.7.2 | |
| =============================== | |
| In 3.7.2, :mod:`venv` on Windows no longer copies the original binaries, but | |
| creates redirector scripts named ``python.exe`` and ``pythonw.exe`` instead. | |
| This resolves a long standing issue where all virtual environments would have | |
| to be upgraded or recreated with each Python update. However, note that this | |
| release will still require recreation of virtual environments in order to get | |
| the new scripts. | |
| Notable changes in Python 3.7.6 | |
| =============================== | |
| Due to significant security concerns, the *reuse_address* parameter of | |
| :meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This is | |
| because of the behavior of the socket option ``SO_REUSEADDR`` in UDP. For more | |
| details, see the documentation for ``loop.create_datagram_endpoint()``. | |
| (Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in | |
| :issue:`37228`.) |