Go back 2020-11-10

What's new in Python 3.9

Python 3.9

Python 3.9 has been released on October 5, 2020.

Add Union Operators To dict (PEP 584)

This allows the union operation to be performed on dicts:

>>> a = {'x': 1, 'y': 2, 'z': 3}
>>> e = {'w': 'hello world'}
>>> a | e
{'x': 1, 'y': 2, 'z': 3, 'w': 'hello world'}

And also:

>>> x = a
>>> x
{'x': 1, 'y': 2, 'z': 3}
>>> x |= e
>>> x
{'x': 1, 'y': 2, 'z': 3, 'w': 'hello world'}

Type Hinting Generics In Standard Collections (PEP 585)

This feature enables type hinting using the standard collections without having to rely on the typings module.

Previously to type hint a list you would do:

from typings import List

def somefunc(a: List[int]):
    pass

Now you can use the standard type:


def somefunc(a: list[int]):
    pass

From this version, importing collections from typings is deprecated, and they will be removed in 5 years.

Flexible function and variable annotations (PEP 593)

This feature adds a new type Annotated which allows us to extend type annotations with metadata.

This allows a type T to be annotated with metadata x like so:

T1 = Annotated[T, x]

# E.g
UnsignedShort = Annotated[int, struct2.ctype('H')]
SignedChar = Annotated[int, struct2.ctype('b')]

# Multiple type annotations are supported
T2 = Annotated[int, ValueRange(3, 10), ctype("char")]

The metadata can then be used for static or runtime analysis with tools such as mypy

This feature allows authors to introduce new data types with graceful degradation, for example if mypy doesn’t know how to parse X Annotation it should just ignore its metadata and use the annotated type.

Relaxing Grammar Restrictions On Decorators (PEP 614)

Python currently requires that all decorators consist of a dotted name, optionally followed by a single call. This PEP proposes removing these limitations and allowing decorators to be any valid expression.

An expression here means “anything that’s valid as a test in if, elif, and while blocks”.

Basically this:

button_0 = buttons[0]

@button_0.clicked.connect
def spam():
    pass

Can now be:

@buttons[0].clicked.connect
def spam():
    pass

Support for the IANA Time Zone Database in the Standard Library

This feature adds a new module zoneinfo that provides a concrte time zone implementation supporting the IANA time zone database.

You can find more about this module here: zoneinfo

Example:

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta

>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00

>>> dt.tzname()
'PDT'

String methods to remove prefixes and suffixes

Adds two new methods, removeprefix() and removesuffix(), to the APIs of Python’s various string objects.