3.3 KiB
+++ title = "What's new in Python 3.9" description = "A list of major new features in python 3.9" date = 2020-11-10 [taxonomies] categories = ["python"] +++
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.