mirror of
https://github.com/edg-l/edgarluque.com.git
synced 2024-11-14 03:58:22 +00:00
118 lines
3.3 KiB
Markdown
118 lines
3.3 KiB
Markdown
+++
|
|
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:
|
|
|
|
```python
|
|
>>> a = {'x': 1, 'y': 2, 'z': 3}
|
|
>>> e = {'w': 'hello world'}
|
|
>>> a | e
|
|
{'x': 1, 'y': 2, 'z': 3, 'w': 'hello world'}
|
|
```
|
|
|
|
And also:
|
|
```python
|
|
>>> 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:
|
|
|
|
```python
|
|
from typings import List
|
|
|
|
def somefunc(a: List[int]):
|
|
pass
|
|
```
|
|
|
|
Now you can use the standard type:
|
|
```python
|
|
|
|
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:
|
|
|
|
```python
|
|
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](http://www.mypy-lang.org/)
|
|
|
|
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:
|
|
|
|
```python
|
|
button_0 = buttons[0]
|
|
|
|
@button_0.clicked.connect
|
|
def spam():
|
|
pass
|
|
```
|
|
|
|
Can now be:
|
|
```python
|
|
@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](https://docs.python.org/3/library/zoneinfo.html)
|
|
|
|
Example:
|
|
|
|
```python
|
|
>>> 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()](https://docs.python.org/3/library/stdtypes.html?highlight=removeprefix#str.removeprefix) and [removesuffix()](https://docs.python.org/3/library/stdtypes.html?highlight=removeprefix#str.removesuffix), to the APIs of Python's various string objects. |