Фічі та апгрейди версії Python 3.13 | robot_dreams
Для відстеження статусу замовлення - авторизуйтесь
Введіть код, який був надісланий на пошту Введіть код із SMS, який був надісланий на номер
 
Код дійсний протягом 2 хвилин Код з SMS дійсний протягом 2 хвилин
Ви впевнені, що хочете вийти?
Сеанс завершено
На головну
Що нового: Фічі та апгрейди версії Python 3.13

Що нового: Фічі та апгрейди версії Python 3.13

Для продуктивного програмування

Python продовжує стабільно розвиватися — із кожним оновленням мова стає зручнішою, швидшою та гнучкішою. У новій версії з’явилося чимало апдейтів як на рівні щоденного користування, так і «під капотом» — там, де зміни менш помітні, але критично важливі для майбутньої продуктивності мови.

У цьому огляді зібрали ключові апдейти Python 3.13: що стало краще вже зараз і що закладає фундамент для наступних версій.

REPL: покращений інтерактивний інтерпретатор

REPL, або ж Read-Eval-Print Loop — це стандартний інтерактивний інтерпретатор, який запускається, коли ви вводите python у терміналі. У версії 3.13 додали кілька змін до його роботи, щоб розширити функціонал та вдосконалити UX. 

Traceback та кольорова підсвітка синтаксису 

Починаючи з 3.13, REPL покладається на інтеграцію з rich-style рендерингом, використовуючи новий модуль pyrepl. Тепер REPL автоматично підсвічує синтаксис коду, помилки та ключові слова. 

Підсвічування працює автоматично, без сторонніх бібліотек, за умови, що термінал підтримує ANSI. До того ж traceback’и тепер теж мають зручніший вигляд. Вони стали кольоровими, читабельнішими та «навчилися» підкреслювати ключові ділянки помилки. 

Багаторядкове редагування з історією

Це покращення дає змогу легко повернутися до раніше введених блоків коду. Відтепер вам не потрібно клацати стрілку вгору безліч разів, щоб повернутися до рядка, де ви припустилися помилки. 

У Python 3.13 ви можете переміщатися одразу між блоками коду й швидко виправити все, зберігши історію попередніх рядків. Таке просте, але водночас довгоочікуване оновлення щиро порадувало спільноту.

Команди без дужок: exit, help, clear

У Python 3.13 і далі вам більше не потрібно застосовувати дужки для часто використовуваних REPL-команд. Натомість вони працюють як вбудовані shell-команди. 

>>> exit
# вихід з REPL

>>> help
# відкриває інтерактивну документацію

>>> clear
# очищує REPL-екран

Команда clear нова і доступна тільки в REPL — вона очищає екран так само, як cls у Windows або clear в Unix-терміналі.

Попри те, що функції exit() та help() досі існують, Python 3.13 додає обробку цих команд як іменованих REPL-дій, що особливо зручно для новачків.

Free-threaded режим

Однією з найбільш очікуваних та амбітних змін у Python 3.13 стала експериментальна підтримка режиму без GIL (Global Interpreter Lock) — згідно з PEP 703. Так, free-threaded mode став першим кроком Python до багатопотокової роботи без штучних обмежень на кшталт GIL. Вони хоч і корисні, але часто були перешкодою для CPU-bound задач у багатоядерних системах. 

Чому GIL — проблема?

Передусім це механізм, який не дозволяє кільком потокам виконувати байткод Python одночасно. Це спрощує реалізацію інтерпретатора, але обмежує продуктивність застосунків, які завʼязані на потужностях процесора. Окрім цього, GIL блокує можливість паралелізму всередині одного процесу.

Що таке No-GIL?

No-GIL є альтернативною збіркою CPython у якій відсутній Global Interpreter Lock. Відповідно, це дає змогу налаштовувати реальну паралельну роботу потоків. Втім, у 3.13 цей режим експериментальний та не активується за стандартних налаштувань. 

Щоб скористатися режимом, потрібно скомпілювати СPython вручну: 

./configure --disable-gil

make -j

Важливо, що в режим без GIL, виділення памʼяті, обробка обʼєктів та GC стали thread-safe. Також ввели новий API для потокобезпечного управління обʼєктами. Наприклад, це працює так:

import threading

def count():

    for i in range(10000000):

        pass

threads = [threading.Thread(target=count) for _ in range(4)]

for t in threads:

    t.start()

for t in threads:

    t.join()

