.. _python_39: Python 3.9 ========== Python 3.9.0 (final) was released on the 5th October 2020. The Features for 3.9 are defined in `PEP 596 `_ and a detailed description of the changes can be found in `What's New in Python 3.9 `_ .. table:: :widths: 20 60 20 +--------------------------------------------------------+----------------------------------------------------+----------------------+ | **Features** | | **Status** | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 573 `_ | Fast access to module state from methods of C | Not relevant | | | extension types | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 584 `_ | Union operators added to dict | Complete [#pep584]_ | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 585 `_ | Type hinting generics in standard collections | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 593 `_ | Flexible function and variable annotations | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 602 `_ | CPython adopts an annual release cycle. Instead of | Not relevant | | | annual, aiming for two month release cycle | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 614 `_ | Relaxed grammar restrictions on decorators | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 615 `_ | The IANA Time Zone Database is now present in the | | | | standard library in the zoneinfo module | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 616 `_ | String methods to remove prefixes and suffixes | | +--------------------------------------------------------+----------------------------------------------------+----------------------+ | `PEP 617 `_ | 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 `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | 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 `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | 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 `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | 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 `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | 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 `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Added a new *random.Random.randbytes* method: generate random bytes | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `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.