Python 3.9: Какво ново и по-добро

Python 3.9, пуснат днес, предлага значителни промени както в характеристиките на езика, така и в начина, по който се развива езикът. Популярността на Python нараства през последните няколко години и използването му нараства в бързо развиващите се области като науката за данни и машинното обучение. Проектът работи усилено, за да бъде в крак с всички нови изисквания. 

Ето списък на всички големи нови функции в Python 3.9.

Python преминава към годишен цикъл на издаване

До този момент Python е разработен и пуснат на осемнадесетмесечен каданс. PEP 602 предложи екипът за разработка на Python да приеме годишен цикъл на освобождаване и това предложение беше прието. 

Годишният цикъл на издаване означава по-малко функции на издание, но също така означава по-бърза обратна връзка за тестване на функции, по-малко потенциално нарушаващи промени за всяко издание и по този начин по-голям стимул за потребителите и дистрибуторите на Linux да обновяват Python по-често. Това също означава, че новите функции, предложени в края на цикъла на разработка, няма да отнемат толкова време, докато бъдат въведени в нова версия.

Новата времева линия означава, че Python 3.9 ще бъде доставен през октомври 2020 г. Python 3.10 официално стартира предварително алфа разработка на 19 май 2020 г., ще влезе във фазата на алфа разработка, когато Python 3.9 се доставя, и ще бъде изпратен през октомври 2021 г. Бъдещите версии на Python ще последват същия модел.

Python става по-бърз по подразбиране

Всяка ревизия на Python се радва на подобрения в производителността спрямо предишната версия. Python 3.9 включва две големи подобрения, които повишават производителността, без да изискват промени в съществуващия код.

Първото подобрение включва повече използване на vectorcallпротокола, въведен в Python 3.8. vectorcallправи много често срещани функционални повиквания по-бързи, като минимизира или елиминира временните обекти, създадени за разговора. В Python 3.9 няколко вградени Python - range, tuple, set, frozenset, list, dict- използват vectorcallвътрешно, за да ускорят изпълнението.

Вторият подобрител на производителността е по-ефективното анализиране на изходния код на Python. Новият парсер за изпълнението на CPython не е проектиран да адресира проблеми с производителността, а по-скоро да се справи с вътрешни несъответствия в оригиналния парсер. Важна полза обаче е по-бързото анализиране, особено за големи обеми код.

Още функции на Python низ и речник

Python улеснява манипулирането на често срещани типове данни, а Python 3.9 разширява тази лекота с нови функции за низове и речници. За низовете има нови методи за премахване на префикси и суфикси, операции, които отдавна изискват много ръчна работа, за да се изтеглят. За речниците вече има съюзни оператори, един за обединяване на два речника в нов речник и един за актуализиране на съдържанието на един речник с друг речник.

Декораторите губят някои ограничения

Декораторите ви позволяват да обвивате функциите на Python, за да промените програмното им поведение. Преди това декораторите можеха да се състоят само от символа @, име (напр. func) Или пунктирано име ( func.method) и по желание едно повикване ( func.method(arg1, arg2)). С Python 3.9 декораторите вече могат да се състоят от всеки валиден израз.

Един дългогодишен начин да се заобиколи това ограничение беше да се създаде функция или ламбда израз, който би се застъпил за по-сложен израз, когато се използва като декоратор. Сега всеки израз ще свърши работа, при условие че дава нещо, което може да функционира като декоратор.

Нови операции от тип Python

През последните няколко версии Python разшири поддръжката за подсказване на тип. Това е главно заради линтерите и проверките на кода; типовете не се налагат по време на изпълнение в CPython и не се планира Python да бъде статично типизиран език. Но подсказването на тип е мощен инструмент за осигуряване на последователност в големи кодови бази, така че кодът на Python все още може да се възползва от наличието на подсказки за тип. 

Две нови функции за подсказване на тип и анотации на типа са проникнали в Python 3.9. В един тип подсказки за съдържанието на колекции - напр. Списъци и речници - вече са достъпни в Python. Това означава, че можете например да опишете списък като list[int] - списък с цели числа - без да е необходимо typingбиблиотеката да го прави.

Второто допълнение към механизмите за писане на Python е гъвкавата функция и анотациите на променливите. Това позволява използването на Annotatedтипа за описване на тип, използвайки метаданни, които могат да бъдат проверени преди време (с инструменти за свързване) или по време на изпълнение. Например, Annotated[int, ctype("char")]може да се използва за описване на цяло число, което трябва да се разглежда като charтип в C. По подразбиране Python не би направил нищо с такава анотация, но може да се използва от кодови линтери. 

Подобрения във вътрешността на Python

Почистването, усъвършенстването и модернизирането на вътрешните компоненти на Python е постоянна инициатива за разработчиците на Python и Python 3.9 има няколко промени в тази насока.

Първият е редизайн на начина, по който модулите взаимодействат с машината за импортиране. Модулите за разширение на Python, написани на C, вече могат да използват нов механизъм за зареждане, който ги кара да се държат по-скоро като обикновени модули на Python, когато се импортират. Няколко модули в стандартната библиотека на Питон наскоро подкрепят това поведение: _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref. Новият механизъм за зареждане не само позволява на модулите за разширение да се обработват по-гъвкаво от Python, но също така дава възможност за нови възможности като разширено поведение на закачане.

Втората инициатива за почистване е стабилен вътрешен ABI за CPython, който гарантирано ще продължи за целия живот на Python 3. Исторически погледнато, всяка основна ревизия на Python е несъвместима с ABI с предишните версии, изисквайки модулите за разширение да бъдат прекомпилирани за всяка нова версия. Отсега нататък всички модули за разширения, които използват стабилния ABI, ще работят във версиите на Python. С Python 3.9, следните модули в стандартната библиотека използват конюшнята ABI: audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib.

Други промени в Python 3.9

  • Стандартната библиотека на Python вече поддържа базата данни IANA Time Zone. Споменатата база данни е добре поддържана и широко използвана и наличието на директен начин да я използвате в библиотеката за дата и час на Python ще бъде голямо, ъ-ъ, спестяване на време.
  • Новите низови методи позволяват лесно премахване на префиксите и суфиксите. Това е един от често срещаните сценарии за ежедневна употреба, които изискват малко прекалено много шаблон, отколкото изглеждаше необходимо. Новите .removeprefix()и .removesuffix()методите връщат модифицирано копие на низ минус въпросния префикс или суфикс, при условие че съществуват в низа.

Как да направите повече с Python

  • 4 проверки от тип Python, за да поддържате кода си чист
  • Стил на Python: 5 инструмента за почистване на вашия код на Python
  • Как да работите с типа данни на списъка на Python
  • Как да пакетирате приложения на Python с куфарче BeeWare
  • Как да стартирате Anaconda рамо до рамо с други Pythons
  • Как да използвам класовете данни на Python
  • Започнете с async в Python
  • Как да използвам asyncio в Python
  • 3 стъпки към основен ремонт на Python async
  • Как да използвам PyInstaller за създаване на изпълними файлове на Python
  • Урок за Cython: Как да ускорим Python
  • Как да инсталирате Python по интелигентен начин
  • Как да управлявате проекти на Python с поезия
  • Как да управлявате проекти на Python с Pipenv
  • Virtualenv и venv: Обяснени са виртуалните среди на Python
  • Python virtualenv и venv правят и не
  • Обяснение на нишките на Python и подпроцесите
  • Как да използвам Python дебъгер
  • Как да използвам timeit за профилиране на Python код
  • Как да използвам cProfile за профилиране на Python код
  • Как да конвертирате Python в JavaScript (и обратно)