След година на разработка, значителен релиз на програмния език Python 3.10 е представен. Новият клон ще бъде поддържан в течение на година и половина, след което ще има още три и половина години за формулиране на корекции с отстраняване на уязвимости.
С concurrently започна алфа тестването на клона Python 3.11 (в съответствие с новия график за разработка, работата по новия клон започва пет месеца преди пускането на предишния клон и в момента на следващия релиз достига стадий на алфа тестване). Клонът Python 3.11 ще бъде в режим на алфа версии в течение на седем месеца, през които ще бъдат добавени нови функции и ще бъде извършено отстраняване на грешки. След това, в течение на три месеца, ще се провеждат тестове на бета версии, в които добавянето на нови функции ще бъде забранено и всичкото внимание ще бъде насочено към отстраняването на грешки. Последните два месеца преди релиза, клонът ще бъде в стадий на кандидат за релиза, при който ще се извърши финалната стабилизация.
Сред новостите, добавени в Python 3.10:
- Въведени са операторите «match» и «case» за шаблонно съпоставяне, които позволяват подобряване на четивността на кода, опростяване на съпоставянето на произволни Python обекти и повишаване на надеждността на кода благодарение на възможността за разширена статична проверка на типовете. Реализацията до голяма степен напомня на оператора «match», предлаган в езиците Scala, Rust и F#, който извършва сравнение на резултата от изпълнението на указаното израз с списък от шаблони, представени в блоковете, основаващи се на оператора «case».
def http_error(status): match status: case 400: return «Bad request» case 401|403|404: return «Not allowed» case 418: return «I’m a teapot» case _: return «Something else»
Възможно е разпаковането на обекти, кортежи, списъци и произволни последователности за свързване на променливи на основата на наличните стойности. Допуска се определяне на вложени шаблони, използването на допълнителни условия „if“ в шаблона, прилагане на маски („[x, y, *rest]“), картографиране на ключ/стойност (например, {„bandwidth“: b, „latency“: l} за извличане на стойностите „bandwidth“ и „latency“ от речника), извличане на подшаблони (оператор „:=“), използване на именувани константи в шаблона. В класовете е възможна настройка на поведението при съвпадение с помощта на метода „__match__()“.
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print(„Origin“) case Point(0, y): print(f„Y={y}“) case Point(x, 0): print(f„X={x}“) case Point(): print(„Somewhere else“) case _: print(„Not a point“) match point: case Point(x, y) if x == y: print(f„Y=X at {x}“) case Point(x, y): print(f„Not on the diagonal“) RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print(„I see red!“) case GREEN: print(„Grass is green“) case BLUE: print(„I’m feeling the blues :(„)
- Предоставена е възможност за използване на кръгли скоби в оператора with за разпределяне на определенията на колекции от контекстни мениджъри на няколко реда. Включително е разрешено оставянето на запетая след последния контекстен мениджър в групата: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Подобрено е уведомлението за местоположението в кода при грешки, свързани с незакрити фигурни скоби и кавички в строкови литерали. Например, при незакрита фигурна скоба вместо уведомяване за грешка в синтаксиса в следващата конструкция, указателят сега осветява отварящата фигурна скоба и уведомява за липсата на затварящ блок. File „example.py“, line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ was never closed
Добавени са допълнителни специализирани съобщения за грешки в синтаксиса: липса на символа «:» преди блока и в речниците, ненабляване на кортежа с скобите, липса на запетая в списъците, указание за блока «try» без «except» и «finally», използване на «=» вместо «==» в сравненията, указание на *-изрази в f-стрингове. Освен това, е осигурено изтъкване на цялото проблемно изразяване, а не само на неговото начало, и по-очевидно информиране за контекста на грешките, свързани с неправилно подреждане на отстъпите. >>> def foo(): … if lel: … x = 2 File «», line 3 x = 2 ^ IndentationError: expected an indented block after ‘if’ statement in line 2
При грешки, предизвикани от печатни грешки в името на атрибутите и имената на променливите във функцията, е осигурен изход на предложение с правилното име. >>> collections.namedtoplo Traceback (most recent call last): File «», line 1, in AttributeError: module ‘collections’ has no attribute ‘namedtoplo’. Did you mean: namedtuple?
- За инструментите за отстраняване на грешки и профилировчиците е осигурено указание в събитията за проследяване на точните номера на редовете на изпълнения код.
- Добавена е настройка sys.flags.warn_default_encoding за извеждане на предупреждение за потенциални грешки, свързани с обработката в TextIOWrapper и open() файлове в кодировка UTF-8 без явно указване на опцията ‘encoding=»utf-8″‘ (по подразбиране се използва кодировката ASCII). Също така в новото издание е предоставена възможност за указване на стойността ‘encoding=»locale»‘ за установяване на кодировката на базата на текущата локализация.
- В модула typing, предоставящ средства за задаване на анотации на типовете, е добавен нов оператор, позволяващ използването на синтаксиса «X | Y» за избиране на един от типовете (тип X или тип Y). def square(number: int | float) -> int | float: return number ** 2 е еквивалентно на преди поддържания конструкция: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- В модула typing е добавен оператор Concatenate и променливата ParamSpec, които позволяват предаване на допълнителна информация за статичната проверка на типовете при използване на Callable. В модула typing също така са добавени специални стойности TypeGuard за анотиране на функции за защита на типовете и TypeAlias за явно определяне на псевдоними на типове. StrCache: TypeAlias = ‘Cache[str]’ # a type alias
- В функцията 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
- Предложени са нови вградени функции aiter() и anext() с реализация на асинхронни аналози на функциите iter() и next().
- Работата на конструкторите str(), bytes() и bytearray() е ускорена с 30-40% при работа с малки обекти.
- Броят на операциите по импортиране в модула runpy е намален. Командата «python3 -m име_на_модула» сега се стартира средно с 1.4 пъти по-бързо заради намаляването на импортираните модули от 69 до 51.
- В инструкциите LOAD_ATTR е активиран механизмът за кеширане на отделни опкоди, което е позволило да се ускори работата с обикновени атрибути до 36%, а със слотове до 44%.
- При компилация на Python с опцията «—enable-optimizations» сега се активира режим «-fno-semantic-interposition», който позволява да се ускори работата на интерпретатора с до 30% в сравнение с компилацията с опцията «—enable-shared».
- В модулите hashlib и ssl е добавена поддръжка на OpenSSL 3.0.0 и е прекратена поддръжката на версии на OpenSSL по-стари от 1.1.1.
- Старият парсер е премахнат, като на негово място в предишния клон е внедрен парсер PEG (Parsing Expression Grammar). Модулът formatter е премахнат. От API asyncio параметърът loop е премахнат. Премахнати са методи, които преди това бяха обявени за остарели. Премахнати са функции Py_UNICODE_str*, манипулиращи низове Py_UNICODE*.
- Обявен е за остарял модулът distutils, който е планиран за премахване в Python 3.12. Вместо distutils се препоръчва да се използват модулите setuptools, packaging, platform, shutil, subprocess и sysconfig. В категорията на остарели и планирани за премахване е включена структурата wstr в PyUnicodeObject.
Източник: opennet.ru
