This is a quick walk-through of the newly added features in Python 3.11. Of course, you can find many more other features and improvements during the migration from 3.10 to 3.11 but I tried to note five handy features and improvements that I think would be perfect for you to observe while coding along in Python.
tomllib
Is Added to the Standard Library
The tomllib
library used to be a third-party package for your Python<3.11 projects. Now, they've decided to add this handy package to the official standard library so that you won't need any further installation to access the utilities this library provides for you.
import tomllib
with open('setup.toml', 'rb') as f:
data = tomllib.load(f)
print(data) # -> {...}
TOML
stands for Tom's Obvious, Minimal Language. It's a powerful config file data type that is compatible with other Python components such assetuptools
. It's also more human-readable compared to JSON, YAML, and some other structures.
add_note
Method Is Added to Exception
Base-Class
try:
email, message = input('to: '), input('message: ')
send_email(email, message)
except ConnectionError as e:
e.add_note('Make sure the mail server is up and running')
raise
Tracebacks Are More Detailed
It shows the exact place that caused the error with "~" followed by "^".
Traceback (most recent call last):
File "query.py", line 32, in query_user
return 1 + query_count(db, response[e][b][user, retry=True)
~~~~~~~~~~~~~~~^^^^
TypeError: NoneType object is not subscriptable
Self
Type Class Is Here
For all the methods you have, you can annotate the args
with Self
other than the name of your class. It helps you in a case when you have multiple methods that have arguments annotated to the class and you decide to change the class name. (There is a difference between self
and Self
in Python from now on. self
refers to the object whereas Self
refers to the class for annotations)
class Student:
@classmethod
def give_info(cls) -> Self:
...
Use StrEnum
Over Enum
For Your Strings
If you need a class of strings, then use StrEnum
. They make your code readable and you won't need any additional writing. Just use auto()
for the values. Both following enums work as same as the other.
from enum import Enum, StrEnum, auto
class Colors(Enum):
RED = 'red'
BLUE = 'blue'
WHITE = 'white'
class Colors(StrEnum):
RED = auto()
BLUE = auto()
WHITE = auto()
We also have ReprEnum
which changes the return value of __repr__
of each object.
Final Words
We have so many typing improvements in 3.11 so far. That's awesome! Now all our annotations are more accurate and detailed.