Пускане на езика за програмиране Python 3.10

След една година на разработка е представена значимата версия на езика за програмиране Python 3.10. Новият клон ще бъде поддържан в продължение на година и половина, след което за още три години и половина ще се генерират корекции за отстраняване на уязвимостите.

В същото време започна алфа тестване на клона на Python 3.11 (в съответствие с новия график за разработка, работата по нов клон започва пет месеца преди пускането на предишния клон и достига етапа на алфа тестване до момента на следващото издание ). Клонът на Python 3.11 ще бъде в алфа версия за седем месеца, през които ще бъдат добавени нови функции и коригирани грешки. След това бета версиите ще бъдат тествани в продължение на три месеца, през които добавянето на нови функции ще бъде забранено и цялото внимание ще бъде обърнато на отстраняването на грешки. Последните два месеца преди освобождаването клонът ще бъде на етап кандидат за освобождаване, на който ще бъде извършена окончателна стабилизация.

Новите допълнения към Python 3.10 включват:

  • Внедрени оператори "match" и "case" за съвпадение на шаблони, които подобряват четливостта на кода, опростяват съвпадението на произволни обекти на Python и повишават надеждността на кода чрез разширена статична проверка на типа. Реализацията е много подобна на оператора "match", осигурен в Scala, Rust и F#, който сравнява резултата от определен израз със списък от модели, изброени в блокове, базирани на оператора "case".

    def http_error(статус): състояние на съвпадение: case 400: връщане на „Лоша заявка“ case 401|403|404: връщане „Не е разрешено“ case 418: връщане „Аз съм чайник“ case _: връщане на „Нещо друго“

    Можете да разопаковате обекти, кортежи, списъци и произволни последователности, за да обвържете променливи въз основа на съществуващи стойности. Разрешено е да се дефинират вложени шаблони, да се използват допълнителни условия „if“ в шаблона, да се използват маски („[x, y, *rest]“), съпоставяне на ключ/стойност (например {„bandwidth“: b, „latency“ ”: l} за извличане на стойности за „честотна лента“ и „закъснение“ от речник), извличане на подшаблони (оператор „:="), използване на именувани константи в шаблон. В класовете е възможно да персонализирате поведението на съвпадение с помощта на метода „__match__()“.

    от 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("Някъде другаде") case _: print("Не е точка") съвпадение точка: case Point(x, y) if x == y: print(f"Y=X при {x}") case Point(x, y): print(f"Не по диагонала") ЧЕРВЕНО, ЗЕЛЕНО, BLUE = 0, 1, 2 съвпадащ цвят: case RED: print(„Виждам червено!“) case GREEN: print(„Тревата е зелена“) case BLUE: print(„Усещам блуса :(“)

  • Вече е възможно да се използват скоби в оператора with, за да се раздели дефиницията на колекция от контекстни мениджъри на няколко реда. Също така е позволено да оставите запетая след последния контекстен мениджър в групата: с ( CtxManager1() като example1, CtxManager2() като example2, CtxManager3() като example3, ): ...
  • Подобрено отчитане на местоположението на кода на грешки, свързани с незатворени скоби и кавички в низови литерали. Например, когато има незатворена скоба, вместо да докладва синтактична грешка в следната конструкция, показалецът сега подчертава отварящата скоба и показва, че няма затварящ блок. Файл "example.py", очаква се ред 1 = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' никога не е бил затварян

    Добавени са допълнителни специализирани съобщения за синтактични грешки: липсващ символ ":" преди блок и в речници, неразделяне на кортеж със скоби, липсваща запетая в списъците, указване на блок "опитай" без "освен" и "накрая", използвайки "= " вместо "= =" в сравнения, указвайки *-изрази в f-низове. В допълнение, той гарантира, че целият проблемен израз е подчертан, а не само началото, и по-ясна информация за контекста на грешките, свързани с неправилен отстъп. >>> def foo(): ... if lel: ... x = 2 Файл " ", ред 3 x = 2 ^ IndentationError: очаква се блок с отстъп след оператора "if" в ред 2

    При грешки, причинени от правописни грешки в имената на атрибути и имена на променливи във функция, се извежда препоръка с правилното име. >>>collections.namedtoplo Traceback (последно последно извикване): Файл « “, ред 1, в AttributeError: модулът „колекции“ няма атрибут „namedtoplo“. Имахте предвид: namedtuple?

  • За инструменти за отстраняване на грешки и профайлъри събитията за проследяване се предоставят с точните номера на редовете на изпълнения код.
  • Добавена е настройката sys.flags.warn_default_encoding за показване на предупреждение за потенциални грешки, свързани с TextIOWrapper и open(), обработващи UTF-8 кодирани файлове, без изрично да се указва опцията 'encoding=»utf-8″' (ASCII кодирането се използва по подразбиране) . Новата версия също така предоставя възможност за указване на стойност „encoding="locale"", за да зададете кодирането въз основа на текущия локал.
  • Нов оператор е добавен към модула за въвеждане, който предоставя инструменти за указване на анотации на типа, позволявайки използването на синтаксиса „X | Y", за да изберете един от типовете (тип X или тип Y). def square(число: int | float) -> int | float: върнато число ** 2 е еквивалентно на поддържаната преди това конструкция: def square(number: Union[int, float]) -> Union[int, float]: върнато число ** 2
  • Операторът Concatenate и променливата ParamSpec са добавени към модула за въвеждане, което ви позволява да предавате допълнителна информация за статична проверка на типа, когато използвате Callable. Модулът за въвеждане също добавя специални стойности TypeGuard за анотиране на функциите за защита на типа и TypeAlias ​​за изрично дефиниране на псевдоним на тип. StrCache: TypeAlias ​​​​= 'Cache[str]' # псевдоним на тип
  • Функцията zip() имплементира незадължителен „строг“ флаг, който, когато е указан, проверява дали аргументите, които се повтарят, са с еднаква дължина. >>> списък(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> списък (zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Обратно проследяване (най-новото извикване последно ): … ValueError: zip() аргумент 2 е по-дълъг от аргумент 1
  • Предлагат се нови вградени функции aiter() и anext() с внедряването на асинхронни аналози на функциите iter() и next().
  • С 30-40% е ускорена работата на конструкторите str(), bytes() и bytearray() при работа с малки обекти.
  • Намален е броят на операциите за импортиране в модула 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). Модулът за форматиране е премахнат. Параметърът за цикъл е премахнат от Asyncio API. Методите, които преди са били отхвърлени, са премахнати. Функциите Py_UNICODE_str*, които манипулират Py_UNICODE* низове, са премахнати.
  • Модулът distutils е отхвърлен и е планиран за премахване в Python 3.12. Вместо distutils се препоръчва да използвате модулите setuptools, packaging, platform, shutil, subprocess и sysconfig. Структурата wstr в PyUnicodeObject е отхвърлена и планирана за премахване.

Източник: opennet.ru

Добавяне на нов коментар