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

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

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

Сред нововъведенията в Python 3.11 са:

  • Извършена е значителна работа по оптимизация на производителността. В новата версия са включени изменения, свързани с ускоряване и inline-разгръщане на повиквания на функции, с употребата на бързи интерпретатори на типови операции (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), както и оптимизации, подготвени от проектите Cinder и HotPy. В зависимост от вида натоварване, се наблюдава увеличение на скоростта на изпълнение на кода с 10-60%. Средно производителността при преминаване на тестовия набор pyperformance е увеличена с 25%.

    Преработен е механизмът за кеширане на байткод, което е позволило да се намали времето за стартиране на интерпретатора с 10-15%. Обектите с код и байткод сега се разполагат статически от интерпретатора, което е дало възможност да се изключат етапите на демаршалиране на извлечения байткод от кеша и преобразуването на обекти с код за разполагане в динамична памет.

  • При показването на трасировката на извиквания в диагностичните съобщения е осигурен изход на информация за израза, поради който е възникнала грешка (по-рано се подсветваше само реда без подробности коя част от реда е причината за грешката). Разширена информация за трасировката може да бъде получена и чрез API и да се използва за съпоставяне на отделни инструкции с конкретна позиция в изходния код, използвайки метода codeobject.co_positions() или функцията C API PyCode_Addr2Location(). Това изменение значително опростява отстраняването на проблеми, свързани с вложени обекти на речници, множество извиквания на функции и сложни аритметични изрази. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
  • Добавена е поддръжка на групи изключения, предоставящи на програмата възможността да генерира и обработва незабавно няколко различни изключения. За групирането на няколко изключения и техния съвместен извикване са предложени нови типове изключения ExceptionGroup и BaseExceptionGroup, а за изваждане на отделни изключения от групата е добавено израза «except*».
  • В класа BaseException е добавен метод add_note(), позволяващ прикрепването на текстова забележка към изключението, например добавяне на контекстуална информация, недостъпна по време на генерирането на изключението.
  • Добавен е специален тип Self, представляващ текущия затворен клас. Self може да се използва за анотиране на методи, които връщат екземпляр на своя клас, по-лесен начин от използването на TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Добавен специален тип LiteralString, който може да включва само стрингови литерали, съвместими с типа LiteralString (т.е. чисти низове и низове с типа LiteralString, но не произволни и не комбинирани низове с типа str). Типът LiteralString може да се използва за ограничаване на предаването на стрингови аргументи на функции, произволната подмяна на части от низовете в които може да доведе до уязвимости, например, при формиране на низове за SQL запитвания или shell команди. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(«SELECT * FROM students») # ok run_query(literal_string) # ok run_query(«SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Грешка run_query( # Грешка f»SELECT * FROM students WHERE name = {arbitrary_string}» )
  • Добавен тип TypeVarTuple, позволяващ използването на вариативни дженерики, в отличие от TypeVar, който обхваща не един тип, а произволен брой типове.
  • В стандартната библиотека е добавен модул tomllib с функции за парсване на формата TOML.
  • Предоставена е възможност за маркиране на отделни елементи на типизирани речници (TypedDict) с етикети Required и NotRequired за определяне на задължителни и незадължителни полета (по подразбиране всички обявени полета са задължителни за попълване, освен ако параметърът total не е зададен на False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (полето year е незадължително) m3: Movie = {«year»: 2022} # Грешка, не е попълнено задължителното поле title)
  • В модула asyncio е добавен клас TaskGroup с реализация на асинхронен контекстен мениджър, чакащ завършването на група задачи. Добавянето на задачи в групата се осъществява с помощта на метода create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«И двете задачи сега са завършени.»)
  • Добавен декоратор за класове, методи и функции @dataclass_transform, при указването на който системата за статична проверка на типовете разглежда обекта, както при използването на декоратора @dataclasses.dataclass. В примера по-долу класът CustomerModel при проверка на типовете ще бъде обработен по аналогия с клас с декоратора @dataclasses.dataclass, т.е. като имащ метод __init__, допускащ променливи id и name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • В регулярните изрази е добавена възможност за използване на атомарна група ((?>…)) и ревниви (possessive) квантификатори (*+, ++, ?+, {m,n}+).
  • Добавена е опцията в командния ред «-P» и променливата на средата PYTHONSAFEPATH за деактивиране на автоматичното добавяне на потенциално опасни файлови пътища към sys.path.
  • Съществено е подобрена утилитата py.exe за платформа Windows, която поддържа синтаксиса «-V:<company>/{tag}» в допълнение към «-<major>.<minor>».
  • Много от макросите в C API са преобразувани в обикновени или статични inline-функции.
  • Обявени са за остарели и ще бъдат премахнати в версия Python 3.13 модулите uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev и sunau. Премахнати са функциите PyUnicode_Encode*.

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster