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
Features  | 
Status  | 
|
Fast access to module state from methods of C extension types  | 
Not relevant  | 
|
Union operators added to dict  | 
Complete [1]  | 
|
Type hinting generics in standard collections  | 
||
Flexible function and variable annotations  | 
||
CPython adopts an annual release cycle. Instead of annual, aiming for two month release cycle  | 
Not relevant  | 
|
Relaxed grammar restrictions on decorators  | 
||
The IANA Time Zone Database is now present in the standard library in the zoneinfo module  | 
||
String methods to remove prefixes and suffixes  | 
||
CPython now uses a new parser based on PEG  | 
Not relevant  | 
Other Language Changes:
__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:
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  | 
|
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  | 
|
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  | 
|
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  | 
|
Added a new random.Random.randbytes method: generate random bytes  | 
|
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  | 
|
Notes