Python 3.9 has been released on October 5, 2020.
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'}
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.
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.
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
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'
Adds two new methods, removeprefix() and removesuffix(), to the APIs of Python’s various string objects.