What’s New In Python 3.9¶
- Editor:
Łukasz Langa
This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.
See also
PEP 596 - Python 3.9 Release Schedule
Summary – Release highlights¶
New syntax features:
PEP 584, union operators added to
dict;PEP 585, type hinting generics in standard collections;
PEP 614, relaxed grammar restrictions on decorators.
New built-in features:
PEP 616, string methods to remove prefixes and suffixes.
New features in the standard library:
PEP 593, flexible function and variable annotations;
os.pidfd_open()added that allows process management without races and signals.
Interpreter improvements:
PEP 573, fast access to module state from methods of C extension types;
PEP 617, CPython now uses a new parser based on PEG;
a number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using PEP 590 vectorcall;
garbage collection does not block on resurrected objects;
a number of Python modules (
_abc,audioop,_bz2,_codecs,_contextvars,_crypt,_functools,_json,_locale,math,operator,resource,time,_weakref) now use multiphase initialization as defined by PEP 489;a number of standard library modules (
audioop,ast,grp,_hashlib,pwd,_posixsubprocess,random,select,struct,termios,zlib) are now using the stable ABI defined by PEP 384.
New library modules:
PEP 615, the IANA Time Zone Database is now present in the standard library in the
zoneinfomodule;an implementation of a topological sort of a graph is now provided in the new
graphlibmodule.
Release process changes:
PEP 602, CPython adopts an annual release cycle.
You should check for DeprecationWarning in your code¶
When Python 2.7 was still supported, a lot of functionality in Python 3
was kept for backward compatibility with Python 2.7. With the end of Python
2 support, these backward compatibility layers have been removed, or will
be removed soon. Most of them emitted a DeprecationWarning warning for
several years. For example, using collections.Mapping instead of
collections.abc.Mapping emits a DeprecationWarning since Python
3.3, released in 2012.
Test your application with the -W default command-line option to see
DeprecationWarning and PendingDeprecationWarning, or even with
-W error to treat them as errors. Warnings Filter can be used to ignore warnings from third-party code.
Python 3.9 is the last version providing those Python 2 backward compatibility layers, to give more time to Python projects maintainers to organize the removal of the Python 2 support and add support for Python 3.9.
Aliases to Abstract Base Classes in
the collections module, like collections.Mapping alias to
collections.abc.Mapping, are kept for one last release for backward
compatibility. They will be removed from Python 3.10.
More generally, try to run your tests in the Python Development Mode which helps to prepare your code to make it compatible with the next Python version.
Note: a number of pre-existing deprecations were removed in this version of Python as well. Consult the Removed section.
New Features¶
Dictionary Merge & Update Operators¶
Merge (|) and update (|=) operators have been added to the built-in
dict class. Those complement the existing dict.update and
{**d1, **d2} methods of merging dictionaries.
Example:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
See PEP 584 for a full description. (Contributed by Brandt Bucher in bpo-36144.)
New String Methods to Remove Prefixes and Suffixes¶
str.removeprefix(prefix) and
str.removesuffix(suffix) have been added
to easily remove an unneeded prefix or a suffix from a string. Corresponding
bytes, bytearray, and collections.UserString methods have also been
added. See PEP 616 for a full description. (Contributed by Dennis Sweeney in
bpo-39939.)
Type Hinting Generics in Standard Collections¶
In type annotations you can now use built-in collection types such as
list and dict as generic types instead of importing the
corresponding capitalized types (e.g. List or Dict) from
typing. Some other types in the standard library are also now generic,
for example queue.Queue.
Example:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
See PEP 585 for more details. (Contributed by Guido van Rossum, Ethan Smith, and Batuhan Taşkaya in bpo-39481.)
New Parser¶
Python 3.9 uses a new parser, based on PEG instead of LL(1). The new parser’s performance is roughly comparable to that of the old parser, but the PEG formalism is more flexible than LL(1) when it comes to designing new language features. We’ll start using this flexibility in Python 3.10 and later.
The ast module uses the new parser and produces the same AST as
the old parser.
In Python 3.10, the old parser will be deleted and so will all functionality that depends