У No-GIL це дає майже лінійний приріст продуктивності на 4 ядрах. Своєю чергою, в GIL майже немає приросту, адже потоки блокують один одного. 

Підтримка нового механізму типізації

Оновлення 3.13 також зробило акцент на рух до більш виразної статичної типізації. У цьому релізі зʼявились як нові можливості для анотацій типів, так і покращення для розробників, що створюють масштабовані проєкти з довготривалою підтримкою. 

Так, у модулі typing зʼявився новий експериментальний маркер — typing.ReadOnly. 

З ним можна вказати, що певне поле, змінна або властивість не повинні змінюватися після створення — лише зчитуватися. Це особливо корисно під час опису конфігураційних обʼєктів або immutable API.

Також додали покращення у warnings та argparse для типізацій. До прикладу, зʼявився — новий параметр, яким можна позначати аргументи як застарілі:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--old-flag', deprecated=True)

Python 3.13 також позначає низку старих типів/функцій як застарілі або планує їх перенесення в модуль typing_extensions. Це потрібно для поступового переходу до typing_extensions для підтримки нових функцій у старіших версіях.

Just-In-Time компіляція

Реліз версії 3.13 приніс і експериментальну реалізацію JIT-компілятора у складі CPython, описану в PEP 744. Це перший інтегрований крок до JIT-компіляції у «ванільному» CPython — без сторонніх проєктів типу PyPy. JIT важливий для інтенсивних обчислень, highload задач, числових обрахунків, а також роботи з ML/AI-бібліотеками.

У контексті Python Just-In-Time (JIT) компіляція — це техніка, за якої байт-код Python під час виконання може компілюватися в машинний код. JIT дозволяє «запам’ятати» й компілювати заздалегідь найчастіше використовувані частини коду, щоб запускати їх набагато швидше. Це часто називають гібридним підходом.

Спочатку Python-код інтерпретується як зазвичай (через CPython VM). Але, «гарячі» ділянки коду (hot paths), які виконуються часто, збираються, аналізуються і JIT-компілюються в нативний машинний код.

В результаті цей процес суттєво підвищує швидкодію без втрати динамічності мови.

Зважаючи на експериментальність у Python 3.13, JIT вимкнений за замовчуванням, щоб уникнути впливу на стабільність. Втім, для його увімкнення потрібна лише команда --enable-jit.

Розширені error-повідомлення

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

Це покращення побудоване на новій підсистемі аналізу помилок у CPython, що використовує приблизні порівняння назв і контекст виконання, щоб генерувати ймовірні варіанти.

Контекстуальні підказки Did you mean…?

Раніше, щойно ви припустилися помилки, error-повідомлення було таким: 

>>> pritn("Hello")

NameError: name 'pritn' is not defined

З 3.13 такі повідомлення розширили контекстуальним доповненням Did you mean…?. Тепер, якщо в коді помилка, ви отримаєте розширену підказку:

>>> pritn("Hello")

NameError: name 'pritn' is not defined. Did you mean: print?

Ця фіча працює у кількох випадках:

  • за орфографічних помилок у ключових словах;
  • за помилок у назвах модулів під час імпорту;
  • за неправильно написаних назв функцій/змінних.

Покращені аргументи функцій

Python тепер розуміє і пропонує виправлення для аргументів, які передані неправильно. Це особливо корисно під час роботи з бібліотеками з великою кількістю параметрів, на кшталт Dynamic Link Library. Наприклад, раніше це було так:

​​>>> def greet(name, greeting="Hello"):

...     print(f"{greeting}, {name}!")

>>> greet("Alice", greetnig="Hi")

TypeError: greet() got an unexpected keyword argument 'greetnig'

У новій версії Python розпізнає помилки в написанні параметрів і пропонує виправлення:

TypeError: greet() got an unexpected keyword argument 'greetnig'. Did you mean: greeting?

Підказки під час імпортування

Коли ви намагаєтесь імпортувати модуль чи обʼєкт, якого не існує, Python тепер намагається зрозуміти, що саме ви мали на увазі, та дає підказку. Раніше, до прикладу, він видавав лише помилку. 

>>> from math import squarerooot

ImportError: cannot import name 'squarerooot' from 'math'

Зараз показує помилку й підказує, що саме ви могли мати на увазі:

ImportError: cannot import name 'squarerooot' from 'math'. Did you mean: sqrt?
Ще статті
Порівнюємо швидкість, якість і відповідальність за результат