docs/differences/python_39.rst
.. _python_39:
Python 3.9.0 (final) was released on the 5th October 2020. The Features for 3.9 are
defined in PEP 596 <https://www.python.org/dev/peps/pep-0596/#features-for-3-9>_
and a detailed description of the changes can be found in
What's New in Python 3.9 <https://docs.python.org/3/whatsnew/3.9.html>_
.. table:: :widths: 20 60 20
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| Features | | Status |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 573 <https://www.python.org/dev/peps/pep-0573/>_ | Fast access to module state from methods of C | Not relevant |
| | extension types | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 584 <https://www.python.org/dev/peps/pep-0584/>_ | Union operators added to dict | Complete [#pep584]_ |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 585 <https://www.python.org/dev/peps/pep-0584/>_ | Type hinting generics in standard collections | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 593 <https://www.python.org/dev/peps/pep-0593/>_ | Flexible function and variable annotations | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 602 <https://www.python.org/dev/peps/pep-0602/>_ | CPython adopts an annual release cycle. Instead of | Not relevant |
| | annual, aiming for two month release cycle | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 614 <https://www.python.org/dev/peps/pep-0614/>_ | Relaxed grammar restrictions on decorators | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 615 <https://www.python.org/dev/peps/pep-0615/>_ | The IANA Time Zone Database is now present in the | |
| | standard library in the zoneinfo module | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 616 <https://www.python.org/dev/peps/pep-0616/>_ | String methods to remove prefixes and suffixes | |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
| PEP 617 <https://www.python.org/dev/peps/pep-0617/>_ | CPython now uses a new parser based on PEG | Not relevant |
+--------------------------------------------------------+----------------------------------------------------+----------------------+
Other Language Changes:
.. table:: :widths: 90 10
+-------------------------------------------------------------------------------------------------------------+---------------+ | import() now raises ImportError instead of ValueError | Complete | +-------------------------------------------------------------------------------------------------------------+---------------+ | Python now gets the absolute path of the script filename specified on the command line (ex: python3 | | | script.py): the file attribute of the main module became an absolute path, rather than a | | | relative path | | +-------------------------------------------------------------------------------------------------------------+---------------+ | By default, for best performance, the errors argument is only checked at the first encoding/decoding error | | | and the encoding argument is sometimes ignored for empty strings | | +-------------------------------------------------------------------------------------------------------------+---------------+ | "".replace("", s, n) now returns s instead of an empty string for all non-zero n. It is now consistent | | | with "".replace("", s) | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Any valid expression can now be used as a decorator. Previously, the grammar was much more restrictive | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Parallel running of aclose() / asend() / athrow() is now prohibited, and ag_running now reflects | | | the actual running status of the async generator | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Unexpected errors in calling the iter method are no longer masked by TypeError in the in operator and | | | functions contains(), indexOf() and countOf() of the operator module | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Unparenthesized lambda expressions can no longer be the expression part in an if clause in comprehensions | | | and generator expressions | | +-------------------------------------------------------------------------------------------------------------+---------------+
Changes to built-in modules:
.. table:: :widths: 90 10
+---------------------------------------------------------------------------------------------------------------+---------------+
| asyncio <https://docs.python.org/3/whatsnew/3.9.html#asyncio>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Due to significant security concerns, the reuse_address parameter of asyncio.loop.create_datagram_endpoint()| |
| is no longer supported | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added a new coroutine shutdown_default_executor() that schedules a shutdown for the default executor that | |
| waits on the ThreadPoolExecutor to finish closing. Also, asyncio.run() has been updated to use the new | |
| coroutine. | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added asyncio.PidfdChildWatcher, a Linux-specific child watcher implementation that polls process file | |
| descriptors | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| added a new coroutine asyncio.to_thread() | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| When cancelling the task due to a timeout, asyncio.wait_for() will now wait until the cancellation is | |
| complete also in the case when timeout is <= 0, like it does with positive timeouts | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| asyncio now raises TyperError when calling incompatible methods with an ssl.SSLSocket socket | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| gc <https://docs.python.org/3/whatsnew/3.9.html#gc>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Garbage collection does not block on resurrected objects | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added a new function gc.is_finalized() to check if an object has been finalized by the garbage collector | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| math <https://docs.python.org/3/whatsnew/3.9.html#math>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Expanded the math.gcd() function to handle multiple arguments. Formerly, it only supported two arguments | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added math.lcm(): return the least common multiple of specified arguments | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added math.nextafter(): return the next floating-point value after x towards y | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added math.ulp(): return the value of the least significant bit of a float | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| os <https://docs.python.org/3/whatsnew/3.9.html#os>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Exposed the Linux-specific os.pidfd_open() and os.P_PIDFD | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| The os.unsetenv() function is now also available on Windows | Complete |
+---------------------------------------------------------------------------------------------------------------+---------------+
| The os.putenv() and os.unsetenv() functions are now always available | Complete |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added os.waitstatus_to_exitcode() function: convert a wait status to an exit code | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| random <https://docs.python.org/3/whatsnew/3.9.html#random>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added a new random.Random.randbytes method: generate random bytes | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| sys <https://docs.python.org/3/whatsnew/3.9.html#sys>_ |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Added a new sys.platlibdir attribute: name of the platform-specific library directory | |
+---------------------------------------------------------------------------------------------------------------+---------------+
| Previously, sys.stderr was block-buffered when non-interactive. Now stderr defaults to always being | |
| line-buffered | |
+---------------------------------------------------------------------------------------------------------------+---------------+
.. rubric:: Notes
.. [#pep584] PEP 584 dict union operator is only available on MicroPython builds with MICROPY_CPYTHON_COMPAT enabled.