| **************************** |
| 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 :ref:`Python UTF-8 Mode |
| <utf8-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:expr:`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:expr:`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:expr:`int`. |
| |
| Note that on platforms where the native TLS key is defined in a way that cannot |
| be safely cast to :c:expr:`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://peps.python.org/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 :attr:`~traceback.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 Inada Naoki 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 <https://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:`!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()` 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 :const:`socket.TCP_CONGESTION` |
| (Linux 2.6.13), :const:`socket.TCP_USER_TIMEOUT` (Linux 2.6.37), and |
| :const:`socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constants. |
| (Contributed by Omar Sandoval in :issue:`26273` and |
| Nathaniel J. Smith in :issue:`29728`.) |
| |
| Support for :const:`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`.) |
| |
| Added :attr:`ssl.SSLContext.post_handshake_auth` to enable and |
| :meth:`ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3 |
| post-handshake authentication. |
| (Contributed by Christian Heimes in :gh:`78851`.) |
| |
| 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 :const:`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: |
| |
| * :const:`time.CLOCK_BOOTTIME` (Linux): Identical to |
| :const:`time.CLOCK_MONOTONIC`, except it also includes any time that the |
| system is suspended. |
| * :const:`time.CLOCK_PROF` (FreeBSD, NetBSD and OpenBSD): High-resolution |
| per-process CPU timer. |
| * :const:`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 |
| <https://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 :ref:`CPython debug builds <debug-build>`, 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 |
| --- |
| |
| As mitigation against DTD and external entity retrieval, the |
| :mod:`xml.dom.minidom` and :mod:`xml.sax` modules no longer process |
| external entities by default. |
| (Contributed by Christian Heimes in :gh:`61441`.) |
| |
| |
| 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:struct:`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:expr:`long` to |
| :c:expr:`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:expr:`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 |
| :attr:`~frame.f_trace_lines` and :attr:`~frame.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 ``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()` |
| (replaced by |
| :meth:`MetaPathFinder.find_spec() <importlib.abc.MetaPathFinder.find_spec>`) |
| and |
| :meth:`!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 `CI configuration file |
| <https://github.com/python/cpython/blob/v3.7.13/.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 :func:`!ntpath.splitunc` function was deprecated in |
| Python 3.1, and has now been removed. Use :func:`~os.path.splitdrive` |
| 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 ``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:`windows_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`.) |
| |
| Notable changes in Python 3.7.10 |
| ================================ |
| |
| Earlier Python versions allowed using both ``;`` and ``&`` as |
| query parameter separators in :func:`urllib.parse.parse_qs` and |
| :func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with |
| newer W3C recommendations, this has been changed to allow only a single |
| separator key, with ``&`` as the default. This change also affects |
| :func:`!cgi.parse` and :func:`!cgi.parse_multipart` as they use the affected |
| functions internally. For more details, please see their respective |
| documentation. |
| (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) |
| |
| Notable changes in Python 3.7.11 |
| ================================ |
| |
| A security fix alters the :class:`ftplib.FTP` behavior to not trust the |
| IPv4 address sent from the remote server when setting up a passive data |
| channel. We reuse the ftp server IP address instead. For unusual code |
| requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` |
| attribute on your FTP instance to ``True``. (See :gh:`87451`) |
| |
| |
| The presence of newline or tab characters in parts of a URL allows for some |
| forms of attacks. Following the WHATWG specification that updates RFC 3986, |
| ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the |
| URL by the parser :func:`urllib.parse` preventing such attacks. The removal |
| characters are controlled by a new module level variable |
| ``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :gh:`88048`) |
| |
| Notable security feature in 3.7.14 |
| ================================== |
| |
| Converting between :class:`int` and :class:`str` in bases other than 2 |
| (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) |
| now raises a :exc:`ValueError` if the number of digits in string form is |
| above a limit to avoid potential denial of service attacks due to the |
| algorithmic complexity. This is a mitigation for `CVE-2020-10735 |
| <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10735>`_. |
| This limit can be configured or disabled by environment variable, command |
| line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion |
| length limitation <int_max_str_digits>` documentation. The default limit |
| is 4300 digits in string form. |