В официальном блоге языка Python заявили о выходе новой версии и рассказали о списке актуальных изменений. Среди нововведений — улучшенный вывод ошибок, структурное сопоставление и более строгое итерирование.

Основные нововведения в Python 3.10.0:
добавлено структурное сопоставление шаблонов, позволяющее сравнивать переменные с одним из набором возможных значений. Реализация похожа на конструкцию switch/case, но с более широкими возможностями статической проверки типов:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
улучшенный анализатор синтаксиса и новые отчеты об ошибках. Теперь выводится более точная информация о природе ошибки и ее местоположении в коде:
print ("Hello"
print ("world")
# Было
File ".\test.py", line 2
print ("world?")
^
SyntaxError: invalid syntax
# Стало
File ".\test.py", line 1
print ("Hello"
^
SyntaxError: '(' was never closed
Для ошибок, связанных с опечатками в названиях атрибутов и имен переменных в функциях, добавили рекомендации по исправлению:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'.
Did you mean: namedtuple?
в операторе with можно использовать круглые скобки для разделения определения коллекции контекстных менеджеров на несколько строк. Можно не убирать запятую в последней строке:
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
в качестве шаблона можно использовать имя класса, после которого следует указать аргументы. Метод похож на конструкторы в других языках программирования и помогает записывать атрибуты в поля класса:
class Point:
x: int
y: int
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
в модуль typing добавили новый оператор, реализующий выбор из двух типов:
# Было
def square(number: Union[int, float]) -> Union[int, float]:
return number ** 2
# Стало
def square(number: int | float) -> int | float:
return number ** 2
функция zip() обзавелась необязательным флагом strict, который следит за одинаковой длиной итерируемых объектов:
>>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True))
[('a', 1), ('b', 2), ('c', 3)]
>>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True))
Traceback (most recent call last):
...
ValueError: zip() argument 2 is longer than argument 1
для целых чисел появился метод bit_count(), который возвращает количество единиц в двоичном представлении числа:
>>> num = 2021
>>> bin(num)
'0b11111100101'
>>> num.bit_count()
8
конструкторы str(), bytes() и bytearray() стали работать на 30-40% быстрее;
в модуль typing добавили оператор Concatenate и переменную ParamSpec, благодаря которым можно передать дополнительные данные для проверки типов с помощью Callable;
появились новые встроенные асинхронные функции aiter() и anext(), схожие с функциям iter() и next();
прекращена поддержка псевдонимов для абстрактных базовых классов из модуля collections;
удален старый парсер, на смену которому пришел PEG;
для сборки CPython теперь требуется OpenSSL 1.1.1 или более свежие версии;
для модулей hashlib и ssl добавили поддержку OpenSSL 3.0.0 и прекратили поддержку OpenSSL 1.1.1.
Одновременно с выходом Python 3.10.0 началось альфа-тестирование ветки Python 3.11. В течении 7 месяцев разработчики будут добавлять новые возможности и исправлять ошибки. После этого ветка на три месяца перейдет в стадию бета-тестирования.